执行摘要
- 一句话:修复 /rerun-test 的目录递归与多 pool 调度问题
- 推荐动作:建议 CI 维护者和经常使用
/rerun-test 的开发者阅读此 PR,了解 glob 递归处理和多 pool 扇出的设计;尤其是 _extract_runner_configs 返回列表这一变更,可能影响依赖该函数的其他调用方。
功能与动机
作为 #26422 的后续,/rerun-test 在实际使用中暴露了 glob 不递归和多注册池仅第一个生效的问题。具体示例:/rerun-test registered/attention/unittest/* 返回无匹配,因为 glob 的 * 不跨越 /;文件若同时注册了 4-gpu-b200 和 1-gpu-large,_extract_runner_config 仅返回第一个 pool,导致所有测试只调度到第一个 pool。
实现拆解
- 在
expand_glob_spec 函数中,添加目录递归步骤:当 glob 匹配到目录时,递归搜索 test_*.py。
- 将
_extract_runner_config 重写为 _extract_runner_configs,使用 re.finditer 返回所有 register_cuda_ci 调用的 runner_config 和参数字符串。
- 将
detect_suite 和 _resolve_test_spec 改为返回列表,使一个文件可以对应多个 dispatch 项。
- 在
handle_rerun_test 中,迭代 dispatch 列表,基于 (mode, runs_on, test_command) 去重,确保每个 pool 调度一次但不丢失多 pool 扇出。
- 在
find_workflow_run_url 中,当 display_title 以 ... 结尾时,使用前缀匹配,避免因 GitHub 截断而找不到运行 URL。
关键文件:
scripts/ci/utils/slash_command_handler.py(模块 CI 脚本;类别 infra;类型 infrastructure;符号 _extract_runner_config, _extract_runner_configs, expand_glob_spec, detect_suite): 该文件是整个 /rerun-test 命令处理的核心,所有修复都集中于此。
关键符号:_extract_runner_configs, expand_glob_spec, detect_suite, _resolve_test_spec, handle_rerun_test, find_workflow_run_url
评论区精华
维护者 ch-wan 批准 PR,并引用 #26517 中的实际运行结果确认修复生效:'It works: https://github.com/sgl-project/sglang/pull/26517#issuecomment-4569234604'。
风险与影响
- 风险:
1) 递归目录可能意外匹配深层目录的非预期测试文件,但限定为 test_*.py 模式,风险低。
2) 多 pool 扇出可能导致同一测试在多个 pool 上运行,增加 CI 负载,但这是预期行为且过去应该如此。
3) display_title 前缀匹配可能错误匹配不相关的运行,但由于命令长度足够且前缀唯一,碰撞概率极低。
4) 对现有使用明确 glob 模式(如 **/test_*.py)的用户无影响。
- 影响:影响范围:所有使用
/rerun-test 命令的开发者。改进后,命令能正确匹配嵌套子目录中的测试,并自动在测试文件注册的所有 runner pool 上调度。这提高了 CI 重运行准确性和效率,减少了人工 workaround。
- 风险标记:全局匹配行为变更, 调度重复风险, display_title 前缀匹配准确度
关联脉络
- PR #26422 原始 /rerun-test 实现: 本 PR 是基于 #26422 的后续修复。
- PR #26517 问题示例 PR: 暴露了当前 PR 所修复的 glob 不递归问题。
参与讨论