# PR #22534 完整报告

- 仓库：`sgl-project/sglang`
- 标题：ci: skip full rerun when sgl-kernel wheel already built
- 合并时间：2026-04-14 11:32
- 原文链接：http://prhub.com.cn/sgl-project/sglang/pull/22534

---

# 执行摘要
本次 PR 优化了 CI 重跑逻辑，针对包含 sgl-kernel 变更的 PR，当使用 `/rerun-failed-ci` 命令时，通过检查 `sgl-kernel-build-wheels` 任务是否已为当前提交成功构建，来决定是进行全量重跑还是仅重跑失败任务。这避免了不必要的全量测试触发，特别是减少了不稳定测试（如 MMLU TorchAO 测试）导致的无限循环，提升了 CI 效率和开发体验。变更范围小，风险可控，已合并到主分支。

# 功能与动机
**为什么做**：原逻辑在 PR 有 sgl-kernel 变更时，使用 `/rerun-failed-ci` 会强制全量重跑以确保内核轮子重新构建。但如果轮子已构建成功，全量重跑会重新触发所有测试，包括不稳定的测试（如 PR body 中提到的 "MMLU TorchAO test that fluctuates at the 0.63 boundary"），导致测试随机失败并触发另一次全量重跑，形成无限循环。

**要解决的问题**：避免不必要的全量重跑，减少资源浪费和不稳定测试的影响，提升 CI 效率。

# 实现拆解
修改集中在 `scripts/ci/utils/slash_command_handler.py` 文件的 `handle_rerun_failed_ci` 函数中：

1. **逻辑调整**：
 - 原代码：检测到 sgl-kernel 变更时，直接使用 `rerun()` 进行全量重跑。
 - 新代码：检测到 sgl-kernel 变更时，先检查当前提交的 GitHub check runs 中 `sgl-kernel-build-wheels` 任务是否已成功。

2. **关键代码块**：
   ```python
   kernel_wheel_built = False
   if sgl_kernel_changes:
       try:
           check_runs = gh_repo.get_commit(head_sha).get_check_runs()
           for cr in check_runs:
               if "sgl-kernel-build-wheels" in cr.name and cr.conclusion == "success":
                   kernel_wheel_built = True
                   print(f"sgl-kernel-build-wheels already passed (check run {cr.id}) - using rerun_failed_jobs")
                   break
           if not kernel_wheel_built:
               print("sgl-kernel-build-wheels has not passed yet - will use full rerun")
       except Exception as e:
           print(f"Failed to check sgl-kernel-build-wheels status: {e} - falling back to full rerun")
   ```

3. **条件判断更新**：在重跑失败工作流时，条件从 `if sgl_kernel_changes:` 改为 `if sgl_kernel_changes and not kernel_wheel_built:`，确保仅当轮子未构建时才全量重跑。

# 评论区精华
review 中仅有一条实质性讨论，由 gemini-code-assist[bot] 提出：

> "The API call to `get_check_runs()` is not wrapped in a `try-except` block. If this call fails due to network issues, GitHub API downtime, or rate limiting, the entire slash command handler will crash without providing feedback to the user."

**讨论要点**：强调了异常处理的重要性，确保在 API 调用失败时脚本能优雅回退。作者 jasperjiaguo 回复 "done"，并在最终代码中添加了 try-except 块，失败时回退到全量重跑，保证了鲁棒性。

# 风险与影响
**技术风险**：
- 新增的 GitHub API 调用可能因网络问题或速率限制失败，但已通过 try-except 处理，失败时回退到安全默认行为（全量重跑）。
- 逻辑依赖 `sgl-kernel-build-wheels` 检查运行的准确命名和状态，如果任务名称变更或状态报告延迟 / 错误，可能导致误判（例如轮子已构建但被误认为未构建，触发不必要全量重跑）。

**影响评估**：
- **正面影响**：减少 CI 资源消耗，加快重跑速度，降低不稳定测试的干扰。
- **影响范围**：仅影响使用 `/rerun-failed-ci` 命令且 PR 包含 sgl-kernel 变更的场景，不影响其他 CI 功能或生产代码。
- **兼容性**：保持向后兼容，因为失败时回退到原逻辑。

# 关联脉络
从近期历史 PR 分析看，本 PR 属于 CI 基础设施优化系列的一部分：
- PR #22733 为 GB200 夜间流水线添加手动触发和环境门控，保护共享集群资源。
- PR #22727 回滚 CUDA 版本升级以解决内核测试问题。
- PR #22653 移除 Dockerfile 中失效的缓存复制指令，修复 CI 构建失败。

**共同趋势**：这些 PR 都关注 CI 的稳定性、效率和资源管理，反映了团队在持续改进 CI/CD 流水线，以减少维护负担并提升开发体验。本 PR 通过智能检查优化重跑逻辑，是这一趋势的具体体现。