目标
启用 merge queue:多 agent 并发时"各自对 main 绿、合起来红"的问题由队列串行化验证解决,同时消除"分支需 up-to-date"导致的反复手动 update branch。
背景(源自 #81 §6)
多 agent 并发提 PR 后,每个 PR 都基于旧 main 验证通过,合并顺序不同时语义冲突直接进 main。merge queue 把 PR 排队、按"队列前缀 + 本 PR"的虚拟合并重新验证,绿才落地。硬性前提:gate workflow 必须订阅 merge_group 事件,否则 required check 在队列中永不上报、合并直接失败。
涉及文件
governance/rulesets/main-protection.json(增加 merge_queue rule)
.github/workflows/gate.yml(on: 增加 merge_group)——本仓及各业务仓所有 required check workflow
CI-Workflows 各 reusable workflow 的触发声明(caller 侧事件传递)
governance/expected-state.json(merge queue 参数进期望状态对账)
执行步骤
- 所有 required check 链路上的 workflow 增加
merge_group 触发(types: [checks_requested])。逐个仓排查,漏一个 = 该仓队列卡死。
main-protection.json 增加 merge_queue rule(参数:merge_method squash,max_entries_to_merge / 并发参数取保守默认值)。
expected-state.json 与 drift-check 对账 merge queue 配置。
- 注意与 P1-3 的一致性:merge_group 场景下 aggregator 的 needs 断言同样严格。
- 先在高活跃仓(agent-registry / template-service)启用,观察一周再全量。
验收标准
- 语义冲突的两个 PR:各自对 main 绿,先入队者合并,后入队者被队列重验拦下(踢出队列并标注冲突),而不是红进 main。
- 队列中 required check 正常上报(无永久 pending)。
- drift-check 覆盖 merge queue 配置。
测试方法(预先指定)
T1 语义冲突拦截(核心,端到端):在测试仓:
- PR-A:把函数
foo() 的返回值从 int 改为 str(含其测试更新)→ 绿,加入 merge queue。
- PR-B(基于不含 A 的 main):新增调用
foo() 并按 int 处理的代码 → 对 main 绿,加入 merge queue。
- 断言:A 合并后,队列用"A+main+B"重验 B → B 的 check 变红、B 被踢出队列并收到失败通知;main 始终保持绿。
T2 merge_group 上报(核心,负向预防):
- 在测试仓临时移除某 required workflow 的
merge_group 触发,开 PR 入队。
- 断言:队列在超时时间内未收到 check → PR 被踢出(此用例证明"漏配 merge_group = 卡死"的侦测有效性;随后立即还原配置)。
- 还原后重跑正常入队流程 → 断言合并成功。
T3 并发吞吐(正向):连续 3 个无冲突 PR 同时入队 → 断言按序全部合并,无人工干预,main 全程绿。
T4 对账:手动改动队列参数(如 merge_method)→ 断言 drift-check 报漂移;apply 还原。
依赖
- P1-1 / P1-2(auto-merge 全链路已通)
- P1-3(aggregator 严格断言在 merge_group 场景下同样成立)
目标
启用 merge queue:多 agent 并发时"各自对 main 绿、合起来红"的问题由队列串行化验证解决,同时消除"分支需 up-to-date"导致的反复手动 update branch。
背景(源自 #81 §6)
多 agent 并发提 PR 后,每个 PR 都基于旧 main 验证通过,合并顺序不同时语义冲突直接进 main。merge queue 把 PR 排队、按"队列前缀 + 本 PR"的虚拟合并重新验证,绿才落地。硬性前提:gate workflow 必须订阅
merge_group事件,否则 required check 在队列中永不上报、合并直接失败。涉及文件
governance/rulesets/main-protection.json(增加merge_queuerule).github/workflows/gate.yml(on:增加merge_group)——本仓及各业务仓所有 required check workflowCI-Workflows各 reusable workflow 的触发声明(caller 侧事件传递)governance/expected-state.json(merge queue 参数进期望状态对账)执行步骤
merge_group触发(types: [checks_requested])。逐个仓排查,漏一个 = 该仓队列卡死。main-protection.json增加 merge_queue rule(参数:merge_method squash,max_entries_to_merge / 并发参数取保守默认值)。expected-state.json与 drift-check 对账 merge queue 配置。验收标准
测试方法(预先指定)
T1 语义冲突拦截(核心,端到端):在测试仓:
foo()的返回值从 int 改为 str(含其测试更新)→ 绿,加入 merge queue。foo()并按 int 处理的代码 → 对 main 绿,加入 merge queue。T2 merge_group 上报(核心,负向预防):
merge_group触发,开 PR 入队。T3 并发吞吐(正向):连续 3 个无冲突 PR 同时入队 → 断言按序全部合并,无人工干预,main 全程绿。
T4 对账:手动改动队列参数(如 merge_method)→ 断言 drift-check 报漂移;apply 还原。
依赖