目标
每次自动重试都在教团队“红色可能不代表什么”,而真正的回归将继承这份怀疑。清除计划把激励倒转:先测量不稳定率、诚实隔离、按影响半径修根因、最后关掉主赛道的自动重试——让红色重新意味着“真故障或新 flake”,永远不再是一声耸肩。
步骤要点
- 先测不稳定率:跨窗口重复运行套件,按每条测试的失败方差排名,用数据代替传闻。
- 带过期与 owner 隔离:被证实的 flake 移入单独隔离车道,每条登记责任人、根因假设与过期时间,过期自动升级。
- 按影响半径排序修:先修覆盖支付与鉴权路径的测试再修外观类的,用固定种子与乱序复现,复现种子写入文档。
- 主车道关闭重试:禁止自动重试让新 flake 立即现形,把“重跑到绿”的习惯变成可上报的指标。
- 加不稳定率门禁:CI 对 PR 触碰的测试做多次运行的方差检查,引入可测 flakiness 的合并直接失败。
排错提示
重试开着的日子里 flake 只会越攒越多,把主车道 retries 关掉是唯一的棘轮;修了半天复现不了是没用种子与乱序,让失败可重放是修复的前置条件;隔离车道成了永久养老院说明过期没被执行,过期即升级到管理层。
适用边界
方差门禁会少量增加 CI 运行成本,触发条件要限定在触碰的测试上;不稳定率的测量受运行环境影响,跨环境的方差要归一化后再比较。
代码示例
measurement (3 runs x 5 nights):
flake rate: 4.7% of tests fail intermittently
top offenders:
payment/e2e_flow 38% fail rate (blast: high)
search/debounce 31% (medium)
ui/header_snapshot 29% (low)
quarantine (expiry 14d, owner attached):
fixed first: payment (seed + fake clock)
root causes: 2 timing races, 1 order-dep state
main lane: retries DISABLED
red run = real failure or new flake (escalates)
variance gate: touched tests must pass 3/3 runs