Prhub

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

sgl-project/sglang · 作者 hnyls2002 · 合并时间 2026-03-26 05:40

分析状态 已生成
文件变更 2提交数 12 · 评论 2
代码增减 +62 / -8
ci performance

执行摘要

在 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

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

关键符号

fetchJobs

评论区精华

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

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

风险与影响

风险包括: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 链接,后续同步到相关引用后会出现在这里。

完整报告

执行摘要

本 PR 优化了 SGLang 仓库的 CI 工作流,通过在 wait-for-jobs 中使用 ETag 条件请求减少 GitHub API 速率限制消耗,并将默认轮询间隔从 120 秒降低到 60 秒以加速检测。同时扩展变更检测覆盖 CI 基础设施文件,确保修改正确触发测试,提升 CI 效率和可靠性。

功能与动机

动机是解决 GitHub API 速率限制问题,避免不必要的配额消耗,并确保 CI 基础设施变更被正确检测。根据 PR body,关键表述包括:

  • "Without ETag, every poll consumes 1 rate-limited call regardless of whether job statuses changed",强调无 ETag 时每次轮询都消耗配额。
  • "CI infra files were not covered by change detection — modifications to them would not trigger any test jobs",指出之前 CI 基础设施文件未被检测,导致修改后不触发测试。

实现拆解

实现主要集中在两个文件:

  1. .github/actions/wait-for-jobs/action.yml
    • 新增 fetchJobs() 函数,使用 ETag 条件请求(If-None-Match / ETag)处理轮询。
    • 关键代码逻辑:
      javascript async function fetchJobs() { // 设置 ETag 头部 if (lastEtag) { params.headers['if-none-match'] = lastEtag; } // 处理 304 响应 if (err.status === 304 && lastJobs) { cachedCalls++; return { jobs: lastJobs, cached: true }; } // 分页处理:当作业数 >100 时清除 ETag if (response.data.total_count > 100) { lastEtag = ''; } }
    • 默认轮询间隔从 120 秒改为 60 秒,并在缓存轮询时跳过日志输出。
    • 添加速率限制日志,记录 x-ratelimit-remaining 和调用统计。
  2. .github/workflows/pr-test.yml
    • 扩展变更检测路径,新增 .github/workflows/pr-gate.yml.github/actions/**main_package 检测,使用 dorny/paths-filter 和 API-based 方法。
    • 更新 shell 脚本中的正则表达式以包含这些路径。

评论区精华

本 PR 未经过 review 讨论,所有修改由作者 hnyls2002 独自完成并合并,没有争议或设计权衡的公开讨论。

风险与影响

  • 风险
    • ETag 缓存可能导致不一致,特别是在分页超过 100 个作业时,ETag 被清除以避免旧缓存,但可能增加额外 API 调用。
    • 降低轮询间隔到 60 秒可能提高 API 调用频率,但通过 ETag 缓解;如果 ETag 失效,可能增加配额消耗。
    • 跳过缓存轮询的日志输出减少了噪音,但可能隐藏调试信息。
  • 影响
    • 减少 API 配额消耗:预计典型情况下每 PR 付费调用从 100 减少到 70,并发 PR 容量从 150 提升到 214。
    • 检测延迟改进:从最多 120 秒减少到 60 秒,加速 CI 阶段转换。
    • 确保 CI 基础设施变更正确触发测试,提高维护效率和团队协作。

关联脉络

与近期历史 PR 相关,揭示 CI 基础设施的持续优化趋势:

  • PR #21420 和 #21410:涉及 CI 工作流修改,优化变更检测和触发条件。
  • PR #21393 和 #21331:CI 改进和重构,如添加重试机制和脚本重写,与本 PR 同属基础设施类别。
    这些 PR 显示团队在集中精力提升 CI 可靠性和效率,本 PR 是这一方向的具体实践。

参与讨论