pollプラグインのスペックを実行しようとすると「__ という名前の設定はありません」と表示される

こんにちは、

プラグインを作成しており、テストを書こうとしています。しかし、こちら にあるように、以下のコマンドで poll プラグインの specs を実行しようとすると、エラーが発生します。

bundle exec rake plugin:spec poll

エラーメッセージは以下の通りです:

An error occurred while loading ./plugins/poll/spec/integration/poll_endpoints_spec.rb.
Failure/Error: raise ArgumentError.new(“No setting named ‘#{name}’ exists”)

ArgumentError:
  No setting named 'discourse_narrative_bot_enabled' exists
# ./lib/site_settings/defaults_provider.rb:58:in `set_regardless_of_locale'
# ./config/environments/test.rb:74:in `block (3 levels) in <main>'
# ./config/environments/test.rb:63:in `tap'
# ./config/environments/test.rb:63:in `block (2 levels) in <main>'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:68:in `block in execute_hook'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:61:in `with_execution_control'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:66:in `execute_hook'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:52:in `block in run_load_hooks'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:51:in `each'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:51:in `run_load_hooks'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/application/finisher.rb:140:in `block in <module:Finisher>'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:32:in `instance_exec'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:32:in `run'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:61:in `block in run_initializers'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:60:in `run_initializers'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/application.rb:384:in `initialize!'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/railtie.rb:207:in `public_send'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/railtie.rb:207:in `method_missing'
# ./config/environment.rb:7:in `<top (required)>'
# ./spec/rails_helper.rb:56:in `require'
# ./spec/rails_helper.rb:56:in `<top (required)>'
# ./plugins/poll/spec/integration/poll_endpoints_spec.rb:3:in `require'
# ./plugins/poll/spec/integration/poll_endpoints_spec.rb:3:in `<top (required)>'

poll プラグインのテストを実行する際に、何が間違っているのでしょうか?なぜこの特定の設定がデフォルトのロケールに読み込まれないのでしょうか?

よろしくお願いいたします。

poll に関するテストのみを実行する場合は、bundle exec rake "plugin:spec[poll]"(またはより短い bin/rake "plugin:spec[poll]")というコマンドを使用してください。そうしないと、すべてのプラグインのテストが実行されてしまいます。

表示されているエラーについては、はっきりとはわかりません。テスト用データベースのマイグレーションは完了していますか?(bin/rails db:migrate RAILS_ENV=test

「いいね!」 2

ありがとうございます。おっしゃる通り、すべてのプラグインの仕様テストが実行されました。私は他のプラグインを削除することで回避策を講じました。元々はこちらを参考にしていたのですが、括弧の位置が間違っていたことが判明しました。

はい、テスト環境ではデータベースのマイグレーションは行われています。このエラーは、raise ArgumentError.new("No setting named '#{name}' exists")という行をコメントアウトし、代わりにputs を使用することで回避しました。その結果、discourse_narrative_bot_enabled のみがこのエラーを引き起こしていることがわかりました。他の設定には問題ありません。この設定については特に何も操作していないと思います。とにかく、このエラーを無視すれば私の仕様テストは正常に実行されたため、この回避策をローカルの Discourse に残すことができます。実際の原因がわかったら、この投稿を更新します。

「いいね!」 1

CI でデータベースのマイグレーションを実行しようとすると、このエラーが正確に発生しています。

Run bin/rake db:create
rake aborted!
ArgumentError: No setting named 'discourse_narrative_bot_enabled' exists
/home/runner/work/discourse-multilingual/discourse-multilingual/lib/site_settings/defaults_provider.rb:58:in `set_regardless_of_locale'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environments/test.rb:73:in `block (3 levels) in <main>'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environments/test.rb:63:in `tap'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environments/test.rb:63:in `block (2 levels) in <main>'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:79:in `block in execute_hook'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:72:in `with_execution_control'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:77:in `execute_hook'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:63:in `block in run_load_hooks'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:62:in `each'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:62:in `run_load_hooks'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application/finisher.rb:87:in `block in <module:Finisher>'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:32:in `instance_exec'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:32:in `run'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:61:in `block in run_initializers'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:60:in `run_initializers'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application.rb:372:in `initialize!'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environment.rb:7:in `<main>'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/zeitwerk-2.6.0/lib/zeitwerk/kernel.rb:35:in `require'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application.rb:348:in `require_environment!'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application.rb:511:in `block in run_tasks_blocks'
Tasks: TOP => db:migrate => db:load_config => environment
(See full trace by running task with --trace)
Error: Process completed with exit code 1.

コアのこの行が原因のようです。

「いいね!」 1

チームの皆さん、これは私を苦しめています。

私たちのCI は、これのために db:migrate で失敗しています。

これは、 discourse-chat プラグインのCI とほぼそのままコピーですが、cron スケジュールが追加されています。

私たちのCIは、PRとコミットでは機能しますが、cron ジョブでは毎回ここで失敗します。

同様のブロックで、rails コンソールでこれを再現できます。

[19] pry(main)> SiteSetting.defaults.tap do |s|
[19] pry(main)*   s.set_regardless_of_locale(:discourse_narrative_bot_enab, false)
[19] pry(main)* end
ArgumentError: No setting named 'discourse_narrative_bot_enab' exists

これは、次のようにすると機能します。

[21] pry(main)> SiteSetting.defaults.tap do |s|
[21] pry(main)*   if s.has_setting? :discourse_narrative_bot_enab
[21] pry(main)*     s.set_regardless_of_locale(:discourse_narrative_bot_enab, false)
[21] pry(main)*   end
[21] pry(main)* end

そして、確認のために、次のようにすると失敗します。

[21] pry(main)> SiteSetting.defaults.tap do |s|
[21] pry(main)*   if s.has_setting? :discourse_narrative_bot_enabled
[21] pry(main)*     s.set_regardless_of_locale(:discourse_narrative_bot_enab, false)
[21] pry(main)*   end
[21] pry(main)* end

そのため、喜んで提出するPRで次の変更を提案します。

 if ENV['LOAD_PLUGINS'] == '1' && s.has_setting? :discourse_narrative_bot_enabled

何らかの理由で、ナラティブボットプラグインの存在が保証できないのでしょうか?

これらの例では、サイト設定が discourse_narrative_bot_enab になっており、discourse_narrative_bot_enabled になっていません。おそらく、それが修正されれば、再現できなくなるのではないでしょうか。

ここで最も驚くべきことは次のとおりです。

これは、スケジュールされた実行の実行環境に違いがあることを示唆しています :thinking:

fail logの1つを見ると、GitHubがmultilingualプラグインを独自のディレクトリではなく、直接 plugins ディレクトリにクローンしているようです。そのため、基本的にすべてのコアプラグインを「アンインストール」し、それ自体を適切にインストールできません。

cronを機能させるためには、github.event.repository.name のすべての出現箇所を別のものに置き換える必要があると思います。

https://github.com/paviliondev/discourse-multilingual/blob/main/.github/workflows/plugin-tests.yml#L40

ドキュメントを見ると、リポジトリ名(オーナーなし)を取得する一貫した方法はないようです。そのため、いくつかのトリックが必要になります。これは機能するはずです。

cc @cvx - プラグイン/テーマテンプレートCIでこの手法を使用すべきでしょうか?

「いいね!」 2

これは意図的にエラーを発生させ(そして処理する)ためのものでした。

おお、それは素晴らしい発見です、ありがとうございます!

「いいね!」 2

マージされました。@David、本当にありがとうございました。
もしそちらの地域に行くことがあれば、ぜひご馳ろんならさせてください! :slight_smile:

「いいね!」 2

FYI cronテストは完璧に実行されました。改めて感謝します:tada:

「いいね!」 1

@cvx さんがこの記事を共有してくれました。

これで、cronジョブでハッキーなリポジトリ名の回避策は不要になるはずです :tada: @merefield さんもお願いします。

「いいね!」 1