db:check-migrations ジョブ
このジョブはマージリクエストパイプラインのテストステージで実行されます。このジョブは
- 新しいマイグレーションのロールバックを実行した後の、作成者の作業ブランチとターゲットブランチのスキーマダンプ比較。このチェックは、スキーマがこの新しいマイグレーションを実行する前の状態に正しくリセットされているかどうかを検証します。
- 作成者の作業ブランチと、作成者がコミットした
db/structure.sqlファイルのスキーマダンプ比較。このチェックでは、マイグレーションで予想されるすべての変更がコンテナに含まれていることを検証します。 - 作成者がコミットした
db/schema_migrationsとマイグレーション実行後にスクリプトが生成したものとの Git diff。このチェックは、すべてが適切にコミットされたことを検証します。
トラブルシューティング
偽陽性
このジョブは失敗してもかまいません。
例えば、カラムを削除してロールバックすると、このカラムは常にカラムのリストの最後に追加されます。このカラムが以前はリストの中ほどにあった場合、ロールバックはスキーマを以前の状態に正確に戻すことはできません。ジョブは失敗しますが、許容できる状況です。
実際の例として、この失敗したジョブを参照してください。ここでは、作成者はposition 列を削除しました。
ロールバック後にスキーマダンプの比較に失敗
この失敗は、作業ブランチがターゲットブランチより遅れている場合によく起こります。実際のシナリオです:
-
mainターゲットブランチからdev作業ブランチをチェックアウトしたとします。この時点で、各ブランチのHEADはコミット A になっています。 - 誰かが
mainブランチで作業し、fk_rails_dbebdaa8fe制約を削除してmainにコミット B を作成します。 - あなたは
devブランチにカラムdependency_proxy_sizeを追加します。 -
structure.sqlファイルが期待した状態にロールバックされなかったため、db:check-migrationsのジョブはdevブランチの CI/CD パイプラインで失敗しました。
これは、ブランチdev にコミット B ではなく A と C が含まれていたためです。ブランチのデータベーススキーマは、fk_rails_dbebdaa8fe 制約の削除について知りませんでした。2つのスキーマを比較すると、dev ブランチにはこの制約が含まれていましたが、main ブランチには含まれていませんでした。
この例は実際に起こりました。ジョブの失敗ログを読んでください。
このようなイシューを修正するには、作業ブランチをターゲットブランチにリベースして最新の変更を取得します。