GitHub Actionsで「Check SKIP_DB_AND_REDIS bootability」ステップが失敗

最近追加された「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'"

を実行する以外にも何かあるはずです。

興味深いですね、ご報告ありがとうございます!

非常に具体的なケースで、これまで考慮していなかった可能性があります。

ローカル環境で以下の行を false に変更してみてください。

その後、再現コマンドを再度実行してください。

これで問題が再現するようであれば、その schema_cache_dump 設定を制御するための ENV 変数の追加を検討します。

それでは効果はありませんでした。db/schema_cache.yml ファイルを削除しても同様です。

以下の 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=trueLOAD_PLUGINS=1 を指定しないと、すべてのプラグインクラスが読み込まれないようです。