Help us learn about your current experience with the documentation. Take the survey.

db:check-migrations 任务

此任务在合并请求流水线的测试阶段运行。它检查:

  1. 在执行新迁移的回滚后,比较作者工作分支和目标分支的模式转储。此检查验证模式是否正确重置为执行此新迁移之前的状态。
  2. 比较作者工作分支和作者提交的 db/structure.sql 文件之间的模式转储。此检查验证它是否包含迁移中的所有预期更改。
  3. 比较作者提交的 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
  1. 你从 main 目标分支检出 dev 工作分支。此时,每个分支的 HEAD 都在提交 A。
  2. 有人在 main 分支上工作并删除了 fk_rails_dbebdaa8fe 约束,从而在 main 上创建了提交 B。
  3. 你向 dev 分支添加了 dependency_proxy_size 列。
  4. 由于 structure.sql 文件没有回滚到预期状态,dev 分支的 CI/CD 流水线的 db:check-migrations 任务失败。

发生这种情况是因为 dev 分支包含提交 A 和 C,而不是 B。其数据库模式不知道 fk_rails_dbebdaa8fe 约束的移除。在比较两个模式时,dev 分支包含此约束,而 main 分支没有。

这个例子确实发生过。请阅读任务失败日志

要解决此类问题,请将工作分支变基到目标分支以获取最新更改。