Prhub

#35392 [CI] Skip fast-fail for scheduled stages

原始 PR 作者 Fridge003 合并时间 2026-08-19 06:07 文件变更 1 提交数 1 评论 0 代码增减 +1 / -1

执行摘要

夜间测试加 scheduled 跳过快速失败,改为收集全部失败

PR body 明确指出根因:Release Branch Cut 通过 workflow_dispatch 调用 nightly 工作流,因此可复用阶段无法依赖 github.event_name == 'schedule' 判断是否为定时任务。虽然 nightly 工作流传入了 scheduled: true,但 SKIP_PR_TEST_HEALTH_CHECK 此前完全忽略该输入,导致 nightly 后续任务在早期失败后仍会级联 fast-fail,丢失后续失败信息。

值得 CI 维护者精读:这是一个用显式布尔输入替代 github.event_name 判定的典型范例,说明可复用工作流必须把“调用意图”作为显式契约传递,不能依赖事件类型猜测。变更单行、语义清晰、向后兼容,建议按当前方案合入;后续若出现更多跳过快速失败的场景,可考虑把条件集中封装到某个共享的 check-health 表达式或复合 action 中,避免条件继续膨胀。

讨论亮点

该 PR 无 review 评论和逐行讨论(comments_count=0,review_comments_count=0)。核心设计判断以 PR body 的 Root cause 与 Validation 形式记录:inputs.scheduled 是唯一可靠的定时任务信号,因为 github.event_nameworkflow_dispatch 路径下不可用。

实现拆解

  1. 变更入口.github/workflows/_pr-test-stage.ymlenv 块,仅修改 SKIP_PR_TEST_HEALTH_CHECK 一行,其余配置不动。
  2. 条件扩写:在原表达式 (skip_pr_test_health_check || test_parallel_dispatch || run_all_tests) 之前增加 inputs.scheduled,即“定时调度调用”也纳入跳过快速失败的范围。
  3. 调用方语义:只有调用方工作流显式传入 scheduled: true 时才触发新行为;常规 PR 阶段不传该输入,保持原有 fast-fail 语义,因此向后兼容。
  4. 配套验证:作者对常规 PR、scheduled、显式跳过、并行分发、run-all 五种输入组合做了人工评估,并运行 actionlint -ignore SC2086 .github/workflows/_pr-test-stage.yml 和仓库 pre-commit 检查;未新增自动化测试。
文件 模块 状态 重要度
.github/workflows/_pr-test-stage.yml CI 工作流 modified 2.95

关键符号

SKIP_PR_TEST_HEALTH_CHECK

关键源码片段

.github/workflows/_pr-test-stage.yml infrastructure

唯一的变更文件,在 `SKIP_PR_TEST_HEALTH_CHECK` 条件中新增 `inputs.scheduled`,直接决定 nightly/weekly 可复用测试阶段是否会跨任务级联快速失败。

env:
  # 冷缓存场景下默认超时较短,这里放宽到 300 秒
  HF_HUB_DOWNLOAD_TIMEOUT: 300
  HF_HUB_ETAG_TIMEOUT: 300
  # 跳过 PR 健康快速失败的核心条件(本次变更仅在这一行加入 inputs.scheduled):
  # 1. inputs.scheduled:nightly/weekly 经 workflow_dispatch 调用时显式传入 true,
  # 因为此时 github.event_name 是 workflow_dispatch 而不是 schedule,不能靠事件名判断;
  # 2. caller_inputs 中的显式跳过 / 并行分发 / run-all 请求,保持原有跳过语义不变。
  SKIP_PR_TEST_HEALTH_CHECK: >-
    ${{ (inputs.scheduled
         || fromJson(inputs.caller_inputs).skip_pr_test_health_check
         || fromJson(inputs.caller_inputs).test_parallel_dispatch
         || fromJson(inputs.caller_inputs).run_all_tests) && 'true' || 'false' }}
  # 主分支(main)在维护模式下绕过测试的开关
  PR_TEST_BYPASS_MAINTENANCE_ON_MAIN: ${{ github.ref == 'refs/heads/main' && 'true' || 'false' }}
  USE_VENV: false

评论区精华

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

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

风险与影响

  1. CI 资源消耗上升:nightly/weekly 一旦有失败,将不再快速中止,而是跑完全部用例收集所有失败,CI 时长和资源占用会增加,这是有意的权衡。
  2. 调用方输入耦合inputs.scheduled 依赖调用方显式传值;若某个调用方误传 scheduled: true,会意外关闭快速失败,但影响面仅限 CI 行为,不涉及推理运行时。
  3. 表达式兼容性fromJson(inputs.caller_inputs) 与既有调用方式不变,inputs.scheduled 对未传布尔输入默认 false,不会破坏存量调用方。
  4. 验证盲区:无自动化测试覆盖该表达式,后续若再扩写条件,仍需靠人工评估和 actionlint 兜底。

影响范围限于 CI/运维侧:夜间与周度测试在失败后能继续运行并汇总全部失败,显著提升 Release Branch Cut 等发布流程的失败可见性;常规 PR 测试的快速失败行为不变,开发者日常反馈节奏不受影响。对最终用户和推理服务无任何运行时影响。团队可借此减少“修完一个失败又冒出下一个失败”的循环,但需要接受 CI 资源的小幅增加。

CI 行为变更 依赖调用方显式传入 scheduled 夜间失败将跑完全部用例,增加 CI 资源消耗 无自动化测试覆盖表达式

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论