X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/bfb1c2befc24e5706ac2917e723aaf93638df886..0519cd0ce431545f1df993e48e976fbf7c99ade9:/build/rails-package-scripts/postinst.sh diff --git a/build/rails-package-scripts/postinst.sh b/build/rails-package-scripts/postinst.sh index 1d426baa73..8ac77ab001 100644 --- a/build/rails-package-scripts/postinst.sh +++ b/build/rails-package-scripts/postinst.sh @@ -158,31 +158,17 @@ configure_version() { fi if [ -e /etc/redhat-release ]; then - # Recognize any service that starts with "nginx"; e.g., nginx16. - if [ "$WEB_SERVICE" != "${WEB_SERVICE#nginx}" ]; then - WWW_OWNER=nginx - else - WWW_OWNER=apache - fi + case "$WEB_SERVICE" in + "") ;; + nginx*) WWW_OWNER=nginx ;; + *) WWW_OWNER=apache ;; + esac else # Assume we're on a Debian-based system for now. # Both Apache and Nginx run as www-data by default. WWW_OWNER=www-data fi - echo - echo "Assumption: $WEB_SERVICE is configured to serve Rails from" - echo " $RELEASE_PATH" - echo "Assumption: $WEB_SERVICE and passenger run as $WWW_OWNER" - echo - - echo -n "Creating symlinks to configuration in $CONFIG_PATH ..." - setup_confdirs /etc/arvados "$CONFIG_PATH" - setup_conffile environments/production.rb environments/production.rb.example \ - || true - setup_extra_conffiles - echo "... done." - # Before we do anything else, make sure some directories and files are in place if [ ! -e $SHARED_PATH/log ]; then mkdir -p $SHARED_PATH/log; fi if [ ! -e $RELEASE_PATH/tmp ]; then mkdir -p $RELEASE_PATH/tmp; fi @@ -192,18 +178,21 @@ configure_version() { cd "$RELEASE_PATH" export RAILS_ENV=production - # We install Bundler itself in the same place where Bundler will install - # bundled gems, for a few reasons: - # 1. Bundler will probably want to do this anyway to run itself with the - # specific version named in Gemfile.lock. - # 2. This is nicer to the sysadmin since we avoid messing with global state. - # 3. We can know exactly where the `bundle` command got installed. - local bundle_path="$SHARED_PATH/vendor_bundle" - export GEM_HOME="$bundle_path/ruby/$(ruby -e 'puts RUBY_VERSION')" - export GEM_PATH="$GEM_HOME" run_and_report "Installing bundler" gem install --conservative --version '~> 2.4.0' bundler - local bundle="$GEM_HOME/bin/bundle" + local ruby_minor_ver="$(ruby -e 'puts RUBY_VERSION.split(".")[..1].join(".")')" + local bundle="$(gem contents --version '~> 2.4.0' bundler | grep -E '/(bin|exe)/bundle$' | tail -n1)" + if ! [ -x "$bundle" ]; then + # Some distros (at least Ubuntu 24.04) append the Ruby version to the + # executable name, but that isn't reflected in the output of + # `gem contents`. Check for that version. + bundle="$bundle$ruby_minor_ver" + if ! [ -x "$bundle" ]; then + echo "Error: failed to find \`bundle\` command after installing bundler gem" >&2 + return 1 + fi + fi + local bundle_path="$SHARED_PATH/vendor_bundle" run_and_report "Running bundle config set --local path $SHARED_PATH/vendor_bundle" \ "$bundle" config set --local path "$bundle_path" @@ -212,32 +201,45 @@ configure_version() { # fail later. Work around this by installing all gems manually. find vendor/cache -maxdepth 1 -name '*.gem' -print0 \ | run_and_report "Installing bundle gems" xargs -0r \ - gem install --conservative --ignore-dependencies --local --quiet - # The earlier `bundle config` should have it looking for installed gems in - # the right place. Unset GEM_* now to be sure. - unset GEM_HOME GEM_PATH + gem install --conservative --ignore-dependencies --local --quiet \ + --install-dir="$bundle_path/ruby/$ruby_minor_ver.0" run_and_report "Running bundle install" "$bundle" install --prefer-local --quiet run_and_report "Verifying bundle is complete" "$bundle" exec true - echo -n "Ensuring directory and file permissions ..." - # Ensure correct ownership of a few files - chown "$WWW_OWNER:" $RELEASE_PATH/config/environment.rb - chown "$WWW_OWNER:" $RELEASE_PATH/config.ru - chown "$WWW_OWNER:" $RELEASE_PATH/Gemfile.lock - chown -R "$WWW_OWNER:" $RELEASE_PATH/tmp || true - chown -R "$WWW_OWNER:" $SHARED_PATH/log - # Make sure postgres doesn't try to use a pager. - export PAGER= - case "$RAILSPKG_DATABASE_LOAD_TASK" in - # db:structure:load was deprecated in Rails 6.1 and shouldn't be used. - db:schema:load | db:structure:load) - chown "$WWW_OWNER:" $RELEASE_PATH/db/schema.rb || true - chown "$WWW_OWNER:" $RELEASE_PATH/db/structure.sql || true - ;; - esac - chmod 644 $SHARED_PATH/log/* - chmod -R 2775 $RELEASE_PATH/tmp || true - echo "... done." + if [ -n "$WWW_OWNER" ]; then + cat <