Elastic Beanstalk:找不到具有可执行包(Gem :: GemNotFoundException)的gem bundler(> = 0.a)

时间:2019-03-26 15:09:00

标签: ruby-on-rails ruby amazon-web-services rubygems amazon-elastic-beanstalk

此错误消息是众所周知的错误消息。 (例如,请参见https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html。)尽管我通过带有Ruby 2.6.1和bundler 2.0.1的新Elastic Beanstalk应用程序来获得它。错误是:

  /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.

(即在AppDeployPreHook脚本的bundle install命令中)。有关PlatformHooks的参考,请参见https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/custom-platform-hooks.html

我非常确定,如果我可以确保所使用的捆绑器版本至少为2.0.0,那么不会有问题。尽管我不知道如何轻松指定。目前,我正在将服务器切换到/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,因此感觉有点像黑客。有更合适的解决方法吗?

4 个答案:

答案 0 :(得分:4)

因此,这是上述问题的程序化解决方案。在.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。我是很难学到的!

答案 1 :(得分:1)

这是一个可以在新的 Amazon Linux 2 平台版本上使用的版本,因为旧的 /opt/elasticbeanstalk/hooks/ 文件夹已完全停止使用。它从 Gemfile.lock 中解析出打包器版本

此脚本将进入 .platform/hooks/prebuild/01_install_app_bundler.sh,需要将其标记为可执行文件,否则会因权限问题而失败 (chmod +x 01_install_app_bundler.sh)

#!/usr/bin/env bash

# Load environment data
EB_APP_STAGING_DIR=$(/opt/elasticbeanstalk/bin/get-config platformconfig -k AppStagingDir)
EB_APP_USER=$(/opt/elasticbeanstalk/bin/get-config platformconfig -k AppUser)
EB_APP_DEPLOY_DIR=$(/opt/elasticbeanstalk/bin/get-config platformconfig -k AppDeployDir)

# Set up correct environment
export $(cat /opt/elasticbeanstalk/deployment/env | xargs)

BUNLDER_VER_TO_INSTALL=$(grep -A 1 "BUNDLED WITH" Gemfile.lock | tail -n1 | tr -d ' ')

echo "Installing bundler $BUNLDER_VER_TO_INSTALL"
gem install bundler -v $BUNLDER_VER_TO_INSTALL

我在那里留下了一些未使用的 EB_ 变量,只是为了展示如何在更新的平台上确定它们。

答案 2 :(得分:0)

我只有在找到一种替代的(也许更容易的)解决方案后才看到这篇文章:将bundler降级到1.17.3(gem unistall bundler之后是gem install bundler -v 1.17.3

答案 3 :(得分:0)

您需要使用生成锁文件的捆绑软件的正确版本。要找出该版本,请使用以下命令

$ cat Gemfile.lock | grep -A 1 "BUNDLED WITH"
BUNDLED WITH
   1.17.3