执行摘要
- 一句话:添加 /rerun-group CI 命令,按测试组批量重跑
- 推荐动作:该 PR 作为一个 CI 工具改进,设计上提取公共权限检查、复用 dispatch 是值得肯定的。但是非递归 glob 问题需要修复,建议在合并前或后续 PR 中处理。整体上值得关注其设计模式,尤其是权限检查提取和组名解析的通用化思路。
功能与动机
PR 描述指出:“Current CI only supports /rerun-state and /rerun-test. This PR adds support for validating all CI related to a specific feature.” 即开发者需要一种简单的方式验证某个特性(如 HiCache、推测解码)的全部测试,而不是一个一个地手动指定测试文件。
实现拆解
-
组名解析:在 slash_command_handler.py 中新增 _known_test_groups() 和 resolve_test_group_specs() 函数。_known_test_groups() 扫描 test/registered/ 下的所有子目录作为已知组名;resolve_test_group_specs() 根据用户输入的组名找到对应目录,并 glob 匹配 test_*.py 文件列表(当前使用非递归 pattern 'test_*.py')。
-
权限检查提取:将 /rerun-test 原有的 fork PR 权限检查逻辑抽取为独立的 _check_rerun_test_permissions() 函数,使得 /rerun-group 可以复用,避免了代码重复。
-
调度函数:新增 handle_rerun_group() 函数,调用 resolve_test_group_specs() 获得文件列表,然后通过现有的 batch dispatch 机制(_dispatch_batch)派发到相应的 runner 上。
-
工作流触发:在 .github/workflows/slash-command-handler.yml 的触发条件中添加了 contains(github.event.comment.body, '/rerun-group'),使 GitHub Actions 能够识别该命令。
-
文档更新:在 .claude/skills/ci-workflow-guide/SKILL.md 中添加了 /rerun-group 命令的说明,包括组名的定义和用法。
关键文件:
scripts/ci/utils/slash_command_handler.py(模块 CI工具;类别 infra;类型 infrastructure;符号 _known_test_groups, resolve_test_group_specs, handle_rerun_test, _check_rerun_test_permissions): 核心实现,包含组名解析、调度、权限检查重构。
.github/workflows/slash-command-handler.yml(模块 CI工作流;类别 infra;类型 infrastructure): 添加 /rerun-group 触发条件。
.claude/skills/ci-workflow-guide/SKILL.md(模块 文档;类别 docs;类型 documentation): 更新 CI 命令文档。
关键符号:resolve_test_group_specs, handle_rerun_group, _check_rerun_test_permissions, _known_test_groups
关键源码片段
scripts/ci/utils/slash_command_handler.py
核心实现,包含组名解析、调度、权限检查重构。
def resolve_test_group_specs(group_name):
"""Resolve a test group name into test spec list."""
group_name = group_name.strip().strip('/')
# security checks
if not group_name or group_name.startswith('.') or '/.' in group_name or '..' in group_name.split('/'):
return [], 'Invalid test group.'
group_dir = os.path.join('test', 'registered', group_name)
if not os.path.isdir(group_dir):
return [], f'Unknown test group `{group_name}`. Known: {_known_test_groups()}'
# glob test files (non-recursive)
test_files = sorted(glob.glob(os.path.join(group_dir, 'test_*.py')))
return [os.path.relpath(p, 'test') for p in test_files], None
评论区精华
主要讨论集中在递归 glob 的问题。gemini-code-assist 和 chatgpt-codex-connector 均指出 resolve_test_group_specs 中使用的是非递归 glob,无法匹配子目录中的测试,可能导致某些组(如 openai_server)的测试被遗漏。建议改用 **/test_*.py 加 recursive=True。目前该问题未被修复,是一个已知的局限。此外,作者通过测试验证了命令的正确性,例如 /rerun-group hicache 成功触发了 HiCache 相关测试。
- 递归 glob 以包含子目录测试 (correctness): 建议未被采纳,当前版本仍使用非递归 glob,存在遗漏子目录测试的风险。
风险与影响
关联脉络
参与讨论