web-dev-qa-db-fra.com

Elastic Beanstalk: impossible de trouver un bundle de gemmes (> = 0.a) avec un bundle exécutable (Gem :: GemNotFoundException)

Ce message d'erreur est un message d'erreur bien connu. (voir https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html par exemple.) Bien que je l'obtienne avec une nouvelle application Elastic Beanstalk avec Ruby 2.6.1 et bundler 2.0.1. L'erreur est:

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

J'ai essayé de mettre le fichier suivant: 01_install_bundler.config dans le .ebextensions dossier:

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

Bien que cela ne soit jamais exécuté parce que si je regarde l'erreur ci-dessus, je peux voir que cela se produit à ce stade du processus de déploiement:

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

(c'est-à-dire pendant le bundle install commande d'un script AppDeployPreHook). Voir https://docs.aws.Amazon.com/elasticbeanstalk/latest/dg/custom-platform-hooks.html pour la référence de PlatformHooks.

Je suis presque sûr que si je peux m'assurer que la version du bundler utilisé est au moins la version 2.0.0, alors il n'y aura pas de problème. Bien que je ne sache pas comment spécifier cela facilement. En ce moment, je vais au serveur pour /opt/elasticbeanstalk/hooks/appdeploy/pre/ pour éditer et jouer avec les scripts. Bien que j'aie évidemment besoin d'une manière automatisée et reproductible de le faire.

Il est frustrant que Ruby 2.6.1 ne choisit pas le bundler version 2.0.0 par défaut. Des idées?

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

Mettre à jour:

Si je modifie le fichier /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

et ajoutez le gem install bundler (sans les avantages), cela résout le problème car il installe le dernier bundler, qui est 2.0.1. Pour ceux qui veulent connaître le hack, les commandes étaient:

eb ssh

Sudo -i

cd /opt/elasticbeanstalk/hooks/appdeploy/pre

vim 10_bundle_install.sh

Le problème avec cette solution est qu'elle se sent un peu comme un hack car elle n'utilise pas .ebextensions. Existe-t-il un moyen plus approprié de résoudre ce problème?

11
stwr667

Vous avez besoin de la version correcte du bundle avec lequel le fichier de verrouillage a été généré. Pour connaître cette version, utilisez la commande suivante

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