정말이죠! 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 버전을 고정(pegging)하여 이를 해결했습니다. 그 후 모든 것이 정상 작동했습니다.
따라서, 제 스크립트는 a) 위에서 인용한 오류 때문에 Gemfile.lock을 제거하고, b) Gemfile를 자동으로 수정하여 redis를 4.8.0으로 고정하도록 수정되었습니다. 별문제 없이 잘 작동할 거라고 생각했습니다. 실제로 ‘동일한’ 20대 중 3대에서 작동했습니다! 나머지에서는 이 새로운 오류가 발생했습니다:
[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 설치 명령 이전에 다음을 추가하는 것이 저에게는 효과가 있었습니다(discourse의 bundler 설치 후에 bundler를 2.3.20으로 고정하는 명령을 실행하는 것만으로는 충분하지 않았으며, 반드시 이전에 실행해야 했습니다):
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이 있는지 저는 알 수 없습니다… 하지만 아마도 당신의 잘못은 아닐 것입니다
.