diff --git a/.expeditor/build.habitat.yml b/.expeditor/build.habitat.yml new file mode 100644 index 0000000..72ea256 --- /dev/null +++ b/.expeditor/build.habitat.yml @@ -0,0 +1,9 @@ +--- +origin: chef + +expeditor: + defaults: + buildkite: + retry: + automatic: + limit: 1 diff --git a/.expeditor/buildkite/artifact.habitat.test.ps1 b/.expeditor/buildkite/artifact.habitat.test.ps1 new file mode 100755 index 0000000..839c450 --- /dev/null +++ b/.expeditor/buildkite/artifact.habitat.test.ps1 @@ -0,0 +1,86 @@ +#!/usr/bin/env powershell + +#Requires -Version 5 +# https://stackoverflow.com/questions/9948517 +# TODO: Set-StrictMode -Version Latest +$PSDefaultParameterValues['*:ErrorAction']='Stop' +$ErrorActionPreference = 'Stop' +$env:HAB_BLDR_CHANNEL = "LTS-2024" +$env:HAB_ORIGIN = 'ci' +$env:CHEF_LICENSE = 'accept-no-persist' +$env:HAB_LICENSE = 'accept-no-persist' +$Plan = 'fauxhai' + +Write-Host "--- system details" +$Properties = 'Caption', 'CSName', 'Version', 'BuildType', 'OSArchitecture' +Get-CimInstance Win32_OperatingSystem | Select-Object $Properties | Format-Table -AutoSize + +Write-Host "--- Installing the version of Habitat required" + +function Stop-HabProcess { + $habProcess = Get-Process hab -ErrorAction SilentlyContinue + if ($habProcess) { + Write-Host "Stopping hab process..." + Stop-Process -Name hab -Force + } +} + +# Installing Habitat +function Install-Habitat { + Write-Host "Downloading and installing Habitat..." + Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/habitat-sh/habitat/main/components/hab/install.ps1')) +} + +try { + hab --version +} +catch { + Set-ExecutionPolicy Bypass -Scope Process -Force + + Stop-HabProcess + + # Remove the existing hab.exe if it exists and if you have permissions + $habPath = "C:\ProgramData\Habitat\hab.exe" + if (Test-Path $habPath) { + Write-Host "Attempting to remove existing hab.exe..." + Remove-Item $habPath -Force -ErrorAction SilentlyContinue + if (Test-Path $habPath) { + Write-Host "Failed to remove hab.exe, re-running script with elevated permissions." + Start-Process powershell -Verb runAs -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" + exit + } + } + + Install-Habitat +} +finally { + Write-Host ":habicat: I think I have the version I need to build." +} + + +Write-Host "--- Generating fake origin key" +hab origin key generate $env:HAB_ORIGIN + +Write-Host "--- Building $Plan" +$project_root = "$(git rev-parse --show-toplevel)" +Set-Location $project_root + +$env:DO_CHECK=$true; hab pkg build . + +. $project_root/results/last_build.ps1 + +Write-Host "--- Installing $pkg_ident/$pkg_artifact" +hab pkg install -b $project_root/results/$pkg_artifact + +Write-Host "+++ Testing $Plan" + +Push-Location $project_root + +try { + Write-Host "Running unit tests..." + habitat/tests/test.ps1 $pkg_ident +} +finally { + # Ensure we always return to the original directory + Pop-Location +} \ No newline at end of file diff --git a/.expeditor/buildkite/artifact.habitat.test.sh b/.expeditor/buildkite/artifact.habitat.test.sh new file mode 100755 index 0000000..e4f1afc --- /dev/null +++ b/.expeditor/buildkite/artifact.habitat.test.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +set -eo pipefail + +export HAB_ORIGIN='ci' +export PLAN='fauxhai' +export CHEF_LICENSE="accept-no-persist" +export HAB_LICENSE="accept-no-persist" +export HAB_BLDR_CHANNEL="LTS-2024" + +echo "--- checking if git is installed" +if ! command -v git &> /dev/null; then + echo "Git is not installed. Installing Git..." + sudo yum install -y git +else + echo "Git is already installed." + git --version +fi + +echo "--- add an exception for this directory since detected dubious ownership in repository at /workdir" +git config --global --add safe.directory /workdir + +echo "--- git status for this workdir" +git status + +echo "--- ruby version" +ruby -v + +export project_root="$(git rev-parse --show-toplevel)" +echo "The value for project_root is: $project_root" + +export HAB_NONINTERACTIVE=true +export HAB_NOCOLORING=true +export HAB_STUDIO_SECRET_HAB_NONINTERACTIVE=true + +echo "--- system details" +uname -a + +echo "--- Installing Habitat" +id -a +curl https://raw.githubusercontent.com/habitat-sh/habitat/main/components/hab/install.sh | bash + +echo "--- :key: Generating fake origin key" +hab origin key generate "$HAB_ORIGIN" + + +echo "--- Building $PLAN" +cd "$project_root" +DO_CHECK=true hab pkg build . + +echo "--- Sourcing 'results/last_build.sh'" +if [ -f ./results/last_build.env ]; then + cat ./results/last_build.env + . ./results/last_build.env + export pkg_artifact +fi +echo "+++ Installing ${pkg_ident:?is undefined}" +echo "++++" +echo $project_root +echo "+++" +hab pkg install -b "${project_root:?is undefined}/results/${pkg_artifact:?is undefined}" + +echo "+++ Testing $PLAN" + +PATH="$(hab pkg path ci/fauxhai)/bin:$PATH" +export PATH +echo "PATH is $PATH" + +echo "--- :mag_right: Testing $PLAN" +${project_root}/habitat/tests/test.sh "$pkg_ident" || error 'failures during test of executables' \ No newline at end of file diff --git a/.expeditor/config.yml b/.expeditor/config.yml index 023c553..d38825a 100644 --- a/.expeditor/config.yml +++ b/.expeditor/config.yml @@ -8,7 +8,12 @@ slack: # This publish is triggered by the `built_in:publish_rubygems` artifact_action. rubygems: - fauxhai-chef - + +release_branches: + - workstation-LTS: + version_constraint: 9.* + - main: + version_constraint: 9.* github: # This deletes the GitHub PR branch after successfully merged into the release branch delete_branch_on_merge: true @@ -40,10 +45,24 @@ subscriptions: - "Expeditor: Skip All" - built_in:build_gem: only_if: built_in:bump_version + - trigger_pipeline:habitat/publish: + only_if: built_in:bump_version + ignore_labels: + - "Expeditor: Skip Habitat" + - "Expeditor: Skip All" + - trigger_pipeline:habitat/test: + only_if: built_in:bump_version + ignore_labels: + - "Expeditor: Skip Habitat" + - "Expeditor: Skip All" - workload: project_promoted:{{agent_id}}:* actions: - built_in:rollover_changelog - built_in:publish_rubygems + - workload: buildkite_hab_build_group_published:{{agent_id}}:* + actions: + # when all of the hab package publish to the unstable channel, test and promote them + - trigger_pipeline:habitat/test pipelines: - verify: diff --git a/.expeditor/habitat-test.pipeline.yml b/.expeditor/habitat-test.pipeline.yml new file mode 100644 index 0000000..86df807 --- /dev/null +++ b/.expeditor/habitat-test.pipeline.yml @@ -0,0 +1,36 @@ +--- +expeditor: + defaults: + buildkite: + timeout_in_minutes: 30 + retry: + automatic: + limit: 1 + + +steps: + + - label: ":linux: Validate Habitat Builds of fauxhai" + commands: + - .expeditor/buildkite/artifact.habitat.test.sh + expeditor: + executor: + docker: + image: ruby:3.1 + privileged: true + + - label: ":windows: Validate Habitat Builds of fauxhai" + commands: + - .expeditor/buildkite/artifact.habitat.test.ps1 + expeditor: + executor: + docker: + host_os: windows + shell: ["powershell", "-Command"] + image: rubydistros/windows-2019:3.1 + user: 'NT AUTHORITY\SYSTEM' + environment: + - FORCE_FFI_YAJL=ext + - EXPIRE_CACHE=true + - CHEF_LICENSE=accept-no-persist + - CHEF_LICENSE_SERVER=http://hosted-license-service-lb-8000-606952349.us-west-2.elb.amazonaws.com:8000/ diff --git a/habitat/plan.sh b/habitat/plan.sh index e96dbc6..c77729c 100644 --- a/habitat/plan.sh +++ b/habitat/plan.sh @@ -1,84 +1,74 @@ +export HAB_BLDR_CHANNEL="LTS-2024" pkg_name=fauxhai -pkg_origin=core +pkg_origin=chef +ruby_pkg="core/ruby3_1" pkg_description="Easily mock full ohai data" -pkg_license=('Apache-2.0') -pkg_deps=( - core/ruby31 - core/bash -) +pkg_deps=(${ruby_pkg} core/coreutils) pkg_build_deps=( - core/gcc - core/make -) + core/make + core/sed + core/gcc + core/libarchive + ) pkg_bin_dirs=(bin) +do_setup_environment() { + build_line 'Setting GEM_HOME="$pkg_prefix/vendor"' + export GEM_HOME="$pkg_prefix/vendor" + + build_line "Setting GEM_PATH=$GEM_HOME" + export GEM_PATH="$GEM_HOME" +} pkg_version() { cat "$SRC_PATH/VERSION" } - do_before() { update_pkg_version } - -# Setup environment variables for Ruby Gems -do_setup_environment() { - build_line "Setting up GEM_HOME and GEM_PATH" - export GEM_HOME="$pkg_prefix/lib" - export GEM_PATH="$GEM_HOME" -} - -# Unpack the source files into the cache directory do_unpack() { - local unpack_dir="$HAB_CACHE_SRC_PATH/$pkg_dirname" - build_line "Creating unpack directory: $unpack_dir" - mkdir -pv "$unpack_dir" - cp -RT "$PLAN_CONTEXT"/.. "$unpack_dir/" + mkdir -pv "$HAB_CACHE_SRC_PATH/$pkg_dirname" + cp -RT "$PLAN_CONTEXT"/.. "$HAB_CACHE_SRC_PATH/$pkg_dirname/" } - -# Build the gem from the gemspec file do_build() { - build_line "Building the gem from the gemspec file" - pushd "$HAB_CACHE_SRC_PATH/$pkg_dirname" > /dev/null - gem build fauxhai-chef.gemspec - popd > /dev/null -} -# Install the built gem into the package directory -do_install() { - build_line "Installing the gem" - pushd "$HAB_CACHE_SRC_PATH/$pkg_dirname" > /dev/null - gem install fauxhai-*.gem --no-document - popd > /dev/null + export GEM_HOME="$pkg_prefix/vendor" - wrap_fauxhai_bin + build_line "Setting GEM_PATH=$GEM_HOME" + export GEM_PATH="$GEM_HOME" + bundle config --local without integration deploy maintenance + bundle config --local jobs 4 + bundle config --local retry 5 + bundle config --local silence_root_warning 1 + bundle install + gem build fauxhai-chef.gemspec } +do_install() { + export GEM_HOME="$pkg_prefix/vendor" -# Create a wrapper script to properly set paths and execute the fauxhai command -wrap_fauxhai_bin() { + build_line "Setting GEM_PATH=$GEM_HOME" + export GEM_PATH="$GEM_HOME" + gem install fauxhai-*.gem --no-document + set_runtime_env "GEM_PATH" "${pkg_prefix}/vendor" + wrap_ruby_bin +} +wrap_ruby_bin() { local bin="$pkg_prefix/bin/$pkg_name" local real_bin="$GEM_HOME/gems/fauxhai-chef-${pkg_version}/bin/fauxhai" - - build_line "Creating wrapper script: $bin" + build_line "Adding wrapper $bin to $real_bin" cat < "$bin" #!$(pkg_path_for core/bash)/bin/bash set -e - -# Set the PATH for Fauxhai to include necessary binaries +# Set binary path that allows InSpec to use non-Hab pkg binaries export PATH="/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:\$PATH" - # Set Ruby paths defined from 'do_setup_environment()' -export GEM_HOME="$GEM_HOME" -export GEM_PATH="$GEM_PATH" - -# Execute the Fauxhai binary -exec $(pkg_path_for core/ruby31)/bin/ruby $real_bin "\$@" + export GEM_HOME="$pkg_prefix/vendor" + export GEM_PATH="$GEM_PATH" +exec $(pkg_path_for ${ruby_pkg})/bin/ruby $real_bin \$@ EOF - - # Ensure the wrapper script is executable chmod -v 755 "$bin" } -# No additional stripping needed + do_strip() { return 0 -} +} \ No newline at end of file diff --git a/habitat/tests/test.ps1 b/habitat/tests/test.ps1 new file mode 100644 index 0000000..618a658 --- /dev/null +++ b/habitat/tests/test.ps1 @@ -0,0 +1,20 @@ +param ( + [Parameter()] + [string]$PackageIdentifier = $(throw "Usage: test.ps1 [test_pkg_ident] e.g. test.ps1 ci/user-windows/1.0.0/20190812103929") +) + + +Write-Host "--- :fire: Smokish test" +$version=hab pkg exec "${pkg_ident}" fauxhai -v +$actual_version=[Regex]::Match($version,"([0-9]+.[0-9]+.[0-9]+)").Value +$package_version=$PackageIdentifier.split("/",4)[2] + +Write-Host "package_version $package_version actual version $actual_version" +if ($package_version -eq $actual_version) +{ + Write "Fauxhai working fine" +} +else { + Write-Error "Fauxhai version not met expected $package_version actual version $actual_version " + throw "fauxhai windows pipeline not working for hab pkg" +} diff --git a/habitat/tests/test.sh b/habitat/tests/test.sh new file mode 100755 index 0000000..50195d5 --- /dev/null +++ b/habitat/tests/test.sh @@ -0,0 +1,23 @@ +set -euo pipefail + + +project_root="$(git rev-parse --show-toplevel)" +pkg_ident="$1" +# print error message followed by usage and exit +error () { + local message="$1" + + echo -e "\nERROR: ${message}\n" >&2 + + exit 1 +} + +[[ -n "$pkg_ident" ]] || error 'no hab package identity provided' + +package_version=$(awk -F / '{print $3}' <<<"$pkg_ident") + +cd "${project_root}" + +echo "--- :msg_right: Testing ${pkg_ident} executables" +actual_version=$(hab pkg exec "${pkg_ident}" fauxhai -v | sed -E 's/.*: ([0-9]+\.[0-9]+\.[0-9]+).*/\1/') +[[ "$package_version" = "$actual_version" ]] || error "Fauxhai version is not the expected version. Expected '$package_version', got '$actual_version'"