Checks 的尝试、排序与过期
发布 CI 状态时保持稳定 key,检查 outcome,避免旧写入覆盖新结果。
Origin 将 CI 结果按 commit 的 check suite/check run 记录。应用使用 installation token 与 checks 权限;镜像仓库不接受这些写入。
标识一次尝试
suite attempt 由 actor、key、externalId、baseSha 区分,run attempt 由 suite、key、externalId 区分。稳定 key 表示同一种检查,每次重试用新的 externalId 保留历史;同 ID/base 的重复上报更新原尝试。
baseSha 不同或省略时产生不同尝试。当前 commit checks 会在同 actor/key 的 suite 中依据有效 run 的 externalUpdatedAt 选择当前尝试,再在 suite 内选择每个 key 的当前 run,不是简单显示所有历史行。
写入排序与返回值
Origin 以毫秒精度 externalUpdatedAt 判断新旧。旧写入仍返回 HTTP 200 和已存结果,不能据状态码宣称刚上报值已生效。
| outcome | 含义 |
|---|---|
| created | 建立新 run |
| updated | 采用本次值 |
| unchanged | 值及时间都相同 |
| ignored_stale | 忽略过时写入,返回原存储值 |
单条读取顶层 outcome/checkRun,批量读取 results[].outcome/checkRun;批量顶层 checkRuns[] 已弃用且不带 outcome。unchanged 与 ignored_stale 都不推进 updatedAt,不能用它区分。
同时间与取消例外
相同 timestamp 一般后写胜出,但 queued/in_progress/failing 不能用同时间重开 completed;存在 rerequestedAt 时,同原时间写入也被视旧。completed+cancelled 不能覆盖已 completed 的 success/neutral/skipped,即使时间更新。
重新请求的 run 保持当前位置并显示 pending,直至拥有应用回应。实现需读回 outcome 和实际值,不把所有 200 统一当作写入成功。
时间与 deadline
externalUpdatedAt/startedAt/completedAt 超前服务器超过 60 秒返回 400,completedAt 不得早于同次 startedAt;deadlineAt 不得超过未来 24 小时。
只有 in_progress/failing 且有 deadline 才会在后台扫描时过期为 timed_out;queued 或无 deadline 不自动过期。扫描并非到点立即发生,约 30 分钟是可变运维设置,不能作为 SLA。
timeout 不改 externalUpdatedAt,新时间上报仍可恢复。若重开 timed-out run,需给新 deadlineAt,否则可能继承旧过期值并再次被扫为超时。