最近追加された「Check SKIP_DB_AND_REDIS bootability」ステップが、私のプラグインの1つで失敗するという問題が発生しました。
SKIP_DB_AND_REDIS の起動に失敗しました。Rails の起動プロセス中にデータベースにアクセスされていないことを確認してください。
ローカルで再現するには、`SKIP_DB_AND_REDIS=1 RAILS_DB=‘nonexistent’ bin/rails runner “puts ‘booted successfully’”`を実行してください。
試してみましたが、ローカルでは問題を再現できませんでした。単に通過してしまいました。
失敗した GitHub Actions ステップのスタックトレースを使って、問題のコードを特定することができました。
問題のコード
コントローラーの1つで、Active Record の属性リストを取得する定数を宣言しました。
REWARD_FIELDS = Reward.attribute_names.excluding("id", "created_at", "updated_at")
これは明らかに行ってはいけません。
しかし、GitHub Actions を通じて試行錯誤するのではなく、このチェックをローカルでシミュレートできればより良かったです。つまり、
SKIP_DB_AND_REDIS=1 RAILS_DB='nonexistent' bin/rails runner "puts 'booted successfully'"
を実行する以外にも何かあるはずです。
david
(David Taylor)
3
興味深いですね、ご報告ありがとうございます!
非常に具体的なケースで、これまで考慮していなかった可能性があります。
ローカル環境で以下の行を false に変更してみてください。
その後、再現コマンドを再度実行してください。
これで問題が再現するようであれば、その schema_cache_dump 設定を制御するための ENV 変数の追加を検討します。
それでは効果はありませんでした。db/schema_cache.yml ファイルを削除しても同様です。
david
(David Taylor)
7
以下の 2 つを試してみてください。
開発モードで、異なる環境変数を使用してデータベースを設定する場合:
SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB='nonexistent' bin/rails runner "puts 'booted successfully'"
プラグインをロードしたテストモードの場合:
LOAD_PLUGINS=1 RAILS_ENV=test SKIP_DB_AND_REDIS=1 RAILS_DB='nonexistent' bin/rails runner "puts 'booted successfully'"
いいえ、まだ成功しています。
プラグインコードが読み込まれているか確認するために、「puts DiscourseKofi::Engine.to_s」を実行したところ、名前が出力されました。しかし、データベース接続を作成するクラスを参照した 「puts DiscourseKofi::Admin::AccountsController.to_s」 を実行したところ、ついに失敗しました。
つまり、GitHub アクションで行われるように、ローカル環境ではプラグインコードが完全に読み込まれていないようです。
失敗した完全なコマンドは以下の通りです。
LOAD_PLUGINS=1 SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts DiscourseKofi::Admin::AccountsController.to_s"
LOAD_PLUGINS=1 を指定しない場合、または RAILS_DB=nonexistent を使用した場合は、失敗しませんでした。
訂正します。LOAD_PLUGINS は関係ありませんでした。
したがって、以下は失敗します:
SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts DiscourseKofi::Admin::AccountsController.to_s"
→ 失敗
以下は失敗しませんでした:
SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts 'booted successfully'"
→ 失敗なし
データベースに接続しないクラスを参照した場合も同様です:
SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts DiscourseKofi::Admin::PaymentsController.to_s"
→ 失敗なし
了解しました。ローカルで問題を再現するための正しいコマンドは以下の通りです:
CI=true RAILS_ENV=test LOAD_PLUGINS=1 SKIP_DB_AND_REDIS=1 RAILS_DB=nonexistent bin/rails runner "puts 'booted successfully'"
これらの環境変数はすべて重要です。RAILS_ENV=development では動作させることができませんでした。test モードで CI=true と LOAD_PLUGINS=1 を指定しないと、すべてのプラグインクラスが読み込まれないようです。