Skip to content

Check Changeset 的首跑对 skip-changeset 路线结构性必红:job 在 PR 打开瞬间读标签,而标签只能在创建之后打上(今日实测复现 21 次) #6378

Description

@hotlong

由 PM 座位记录(pm-dispatch devx),度量来自今天一整天的实跑,不是推断

现象

走「路线 2:skip-changeset 标签」的 PR,首跑 Check Changeset 几乎必红,随后确认标签在位、rerun_failed_jobs 一次即转绿。今天在本车道实测复现 21 次(#6248 / #6252 / #6255 / #6282 / #6284 / #6289 / #6304 / #6310 / #6324 / #6335 / #6340 / #6353 / #6357 / #6358 / #6372 等,多为一 PR 一次)。

根因(结构性时序,非偶发)

pr-automation.ymlCheck Changeset job 在 pull_request: opened 事件上起跑,起跑那一刻就读标签;而 skip-changeset 标签只能在 PR 创建之后才打得上(GitHub 没有「创建 PR 时原子地带标签」的路径给这条流程)。两者之间恒定存在一个几十秒级的窗口:

为什么现在值得修(以前不值得)

代价一直存在,但今天有两个新事实把它推过了门槛:

  1. 它消耗的是已经稀缺的资源。 今天 GitHub REST 配额两次整体耗尽(PM + 并发 dev 共用同一身份)。每一次竞态红都要花掉:一次标签读回 + 一次 rerun_failed_jobs + 一轮 job 重跑。21 次就是 21 组。在配额已成为吞吐瓶颈的前提下,这不再是「几分钟的小麻烦」。
  2. 它训练出一个坏习惯。 每份派单都写着「首跑红 = 已知竞态,确认标签后重跑一次」,于是每个 dev 都学会了看到 Check Changeset 红先重跑而不是先读日志。今天有 dev 在报告里明确写下这条处方的执行过程。一道门如果它的标准处置是「无视并重跑」,它对这条路线就已经不提供判别力了——而它对真正忘记写 changeset 的 PR 仍然必须提供判别力,两者混在同一个红色里。

候选方向(未预设结论,交实现者测量决定)

  1. 让首跑等一个短窗口再判:job 起跑后轮询标签若干秒(例如 ≤30s)再做判定。最小改动,但把等待成本转嫁给每一次运行。
  2. 改由 labeled 事件承担唯一判定:opened 那跑不下红色结论(或直接跳过),判定统一由 labeled / synchronize 事件的运行给出。⚠️ 需要确认:一个从头到尾没有任何标签动作的 PR(既没打 skip-changeset、也没有 bot 加标签)是否仍会被判到——若不会,这个方向会开一个真实的漏洞,必须配一条兜底。
  3. 判定推迟到 ready-for-review 或首次 synchronize:与本仓「PR 先 DRAFT、验收后才翻 ready」的既有流程对齐——draft 阶段本就不该拦人。
  4. 其他(例如让 job 在标签缺失时输出 neutral 而非 failure)。

⚠️ 硬约束:无论选哪条,「真的忘了写 changeset」这一类必须仍然响亮变红。本单的目的是消除结构性假红,不是放宽门禁。任何让该门变得更容易被绕过的修法,即使消灭了竞态,也是不可接受的。

落点与查重

未认领,交分诊定级。


Generated by Claude Code

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions