Действительно странно, ведь я раньше никогда не слышал ни о Gemfile, ни о Gemfile.lock. Но поскольку мне предстояло повторить установку на 20 других серверах (вздох), оказалось, что всё началось с другой проблемы при установке, где жалобы заканчивались рекомендацией попробовать удалить Gemfile.lock:
Bundler found conflicting requirements for the Ruby version:
In Gemfile:
actionmailer (= 7.0.4.3) was resolved to 7.0.4.3, which depends on
Ruby (>= 2.7.0)
sassc-rails was resolved to 2.1.2, which depends on
sprockets-rails was resolved to 3.4.2, which depends on
Ruby (>= 2.5)
json was resolved to 2.6.3, which depends on
Ruby (>= 2.3)
:
:
:
json_schemer was resolved to 0.2.23, which depends on
ecma-re-validator (~> 0.3) was resolved to 0.4.0, which depends on
Ruby (>= 2.6, < 4.0)
rspec was resolved to 3.12.0, which depends on
rspec-expectations (~> 3.12.0) was resolved to 3.12.2, which depends on
diff-lcs (>= 1.2.0, < 2.0) was resolved to 1.5.0, which depends on
Ruby (>= 1.8)
web-push was resolved to 3.0.0, which depends on
Ruby (>= 3.0)
Current Ruby version:
Ruby (= 2.7.6)
Bundler could not find compatible versions for gem "hkdf":
In snapshot (Gemfile.lock):
hkdf (= 1.0.0)
In Gemfile:
web-push was resolved to 1.0.0, which depends on
hkdf (~> 0.2)
Deleting your Gemfile.lock file and running `bundle install` will rebuild your
snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
Итак, я преодолел эту начальную ошибку, удалив файл блокировки, как и предлагалось, но затем столкнулся с NameError: undefined method ‘call’, о котором говорилось ранее. Исправил это, зафиксировав версию redis. После этого всё заработало.
Таким образом, мой скрипт был модифицирован так, чтобы: а) удалять Gemfile.lock (из-за ошибки, приведённой выше) и б) автоматически изменять Gemfile, фиксируя redis на версии 4.8.0. Всё должно было быть отлично… Так я думал. Это сработало на трёх из 20 «идентичных» машин! Остальные выдали новую ошибку:
[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)
Это было действительно, очень странно, потому что файлы /var/discourse/config/initializers/100-sidekiq.rb были идентичны на всех машинах и определённо не содержали ‘logger=’, а лишь утверждение ‘logger = …’.
В конце концов я понял, что на машинах, где всё работало, /usr/local/bin/bundle был версии 2.3.20, а не 2.3.26, как на машинах, где произошла ошибка. Таким образом, в итоге добавление этого перед командой установки discourse сработало для меня (было недостаточно выполнить команды фиксации bundler на версии 2.3.20 после установки bundler для discourse; это должно было быть сделано до):
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
Почему на некоторых машинах был bundler 2.3.26, а на других 2.3.20, я понятия не имею… но это, вероятно, не ваша вина
.