Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CHEF-14475- Updated plan.sh file to work with different hab packages #3282

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions config/software/installed_gems_as_json.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Print all the gems installed in the Chef Workstation omnibus as a JSON hash. This is
# stored in the root of the Chef Workstation install next to the `version-manifest.json`.

all_gems = {}

Gem::Specification.load_defaults
Gem::Specification.each do |spec|
all_gems[spec.name] ||= []
all_gems[spec.name] << spec.version.to_s
end

require "json"
j = JSON.pretty_generate(all_gems)

gem_home = Gem.paths.home
manifest_file = "#{gem_home}/gem-version-manifest.json"
File.open(manifest_file, "w") do |f|
f.write(j)
end
134 changes: 48 additions & 86 deletions habitat/plan.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,10 @@ ruby_pkg="core/ruby31"
pkg_build_deps=(
core/make
core/gcc
core/go
core/go22
core/gcc-libs
core/pkg-config
# We make this a build dependency since we are going to import
# the generated binary into our list of binaries.
# @afiune: Not sure if this is the right pattern but it works.
chef/chef-analyze
"${pkg_origin}/chef-analyze"
)
pkg_deps=(
core/glibc
Expand All @@ -32,6 +29,9 @@ pkg_deps=(
core/libarchive
core/coreutils
core/git
"${pkg_origin}/cookstyle"
"${pkg_origin}/berkshelf"
"${pkg_origin}/chef-cli"
)

pkg_version() {
Expand All @@ -48,24 +48,46 @@ do_verify() {
}

do_prepare() {
# Clear any existing GEM_PATH
unset GEM_PATH

# Set GEM_HOME and GEM_PATH
export GEM_HOME="$pkg_prefix/vendor"
export GEM_PATH="$GEM_HOME" # Initialize GEM_PATH to only GEM_HOME
export PATH="$GEM_HOME/bin:$PATH" # Add GEM_HOME/bin to PATH
export OPENSSL_LIB_DIR=$(pkg_path_for openssl)/lib
export OPENSSL_INCLUDE_DIR=$(pkg_path_for openssl)/include
export SSL_CERT_FILE=$(pkg_path_for cacerts)/ssl/cert.pem
export RUBY_ABI_VERSION=$(ls $(pkg_path_for ${ruby_pkg})/lib/ruby/gems)
export GOPROXY=https://proxy.golang.org,direct
build_line "Using Ruby ABI version '${RUBY_ABI_VERSION}'"

build_line "Setting link for /usr/bin/env to 'coreutils'"
if [ ! -f /usr/bin/env ]; then
ln -s "$(pkg_interpreter_for core/coreutils bin/env)" /usr/bin/env
fi

# Set the path for ruby from the core/ruby31 package
RUBY_PATH="$(hab pkg path core/ruby31)/bin/ruby"

# Check if the ruby executable exists
if [ -x "$RUBY_PATH" ]; then
# Create the symlink for ruby
ln -sf "$RUBY_PATH" /usr/bin/env
echo "Symlink created: /usr/bin/ruby -> $RUBY_PATH"
else
echo "Error: Ruby executable not found at $RUBY_PATH"
fi
}

do_build() {
export GEM_HOME
export GEM_PATH
# TODO this appears to give us no depsolver? What are the effects?
GEM_HOME="$pkg_prefix"
GEM_PATH="$(pkg_path_for bundler):${GEM_HOME}"
# Set up environment variables for the build
export GEM_HOME="$pkg_prefix"
export GEM_PATH="${GEM_HOME}"
export PATH="$PATH:/hab/pkgs/core/ruby31/3.1.6/20240912144513/bin"

# sed -i '1s|^.*|#!/hab/pkgs/core/ruby31/3.1.6/20240912144513/bin/ruby|' /hab/pkgs/ngupta26/cookstyle/7.32.11/20241006190955/vendor/bin/rspec


export NOKOGIRI_CONFIG
NOKOGIRI_CONFIG="--use-system-libraries \
Expand All @@ -79,84 +101,35 @@ do_build() {
bundle config --local build.nokogiri "$NOKOGIRI_CONFIG"
bundle config --local silence_root_warning 1
bundle config set --local without dep_selector
bundle install --no-deployment --jobs 10 --retry 5 --path "$pkg_prefix"
bundle config set --local without all

# Install the gems listed in the Gemfile

# bundle install --jobs 10 --retry 5 --path "$pkg_prefix"

ruby "${SRC_PATH}/components/gems/post-bundle-install.rb"
)

build_line "Building top-level 'chef' CMD wrapper"
( cd "${SRC_PATH}/components/main-chef-wrapper" || exit_with "unable to enter main-chef-wrapper directory" 1
CGO_ENABLED=0 go build -o "$pkg_prefix/bin/chef"
)

build_line "Creating gem-version-manifest........"
ruby "${SRC_PATH}/config/software/installed_gems_as_json.rb"
}

#######################################################
# !!! IMPORTANT REMINDER !!! #
#######################################################
# Any changes to plan.sh related to installed gems #
# (eg 'without' flags, additions/removals) must #
# also be updated in omnibus/config/software/gems.rb #
#######################################################

do_install() {
export ruby_bin_dir
ruby_bin_dir="$pkg_prefix/ruby-bin"

build_line "Creating bin directories"
mkdir -p "$ruby_bin_dir"

( cd "${SRC_PATH}/components/gems" || exit_with "unable to enter components/gems directory" 1
appbundle "chef-cli" "changelog,docs,debug"
wrap_ruby_bin "chef-cli"

appbundle "chef-bin" "docgen,chefstyle"
wrap_ruby_bin "chef-client"
wrap_ruby_bin "chef-solo"
wrap_ruby_bin "chef-resource-inspector"
wrap_ruby_bin "chef-shell"

appbundle "knife" "development"
wrap_ruby_bin "knife"
export GEM_HOME="$pkg_prefix"
export GEM_PATH="${GEM_HOME}"

appbundle "inspec-bin" "changelog,debug,docs,development"
wrap_ruby_bin "inspec"

appbundle ohai "changelog"
wrap_ruby_bin "ohai"

appbundle "chef_deprecations" "development,test"
wrap_ruby_bin "foodcritic"

appbundle "test-kitchen" "changelog,debug,docs,development"
wrap_ruby_bin "kitchen"

appbundle "berkshelf" "changelog,debug,docs,development"
wrap_ruby_bin "berks"

appbundle cookstyle "changelog,docs,profiling,rubocop_gems,development,debug"
wrap_ruby_bin "cookstyle"

appbundle "chef-vault" "changelog"
wrap_ruby_bin "chef-vault"

appbundle chef-apply "changelog,docs,debug" # really, chef-run
wrap_ruby_bin "chef-run"

appbundle mixlib-install "test,chefstyle,debug"
wrap_ruby_bin "mixlib-install"

appbundle fauxhai
wrap_ruby_bin "fauxhai"

appbundle chef-zero "pedant,development,debug"
wrap_ruby_bin "chef-zero"
)
build_line "Installing binaries from Habitat packages"

if [ "$(readlink /usr/bin/env)" = "$(pkg_interpreter_for core/coreutils bin/env)" ]; then
build_line "Removing the symlink created for '/usr/bin/env'"
rm /usr/bin/env
fi

build_line "Installing 'chef-analyze' binary"
cp "$(pkg_path_for chef-analyze)/bin/chef-analyze" "$pkg_prefix/bin"
}

appbundle() {
Expand All @@ -166,43 +139,32 @@ appbundle() {

do_end() {
do_default_end
# Don't leave this behind - our bundle options will create this
# owned by root, making it an annoying cleanup if you're also
# doing a 'bundle install' outside of hab.
rm -rf "${SRC_PATH}/components/gems/.bundle"
}

# Stubs
do_strip() {
return 0
}

# Copied from https://github.com/habitat-sh/core-plans/blob/f84832de42b300a64f1b38c54d659c4f6d303c95/bundler/plan.sh#L32
wrap_ruby_bin() {
local bin_basename
local real_cmd
local wrapper
bin_basename="$1"
real_cmd="$ruby_bin_dir/$bin_basename"
wrapper="$pkg_prefix/bin/$bin_basename"
local bin_basename="$1"
local real_cmd="$ruby_bin_dir/$bin_basename"
local wrapper="$pkg_prefix/bin/$bin_basename"

build_line "Adding wrapper for '$bin_basename': $wrapper -> $real_cmd"
cat <<EOF > "$wrapper"
#!$(pkg_interpreter_for core/bash bin/sh)
set -e
if test -n "\$DEBUG"; then set -x; fi
# Inform Chef-Workstation that is running from a habitat install
export HAB_WS_PATH="$pkg_prefix"
export HAB_WS_EMBEDDED_DIR="${ruby_bin_dir}:$(hab pkg path core/bundler):$(hab pkg path $ruby_pkg)/bin"

export GEM_HOME="$pkg_prefix/ruby/$RUBY_ABI_VERSION"
export GEM_PATH="$(pkg_path_for $ruby_pkg)/lib/ruby/gems/${RUBY_ABI_VERSION}:$(pkg_path_for core/bundler):${pkg_prefix}/ruby/${RUBY_ABI_VERSION}:${pkg_prefix}"
export SSL_CERT_FILE=$(pkg_path_for core/cacerts)/ssl/cert.pem

# Tell the appbundler bin not to reset GEM_HOME and GEM_PATH. Has nothing to do with RVM.
export APPBUNDLER_ALLOW_RVM=true
unset RUBYOPT GEMRC
exec $(pkg_path_for $ruby_pkg)/bin/ruby ${real_cmd} \$@
exec $(pkg_path_for $ruby_pkg)/bin/ruby ${real_cmd} "\$@"
EOF
chmod -v 755 "$wrapper"
Expand Down
Loading