Skip to content
返回质量保障

合并队列串行集成

用合并队列串行 PR 合并、使每 PR 对前一合并结果验证、防最后合失败级联坏 main。

为什么

多 PR 开且每对旧 main 过 CI 时、首 PR 干净合——但次 PR 对旧 main 验证非新 main、合时可能坏(Git 无法检测的语义冲突)。无合并队列、团队反复遇'最后 PR 合后失败'问题: 每 PR 绿但合后 main 红、有人须回退或前修。合并队列解此通过排队 PR 一次合一个、对每前一合并结果重跑必需检查后才允下一个。这以少量合延迟(每 PR 等前面一个)换每合后 main 常绿保证。对高 PR 吞吐团队(日超 10 合)、合并队列是稳 main 和永坏 main 之差。

何时使用

仓库日超约 10 PR 合时、或团队反复遇'所有 PR 绿但合后 main 红'时——两者示并行 PR 验证已不够。

如何做

1. 启合并队列(GitHub)
   - Settings > General > Pull Requests > 合并队列 > 启
   - 或经分支保护: main 要求合并队列

2. 配队列
   - 最大构建条目: 5(批最多 5 PR 一起重验证)
   - 最小合条目: 1(一条目过即合)
   - 最大并发构建: 4(并行跑 4 队列条目)

3. 定义队列中跑哪些检查
   - 合并队列对排队基重跑必需状态检查
   - 工作流中用条件在队列上下文跑(或跳)检查:
     if: github.event_name == 'pull_request' || github.event_name == 'merge_group'

4. 调合方法
   - 用 squash 合得线性历史(每 PR = main 上一提交)
   - 队列 squash 并合前重跑检查

5. 监队列深度和延迟
   - 看队列长(GitHub 显待条目)
   - 队列长超约 20 时 CI 太慢——并行测试或减必需检查集

示例

# .github/workflows/ci.yml — PR 和合并队列上下文都跑
name: ci
on:
  pull_request:
  merge_group:
jobs:
  unit-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm test

# 分支保护: 要求合并队列
# Settings > Branches > main > 要求合并队列
#   - 最大构建条目: 5
#   - 最大并发构建: 4

常见问题

  • ⚠启合并队列但未加 merge_group 触发到工作流——检查不在队列上下文跑、队列无验证合、main 如前坏。
  • ⚠最大构建条目设太高(如 20)——队列批 20 PR、一个失败、全 20 踢回队列、创团队挫败反馈环。
  • ⚠不监队列深度——忙下午队列静长到 50 条目、每 PR 等一小时合、团队禁队列解阻。
  • ⚠合并队列配很慢 e2e 检查(30 分钟)——每队列条目等 30 分钟、队列积压、延迟超正确性益。

最佳实践

  • ✓给每跑必需检查的工作流加 merge_group 触发——无它队列无验证合、败整个目的。
  • ✓批大小小(3-5 条目)使单失败仅踢回几 PR 非全队列——这保持反馈环紧。
  • ✓慢检查(e2e、全集成)移出合并队列到合后或夜班——队列应仅跑快可靠检查。
  • ✓设队列深度告警(GitHub API 或 Slack bot)队列超 10 条目时 ping 团队、使 CI 慢在迫禁队列前被抓。