# PR #21341 完整报告

- 仓库：`sgl-project/sglang`
- 标题：[CI] Add cross-job fast-fail health check (Layer 3)
- 合并时间：2026-03-25 07:58
- 原文链接：http://prhub.com.cn/sgl-project/sglang/pull/21341

---

# PR 分析报告：添加跨作业快速失败健康检查

## 执行摘要
本 PR 为 sglang 仓库的 CI 流水线引入第三层快速失败机制，通过新增健康检查 composite action 检测作业失败并立即终止等待中的作业，显著减少 CI 资源浪费，预计将测试时间从约 30 分钟降至数秒，提升开发效率。

## 功能与动机
**为什么做**：根据 PR body 描述，目标是实现“zero wasted CI resources”，避免当同一阶段已有作业失败时，其他等待作业浪费时间和资源运行完整测试。这是 4 层快速失败机制中的第三层“job → job”，旨在优化 CI 执行时间。例如，PR body 指出：“Running jobs are never cancelled — they already passed the health check and continue to completion”，确保只影响等待作业。

## 实现拆解
**做了什么**：实现分为两部分：
1. **新增 composite action**：文件 `.github/actions/check-stage-health/action.yml` 包含健康检查逻辑，关键代码片段：
   ```yaml
   script: |
     // 跳过计划运行
     if (context.eventName === 'schedule') {
       core.info('Skipping health check for scheduled run');
       return;
     }
     // 查询失败作业并过滤级联
     const rootCauseFailures = jobs.filter(j => {
       // 过滤逻辑
     });
     if (rootCauseFailures.length > 0) {
       core.setFailed(`Fast-fail: skipping — root cause job(s): ${rootCauseFailures.map(j => j.name).join(', ')}`);
     }
   ```
2. **集成到 workflow 文件**：在五个 workflow 文件（如 `pr-test.yml`）中的 21 个阶段测试作业后添加健康检查步骤，确保快速失败生效。

关键设计决策：
- 使用 `core.setFailed()` 使作业显示为失败（红色 X），提高可见性。
- 级联过滤：排除由健康检查自身引起的失败，只报告根因作业。
- 自动跳过计划运行：通过 `context.eventName` 检测，无需手动输入。

## 评论区精华
**讨论了什么**：无实质性 review 讨论，仅作者 hnyls2002 在 Issue 评论中展示了测试结果截图，并说明：“During the test, only the root causes will be on the fast-fail reasons”，证明级联过滤工作正常。

## 风险与影响
**技术风险**：
- 级联过滤逻辑依赖步骤名匹配（如 `failedStep.name.includes('check-stage-health')`），若命名变化可能导致误判。
- 依赖 GitHub API，若 API 调用失败或超时，可能影响 CI 执行稳定性。
- 新增步骤增加约 2 秒开销，虽小但需监控性能影响。

**影响评估**：
- 对用户：透明无感，CI 结果更快速反馈。
- 对系统：减少 CI 资源消耗，降低云成本。
- 对团队：提升开发迭代速度，加快 bug 修复周期。

## 关联脉络
**与历史 PR 的关系**：本 PR 是快速失败机制的第三层，与 PR #21330（第一层：方法→文件）相关联，共同构建完整的 CI 优化策略。从提交历史看，作者通过多个测试提交验证功能，并最终 revert 测试代码，确保生产环境清洁。这表明团队注重 CI 可靠性和渐进式改进。