执行摘要
- 一句话:rerun-test 回复新增运行态图标
- 推荐动作:该 PR 值得阅读,尤其是 update_rerun_test_status.py 中关于状态机、幂等性和并发控制的实现思路,为类似 GitHub API 操作提供了可参考的模式。
功能与动机
PR body 指出:当前 reply comment 仅在调度(⏳)和完成(✅/❌)之间切换,缺少中间状态,开发者无法判断 GPU runner 是否已开始执行。新增运行中状态(🔄)让反馈更及时。
实现拆解
- 新增 update_rerun_test_status.py 脚本,作为原本 write_rerun_test_result.py 的全功能替代。该脚本接收 --comment-id、--marker、--status 和 --repo 参数,使用 GitHub REST API 读取 comment 并更新对应 marker 行的图标。支持三种状态:dispatched (⏳,由 slash-command handler 设置)、running (🔄,由 runner 启动后设置)、success/failure (✅/❌,由测试结果决定)。脚本包含重试逻辑和幂等判断:若 marker 已包含 :done 后缀则跳过;若 comment 未就绪则最多重试 3 次。
- 删除原 write_rerun_test_result.py,其功能完全由新脚本接管,且新脚本增加了 running 状态支持。
- 修改 .github/workflows/rerun-test.yml:在两个 runner job(GPU 和 CPU)中添加新的 "Mark runner picked up" step,在安装依赖前调用 update_rerun_test_status.py --status running;同时将最终的 "Write back result" step 改为调用同一脚本并传入 done 状态;移除原 pip install requests 步骤,因为新脚本使用标准库 urllib 避免外部依赖。此外,为两个 job 添加 permissions: contents: read, issues: write 以允许写入 comment。
关键文件:
scripts/ci/utils/update_rerun_test_status.py(模块 CI 脚本;类别 infra;类型 infrastructure;符号 gh_request, main): 核心新增文件,实现状态图标更新逻辑,支持 running 状态,包含幂等和重试设计。
scripts/ci/utils/write_rerun_test_result.py(模块 CI 脚本;类别 infra;类型 infrastructure;符号 main): 被删除的旧脚本,其功能由新脚本替代。
.github/workflows/rerun-test.yml(模块 CI 工作流;类别 infra;类型 infrastructure): 工作流文件,新增 running 状态上报 step 并更新回调脚本。
关键符号:gh_request, main
评论区精华
本 PR 未触发实质性的 review 讨论,但脚本设计本身包含了对并发竞态的权衡:在 docstring 中说明不同 marker 的最终写回步骤通过 job 级 concurrency 保证串行,而 running 状态 step 不保证串行,但最坏情况只是丢失一次 🔄 闪烁。
- 无实质审查讨论 (other): 无争议,直接合并。
风险与影响
- 风险:
- 幂等性:通过 :done 标记和重试机制保证重复调用安全。
- 依赖变化:新脚本使用标准库 urllib 代替 requests,不再需要 pip install requests,消除了一个运行时依赖,风险可控。
- 并发写入:多个 batch 同时更新同一 comment 可能存在竞态,但设计上接受 small window 内的不一致(丢失 🔄)。
- 兼容性:旧脚本被删除,所有调用点均已更新,无残留。
- 权限:新增 issues: write 权限,确保 token 能编辑 comment。
- 影响:直接使用 /rerun-test 的开发者(项目维护者)将看到更细粒度的反馈:从 ⏳ → 🔄 → ✅/❌,能及时判断 runner 是否已开始执行。改动仅限于 CI 工具链,不影响核心推理逻辑或生产部署。影响程度低,但可用性提升显著。
- 风险标记:幂等性设计, 并发写入风险, 移除 requests 依赖
关联脉络
参与讨论