¡Ciertamente! Extraño, ya que nunca antes había oído hablar de Gemfile ni de Gemfile.lock. Pero teniendo 20 foros más para repetir la instalación (suspiro), resulta que todo comenzó con un problema diferente durante la instalación, donde las quejas terminaron con una recomendación de intentar eliminar Gemfile.lock:
Bundler encontró requisitos conflictivos para la versión de Ruby:
En Gemfile:
actionmailer (= 7.0.4.3) se resolvió a 7.0.4.3, que depende de
Ruby (>= 2.7.0)
sassc-rails se resolvió a 2.1.2, que depende de
sprockets-rails se resolvió a 3.4.2, que depende de
Ruby (>= 2.5)
json se resolvió a 2.6.3, que depende de
Ruby (>= 2.3)
json_schemer se resolvió a 0.2.23, que depende de
ecma-re-validator (~> 0.3) se resolvió a 0.4.0, que depende de
Ruby (>= 2.6, < 4.0)
rspec se resolvió a 3.12.0, que depende de
rspec-expectations (~> 3.12.0) se resolvió a 3.12.2, que depende de
diff-lcs (>= 1.2.0, < 2.0) se resolvió a 1.5.0, que depende de
Ruby (>= 1.8)
web-push se resolvió a 3.0.0, que depende de
Ruby (>= 3.0)
Versión actual de Ruby:
Ruby (= 2.7.6)
Bundler no pudo encontrar versiones compatibles para el gem "hkdf":
En snapshot (Gemfile.lock):
hkdf (= 1.0.0)
En Gemfile:
web-push se resolvió a 1.0.0, que depende de
hkdf (~> 0.2)
Eliminar tu archivo Gemfile.lock y ejecutar `bundle install` reconstruirá tu
snapshot desde cero, usando solo
los gems en tu Gemfile, lo que puede resolver el conflicto.
Así que, superé ese error inicial después de eliminar el archivo de bloqueo según lo sugerido, y luego me encontré con el NameError: undefined method ‘call’ descrito anteriormente. Lo solucioné fijando la versión de redis. Luego, todo funcionó.
Por lo tanto, mi script se modificó para a) eliminar Gemfile.lock (debido al error citado anteriormente) y b) cambiar automáticamente Gemfile para fijar redis en 4.8.0. Todo bien… pensé. ¡Esto funcionó en tres de las 20 máquinas “idénticas”! Las demás presentaron este nuevo error:
[discourse@in3020-discourse discourse]$ cd $INSTA; RAILS_ENV=production /usr/local/bin/bundle exec rake db:migrate # cargando muchas cosas en la base de datos
rake abortado!
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)
Lo cual fue realmente, realmente extraño porque los archivos /var/discourse/config/initializers/100-sidekiq.rb eran idénticos en todas las máquinas, y ciertamente no contenían ‘logger=’, sino una declaración ‘logger = …’.
Finalmente descubrí que en las máquinas donde funcionó, /usr/local/bin/bundle era la versión 2.3.20, no la 2.3.26 como en las máquinas donde falló. Así que, en resumen, agregar esto antes del comando de instalación para discourse hizo el truco para mí (no fue suficiente hacer el anclaje de bundler en los comandos 2.3.20 después de la instalación de bundler de discourse, tuvo que ser antes):
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
Por qué demonios algunas de esas máquinas tenían bundler 2.3.26 y otras tenían 2.3.20, no tengo ni idea… pero probablemente no sea tu culpa
.