From 764a66808c42cf57c7496d35bb2b0363bd728127 Mon Sep 17 00:00:00 2001 From: nikhil2611 Date: Mon, 23 Sep 2024 16:50:03 +0530 Subject: [PATCH] updated plan.sh Signed-off-by: nikhil2611 --- habitat/plan.sh | 171 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 127 insertions(+), 44 deletions(-) diff --git a/habitat/plan.sh b/habitat/plan.sh index cb2af34..94fe4b9 100644 --- a/habitat/plan.sh +++ b/habitat/plan.sh @@ -1,76 +1,159 @@ +_chef_client_ruby="core/ruby31" pkg_name=chef-vault -pkg_origin=core -pkg_version="4.1.12" +pkg_origin=ngupta26 pkg_description="Gem that allows you to encrypt a Chef Data Bag Item using the public keys of a list of chef nodes. This allows only those chef nodes to decrypt the encrypted values." pkg_license=('Apache-2.0') -pkg_deps=( - core/ruby31 - core/bash - core/git +pkg_bin_dirs=( + bin + vendor/bin ) pkg_build_deps=( - core/gcc core/make + core/gcc + core/git + core/libarchive +) +pkg_deps=( + $_chef_client_ruby + core/coreutils ) -pkg_bin_dirs=(bin) +pkg_svc_user=root + +pkg_version() { + cat "${SRC_PATH}/VERSION" +} + +do_before() { + do_default_before + update_pkg_version + # We must wait until we update the pkg_version to use the pkg_version + pkg_filename="${pkg_name}-${pkg_version}.tar.gz" +} + +do_download() { + build_line "Locally creating archive of latest repository commit at ${HAB_CACHE_SRC_PATH}/${pkg_filename}" + # source is in this repo, so we're going to create an archive from the + # appropriate path within the repo and place the generated tarball in the + # location expected by do_unpack + ( cd "${SRC_PATH}" || exit_with "unable to enter hab-src directory" 1 + git archive --prefix="${pkg_name}-${pkg_version}/" --output="${HAB_CACHE_SRC_PATH}/${pkg_filename}" HEAD + ) +} + +do_verify() { + build_line "Skipping checksum verification on the archive we just created." + return 0 +} # 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" + push_runtime_env GEM_PATH "${pkg_prefix}/vendor" + + set_runtime_env APPBUNDLER_ALLOW_RVM "true" # prevent appbundler from clearing out the carefully constructed runtime GEM_PATH + set_runtime_env LANG "en_US.UTF-8" + set_runtime_env LC_CTYPE "en_US.UTF-8" } -# 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/" +do_prepare() { + export GEM_HOME="${pkg_prefix}/vendor" + export CPPFLAGS="${CPPFLAGS} ${CFLAGS}" + + ( cd "$CACHE_PATH" + bundle config --local jobs "$(nproc)" + bundle config --local without server docgen maintenance pry travis integration ci chefstyle + bundle config --local shebang "$(pkg_path_for "$_chef_client_ruby")/bin/ruby" + bundle config --local retry 5 + bundle config --local silence_root_warning 1 + ) + + 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 } +# 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/" +# } + # 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 chef-vault.gemspec - popd > /dev/null + ( cd "$CACHE_PATH" || exit_with "unable to enter hab-cache directory" 1 + build_line "Installing gem dependencies ..." + bundle install --jobs=3 --retry=3 + build_line "Installing gems from git repos properly ..." + build_line "Installing this project's gems ..." + bundle exec rake install:local + gem install chef-utils chef-config appbundler + ) } # 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 chef-vault-*.gem --no-document - popd > /dev/null + ( cd "$pkg_prefix" || exit_with "unable to enter pkg prefix directory" 1 + export BUNDLE_GEMFILE="${CACHE_PATH}/Gemfile" + build_line "** fixing binstub shebangs" + fix_interpreter "${pkg_prefix}/vendor/bin/*" "$_chef_client_ruby" bin/ruby + export BUNDLE_GEMFILE="${CACHE_PATH}/Gemfile" + for gem in chef-vault; do + build_line "** generating binstubs for $gem with precise version pins" + appbundler $CACHE_PATH $pkg_prefix/bin $gem + done + ) +} + +do_after() { + build_line "Trimming the fat ..." + + # We don't need the cache of downloaded .gem files ... + rm -rf "$pkg_prefix/vendor/cache" - wrap_chef_vault_bin + rm -r "$pkg_prefix/vendor/bundler" + + # We don't need the gem docs. + rm -rf "$pkg_prefix/vendor/doc" + # We don't need to ship the test suites for every gem dependency, + # only Chef's for package verification. + find "$pkg_prefix/vendor/gems" -name spec -type d | grep -v "chef-vault-${pkg_version}" \ + | while read spec_dir; do rm -rf "$spec_dir"; done } + # Create a wrapper script to properly set paths and execute the chef-vault command -wrap_chef_vault_bin() { - local bin="$pkg_prefix/bin/chef-vault" - local real_bin="$GEM_HOME/gems/chef-vault-${pkg_version}/bin/chef-vault" - build_line "Adding wrapper $bin to $real_bin" +# wrap_chef_vault_bin() { +# local bin="$pkg_prefix/bin/chef-vault" +# local real_bin="$GEM_HOME/gems/chef-vault-${pkg_version}/bin/chef-vault" +# build_line "Adding wrapper $bin to $real_bin" + +# # build_line "Creating wrapper script: $bin" +# cat < "$bin" +# #!$(pkg_path_for core/bash)/bin/bash +# set -e -# build_line "Creating wrapper script: $bin" - cat < "$bin" -#!$(pkg_path_for core/bash)/bin/bash -set -e +# # Set the PATH for chef-vault to include necessary binaries +# export PATH="/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:\$PATH" -# Set the PATH for chef-vault to include necessary 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" -# Set Ruby paths defined from 'do_setup_environment()' -export GEM_HOME="$GEM_HOME" -export GEM_PATH="$GEM_PATH" +# # Execute the chef-vault binary +# exec $(pkg_path_for core/ruby31)/bin/ruby $real_bin "\$@" +# EOF -# Execute the chef-vault binary -exec $(pkg_path_for core/ruby31)/bin/ruby $real_bin "\$@" -EOF +# # Ensure the wrapper script is executable +# chmod -v 755 "$bin" +# } - # Ensure the wrapper script is executable - chmod -v 755 "$bin" +do_end() { + if [ "$(readlink /usr/bin/env)" = "$(pkg_interpreter_for core/coreutils bin/env)" ]; then + build_line "Removing the symlink we created for '/usr/bin/env'" + rm /usr/bin/env + fi } # No additional stripping needed