Prhub

#21345 [CI] Use ETag conditional requests in `wait-for-jobs` and add CI infra to check-changes

原始 PR 作者 hnyls2002 合并时间 2026-03-26 05:40 文件变更 2 提交数 12 评论 2 代码增减 +62 / -8

执行摘要

在 CI 的 wait-for-jobs 中使用 ETag 条件请求以减少速率限制消耗,并扩展变更检测覆盖 CI 基础设施文件。

根据 PR body,背景是 GITHUB_TOKEN 的速率限制(15000 请求/小时)在仓库的所有并发 CI 工作流中共享。没有 ETag 时,每次轮询都消耗配额,无论作业状态是否改变(如:'Without ETag, every poll consumes 1 rate-limited call regardless of whether job statuses changed')。此外,CI 基础设施文件(如 wait-for-jobs、check-maintenance、upload-cuda-coredumps、pr-gate.yml)未被变更检测覆盖,修改它们不会触发测试作业(如:'CI infra files were not covered by change detection')。

对于负责 CI 基础设施或关心 GitHub API 速率管理的工程师,这个 PR 值得精读,特别是 fetchJobs() 函数中的 ETag 实现细节和分页处理,展示了如何优化轮询以减少配额消耗,并提供了可复用的设计模式。

讨论亮点

由于 review 审核和评论为空,本 PR 未经过讨论;所有修改由作者 hnyls2002 独自完成并合并。

实现拆解

实现包括两个关键文件修改:

  1. 在 .github/actions/wait-for-jobs/action.yml 中,添加 fetchJobs() 函数使用 ETag 条件请求(If-None-Match / ETag),处理 304 Not Modified 响应以避免配额消耗,优化分页时的 ETag 处理(当作业数超过 100 时清除 ETag),并添加速率限制日志;同时将默认轮询间隔从 120 秒改为 60 秒,并在缓存轮询时跳过日志输出以减少噪音。
  2. 在 .github/workflows/pr-test.yml 中,扩展变更检测路径以包含 .github/workflows/pr-gate.yml 和 .github/actions/**,确保 CI 基础设施变更被正确检测,避免修改后不触发测试。
文件 模块 状态 重要度
.github/actions/wait-for-jobs/action.yml CI 基础设施 modified 9.0
.github/workflows/pr-test.yml CI 工作流 modified 7.0

关键符号

fetchJobs

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险包括:ETag 处理错误可能导致缓存不一致,特别是在分页超过 100 个作业时(如 commit 中所述:'Invalidate ETag when pagination is needed'),这避免了旧缓存但可能增加不必要的 API 调用;降低默认轮询间隔到 60 秒可能增加并发 PR 的 API 调用频率,但通过 ETag 缓解;日志输出在缓存轮询时被跳过,减少了噪音,但可能影响调试信息的完整性。

影响范围:减少 API 配额消耗,预计典型情况下将每 PR 的付费调用从约 100 减少到 70,提高并发 PR 容量(从 150 到 214);检测延迟从最多 120 秒减少到 60 秒,加速 CI 阶段转换;确保 CI 基础设施变更正确触发测试,提高 CI 可靠性和维护效率;对最终用户透明,但对开发团队有益,优化了 CI 资源使用和效率。

分页处理风险 日志噪音控制 API 调用频率增加

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论