Elastic Beanstalk: не удается найти сборщик гемов (> = 0.a) с исполняемым комплектом (Gem :: GemNotFoundException) - PullRequest
4 голосов
/ 26 марта 2019

Это сообщение об ошибке является хорошо известным сообщением об ошибке. (см., например, https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html.) Хотя я получаю его с новым приложением Elastic Beanstalk с Ruby 2.6.1 и пакетом 2.0.1. Ошибка:

  /opt/rubies/ruby-2.6.1/lib/ruby/site_ruby/2.6.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
from /opt/rubies/ruby-2.6.1/lib/ruby/site_ruby/2.6.0/rubygems.rb:308:in `activate_bin_path'
from /opt/rubies/ruby-2.6.1/bin/bundle:23:in `<main>' (ElasticBeanstalk::ExternalInvocationError)

Я попытался поместить следующий файл: 01_install_bundler.config в папку .ebextensions:

container_commands:
  01_install_bundler:
    command: "gem install bundler —-version 2.0.1"

Хотя это никогда не запускается, потому что, если я посмотрю на вышеуказанную ошибку, я вижу, что это происходит в этот момент процесса развертывания:

.../AppDeployStage0/AppDeployPreHook/10_bundle_install.sh] : Activity failed.

(т. Е. Во время команды bundle install сценария AppDeployPreHook). См. https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/custom-platform-hooks.html для ссылки на PlatformHooks.

Я вполне уверен, что если я смогу убедиться, что используемая версия компоновщика имеет версию не ниже 2.0.0, то проблем не будет. Хотя я не знаю, как я могу это легко указать. На данный момент я ssh'ing к серверу на /opt/elasticbeanstalk/hooks/appdeploy/pre/, чтобы редактировать и возиться со сценариями. Хотя мне, очевидно, нужен автоматизированный, повторяемый способ сделать это.

Обидно, что ruby ​​2.6.1 по умолчанию не выбирает версию 2.0.0. Есть идеи?

==============================

Обновление:

Если я отредактирую файл /opt/elasticbeanstalk/hooks/appdeploy/pre/10_bundle_install.sh

if [ -f Gemfile ]; then
  echo "running 'bundle install' with Gemfile:"
  cat Gemfile

  +++ gem install bundler +++
  if [ -d $EB_APP_STAGING_DIR/vendor/cache ]; then
    bundle install --local
  else
    bundle install
  fi
else
  echo "no Gemfile found! Skipping bundle install stage!"
fi

и добавьте gem install bundler (без плюсов), тогда это решит проблему, поскольку установит самый последний бандлер, то есть 2.0.1. Для тех, кто хочет знать взлом, команды были:

eb ssh

sudo -i

cd /opt/elasticbeanstalk/hooks/appdeploy/pre

vim 10_bundle_install.sh

Проблема с этим решением в том, что он выглядит как хак, потому что он не использует .ebextensions. Есть ли более правильный способ исправить это?

Ответы [ 2 ]

7 голосов
/ 27 марта 2019

Итак, вот программное решение вышеуказанной проблемы. Создайте файл ниже под .ebextensions/gem_install_bundler.config:

files:
  # Runs before `./10_bundle_install.sh`:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/09_gem_install_bundler.sh" :
    mode: "000775"
    owner: root
    group: users
    content: |
      #!/usr/bin/env bash

      EB_APP_STAGING_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir)
      EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
      # Source the application's ruby, i.e. 2.6. Otherwise it will be 2.3, which will give this error: `bundler requires Ruby version >= 2.3.0` 
      . $EB_SCRIPT_DIR/use-app-ruby.sh

      cd $EB_APP_STAGING_DIR
      echo "Installing compatible bundler"
      gem install bundler -v 2.0.1

Затем, когда вы в следующий раз eb deploy, пакет будет обновлен до версии 2.0.1, и вы больше не получите вышеуказанную ошибку.

Больше информации в документации здесь:

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/custom-platform-hooks.html

и здесь:

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#linux-files

Последнее примечание: убедитесь, что вы либо зафиксировали эти изменения перед запуском eb deploy, либо подготовили их и запустили eb deploy --staged. Смотрите: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb3-cli-git.html. Я научился этому нелегко!

0 голосов
/ 09 июня 2019

Я только что увидел этот пост после того, как нашел альтернативное (возможно, более простое) решение: обновление пакета до 1.17.3 (gem unistall bundler, затем gem install bundler -v 1.17.3)

...