Help us learn about your current experience with the documentation. Take the survey.
db:check-migrations 任务
此任务在合并请求流水线的测试阶段运行。它检查:
- 在执行新迁移的回滚后,比较作者工作分支和目标分支的模式转储。此检查验证模式是否正确重置为执行此新迁移之前的状态。
- 比较作者工作分支和作者提交的
db/structure.sql文件之间的模式转储。此检查验证它是否包含迁移中的所有预期更改。 - 比较作者提交的
db/schema_migrations和脚本运行迁移后生成的db/schema_migrations之间的 Git 差异。此检查验证所有内容是否已正确提交。
故障排除
误报
此任务不允许失败,但可能会产生一些误报。
例如,当我们删除一个列然后回滚时,该列总是被重新添加到列列表的末尾。如果该列之前位于列表中间,则回滚无法将模式完全恢复到之前的状态。在这种情况下,应用 pipeline:skip-check-migrations 标签以跳过此检查。
有关实际示例,请参阅此失败的任务。在这里,作者删除了 position 列。
回滚后模式转储比较失败
如果工作分支落后于目标分支,经常会发生此失败。一个实际场景:
graph LR
Main((main<br>commit A)) ===> |remove constraint<br>fk_rails_dbebdaa8fe| MainB((main<br>commit B))
Main((main<br>commit A)) --> |checkout<br>dev| DevA((dev<br>commit A)):::dev
DevA((dev<br>commit A)) --> |add column<br>dependency_proxy_size| DevC((dev<br>commit C)):::dev
DevC -.-> |CI pipeline<br>executes| JOB-FAILED((JOB FAILED!)):::error
classDef main fill:#f4f0ff,stroke:#7b58cf
classDef dev fill:#e9f3fc,stroke:#1f75cb
classDef error fill:#f15146,stroke:#d4121a
- 你从
main目标分支检出dev工作分支。此时,每个分支的HEAD都在提交 A。 - 有人在
main分支上工作并删除了fk_rails_dbebdaa8fe约束,从而在main上创建了提交 B。 - 你向
dev分支添加了dependency_proxy_size列。 - 由于
structure.sql文件没有回滚到预期状态,dev分支的 CI/CD 流水线的db:check-migrations任务失败。
发生这种情况是因为 dev 分支包含提交 A 和 C,而不是 B。其数据库模式不知道 fk_rails_dbebdaa8fe 约束的移除。在比较两个模式时,dev 分支包含此约束,而 main 分支没有。
这个例子确实发生过。请阅读任务失败日志。
要解决此类问题,请将工作分支变基到目标分支以获取最新更改。