Absolument ! Étrange, car je n’avais jamais entendu parler de Gemfile ni de Gemfile.lock auparavant. Mais en ayant 20 autres forums pour répéter l’installation (soupir), il s’avère que tout a commencé par un problème différent lors de l’installation où les plaintes se sont terminées par une recommandation d’essayer de supprimer le Gemfile.lock :
Bundler a trouvé des exigences conflictuelles pour la version de Ruby :
Dans Gemfile :
actionmailer (= 7.0.4.3) a été résolu en 7.0.4.3, qui dépend de
Ruby (>= 2.7.0)
sassc-rails a été résolu en 2.1.2, qui dépend de
sprockets-rails a été résolu en 3.4.2, qui dépend de
Ruby (>= 2.5)
json a été résolu en 2.6.3, qui dépend de
Ruby (>= 2.3)
json_schemer a été résolu en 0.2.23, qui dépend de
ecma-re-validator (~> 0.3) a été résolu en 0.4.0, qui dépend de
Ruby (>= 2.6, < 4.0)
rspec a été résolu en 3.12.0, qui dépend de
rspec-expectations (~> 3.12.0) a été résolu en 3.12.2, qui dépend de
diff-lcs (>= 1.2.0, < 2.0) a été résolu en 1.5.0, qui dépend de
Ruby (>= 1.8)
web-push a été résolu en 3.0.0, qui dépend de
Ruby (>= 3.0)
Version Ruby actuelle :
Ruby (= 2.7.6)
Bundler n'a pas pu trouver de versions compatibles pour le gem "hkdf" :
Dans snapshot (Gemfile.lock) :
hkdf (= 1.0.0)
Dans Gemfile :
web-push a été résolu en 1.0.0, qui dépend de
hkdf (~> 0.2)
La suppression de votre fichier Gemfile.lock et l'exécution de `bundle install` reconstruiront votre
snapshot à partir de zéro, en utilisant uniquement
les gems de votre Gemfile, ce qui peut résoudre le conflit.
J’ai donc résolu ce premier problème après avoir supprimé le fichier de verrouillage comme suggéré, puis j’ai rencontré le NameError : undefined method ‘call’ décrit précédemment. Je l’ai résolu en fixant la version de redis. Ensuite, tout a fonctionné.
Mon script a donc été modifié pour a) supprimer Gemfile.lock (en raison de l’erreur citée ci-dessus) et b) modifier automatiquement le Gemfile pour fixer redis à 4.8.0. Tout allait bien… pensais-je. Cela a fonctionné sur trois des 20 machines “identiques” ! Les autres ont rencontré cette nouvelle erreur :
[discourse@in3020-discourse discourse]$ cd $INSTA; RAILS_ENV=production /usr/local/bin/bundle exec rake db:migrate # stuffing a lot of stuff into the database
rake aborted!
NoMethodError: undefined method `logger=' for Sidekiq:Module
Did you mean? logger
/var/discourse/config/initializers/100-sidekiq.rb:58:in `<main>'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/engine.rb:667:in `load'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/engine.rb:667:in `block in load_config_initializer'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/lib/active_support/notifications.rb:208:in `instrument'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/engine.rb:666:in `load_config_initializer'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/engine.rb:620:in `block (2 levels) in <class:Engine>'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/engine.rb:619:in `each'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/engine.rb:619:in `block in <class:Engine>'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/initializable.rb:32:in `instance_exec'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/initializable.rb:32:in `run'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/initializable.rb:61:in `block in run_initializers'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/initializable.rb:50:in `each'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/initializable.rb:50:in `tsort_each_child'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/initializable.rb:60:in `run_initializers'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/application.rb:372:in `initialize!'
/var/discourse/config/environment.rb:7:in `<main>'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.16.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.16.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/zeitwerk-2.6.7/lib/zeitwerk/kernel.rb:38:in `require'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/application.rb:348:in `require_environment!'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/application.rb:511:in `block in run_tasks_blocks'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/cli.rb:486:in `exec'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/cli.rb:31:in `dispatch'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/cli.rb:25:in `start'
/usr/local/share/gems/gems/bundler-2.3.26/exe/bundle:48:in `block in <top (required)>'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/friendly_errors.rb:120:in `with_friendly_errors'
/usr/local/share/gems/gems/bundler-2.3.26/exe/bundle:36:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => db:migrate => db:load_config => environment
(See full trace by running task with --trace)
Ce qui était vraiment, vraiment étrange car les fichiers /var/discourse/config/initializers/100-sidekiq.rb étaient identiques sur toutes les machines, et ne contenaient certainement pas ‘logger=’, mais une déclaration ‘logger = …’.
J’ai finalement compris que sur les machines où cela fonctionnait, /usr/local/bin/bundle était la version 2.3.20, et non 2.3.26 comme sur les machines où cela échouait. Donc, en résumé, ajouter ceci avant la commande d’installation pour discourse a résolu le problème pour moi (il n’a pas suffi de fixer bundler à 2.3.20 après l’installation de bundler de discourse, cela devait être fait avant) :
rm Gemfile.lock
perl -pi.bak -e 's/gem \"redis\"/gem \"redis\",\"4.8.0\"/;' Gemfile
/usr/bin/gem uninstall bundler -v 2.3.26
/usr/bin/gem install bundler -v 2.3.20
RAILS_ENV=production /usr/local/bin/bundle install
RAILS_ENV=production /usr/local/bin/bundle exec rake db:migrate
RAILS_ENV=production /usr/local/bin/bundle exec rake assets:precompile
Pourquoi diable certaines de ces machines avaient-elles bundler 2.3.26 et d’autres 2.3.20, je n’en ai aucune idée… mais ce n’est probablement pas de votre faute
.