Skip to content

ci: merge queue 吞吐优化——Test Core / Dogfood 各 2→3 分片 + 队列失败自动分诊评论 #4859

Description

@xuyushun441-sys

背景(2026-08-03 上午实测数据)

merge queue 体感慢。查了当天全部 merge_group 运行:

  1. 单次队列构建关键路径 ~11 分钟:filter(10s) → Test Core (2/2) 测试步 9m50s → 聚合 gate。分片按测试文件数均分但运行时长不均(shard 2 = 9m50s vs shard 1 = 7m47s)。Test Core 砍掉后,下一根长杆是 Dogfood (2/2) 7m38s。
  2. 失败放大是主因:当天 20 个队列构建 7 个失败。fix(service-analytics): 按聚合种类填充「查询从未报告过的分组」,并补上 compareTo 这一道接缝 (#4708) #4822 同内容红 4 次第 5 次过(09:19→10:22 才落地),每次失败连坐后面所有构建重建(refactor(spec)!: 退役 activationEvents(两处键)与 ActivationEventSchema 词表 —— 四仓零 runtime reader 的惰性激活声明 (#4657) #4831/feat(plugin-audit)!: sys_comment 的 visibility / reply_count 退役 —— ADR-0049 enforce-or-remove,两键都移除 (#4756) #4849 失败 4 分钟后原样通过)。失败全部集中在 Test Core 分片——PR 侧跑 affected-only、队列跑全量,flaky 测试专门在队列(最贵的位置)爆炸。而每次失败都被盲目重排,没有人先回答「失败的测试与本 PR 相关吗」。

范围

  1. Test Core 2→3 分片(ci.yml):matrix + 分区参数 /3。安全性:branch protection 只 require 聚合 gate Test Core(chore(ci): cut PR wall-clock ~9.5min → ~5-6min — dedupe dogfood, shard it, cache lint's build #3622 之后 gate 承载稳定名,分片数可变正是建 gate 的目的)。关键路径预期 ~11min → ~8min。
  2. Dogfood 2→3 分片(ci.yml):同上,vitest --shard=x/3(单包 ~60 文件,3 分片安全)。顺带给 dogfood 的 turbo restore 补一个 job 级兜底恢复键(现在只有 shard 级前缀,新 shard 3 在 main 播种前全冷;Test Core 的同名 fallback 模式已存在)。
  3. 新 workflow:merge_group 失败自动分诊评论。workflow_run(CI, completed) + event == merge_group && conclusion == failure 触发:从队列分支名解析 PR 号,列出失败 job/step、从日志抽取失败测试名,附本 PR 的重排失败历史与当天队列失败面板,评论到 PR 上,带分诊清单(与本 PR 相关→修 PR;无关→先查 flaky/同组语义冲突,不要盲目重排)。给人和 PM agent 一个机器可读的「先诊断再重排」信号。

不做(已查证)

  • lint.yml typecheck 加 turbo 缓存——已存在(restore + main 播种 save 都在),10 分钟档是 spec 改动全量重编译的真实代价。
  • merge queue 设置(并发构建数、组大小)是仓库 Settings,不在代码内;建议维护者:并发 ≥5,flaky 清掉前组保持小。

验收

  • 队列构建里 Test Core 最慢分片 ≤ ~7min,Dogfood 最慢分片 ≤ ~5.5min;Test Core / Dogfood Regression Gate 两个 required 上下文名字不变。
  • 人为让一个 merge_group 构建失败,对应 PR 收到分诊评论,含失败测试名与重排历史;cancelled(连坐撤销)不触发评论。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions