Prhub

#51087 [CI] Add run-all comment commands

原始 PR 作者 khluu 合并时间 2026-08-05 08:34 文件变更 3 提交数 2 评论 0 代码增减 +72 / -14

执行摘要

新增 run all/nightly CI 命令变体,评论即可触发全量测试

PR body 明确指出目的是为可信用户和已授权 PR 作者提供两个精确的、有意不公开文档化的 CI 评论命令变体:/ci run all 触发带 RUN_ALL=1 的 Buildkite 构建,/ci run nightly 触发带 RUN_ALL=1NIGHTLY=1 的构建。这样维护者无需打开 Buildkite 后台即可通过评论触发全量或 nightly 测试矩阵,同时避免在公开授权通知中宣传这些高资源消耗入口,以收敛 CI 资源使用。PR body 还专门说明已搜索过 /ci run allRUN_ALLNIGHTLY 等关键词,确认无重复 PR。

建议 CI 负责人和维护者快速阅读本 PR,重点看 RUN_CI_COMMAND_ENV 映射表的组织方式以及“授权复用、文案不宣传”的组合策略;对想扩展 CI 评论命令的仓库来说这是一个小而完整的参考实现。普通开发者无需深入了解,不影响任何模型或推理路径。

讨论亮点

本 PR 没有实质性的人类 review 讨论(review_comments 为 0),唯一的审核记录是 claude[bot] 的自动提示评论,提醒该仓库配置了手动 code review 并建议使用 @claude review。PR 最终由维护者 ywang96 直接合并。值得注意的背景是:作者 khluu 在 PR body 中明确声明该变更由 AI(OpenAI Codex)辅助实现、测试和起草,并以 draft 状态提交直到人工逐行复核;两个 commit 均带 Co-authored-by: OpenAI Codex 署名,这解释了为何代码与测试结构如此规范。

实现拆解

  1. 命令定义与精确解析.github/workflows/scripts/run_ci_command.py):新增 COMMAND_RUN_CI_ALL = "/ci run all"COMMAND_RUN_CI_NIGHTLY = "/ci run nightly" 常量,并引入 RUN_CI_COMMAND_ENV 映射表,将命令映射到需要注入 Buildkite 的环境变量(普通 /ci run 为空、run allRUN_ALL=1nightlyRUN_ALL=1 + NIGHTLY=1)。parse_command 从原来的集合判断改为 if body in {*RUN_CI_COMMAND_ENV, COMMAND_RETRY_FAILED},保持精确字符串匹配语义,杜绝 /ci run all please 之类的前缀误触发。

  2. Buildkite payload 生成扩展create_build_payload):新增 command 参数(默认 COMMAND_RUN_CI,保持旧调用方向后兼容),先校验命令必须在 RUN_CI_COMMAND_ENV 内否则抛 ValueError;随后把命令对应的环境变量合并进原有的 VLLM_CI_GITHUB_COMMENT_IDVLLM_CI_TRIGGERED_BY 基础 env,并将构建 message 改为 PR #{number} {command} by @{actor},让 Buildkite 界面可直接区分构建来源。

  3. 调用链透传 commandhandle_run_ci / run):handle_run_ci 增加 command 参数并传给 create_build_payloadrun 的分支条件从 command == COMMAND_RUN_CI 改为 command in RUN_CI_COMMAND_ENV,使三个 /ci run 变体全部走同一条授权、PR head 校验、去重、reactions 与评论确认路径,而 /ci retry 分支保持原样。

  4. 授权通知文案更新notify_authorized):把原单行提示改写为分条说明——/ci run 启动 CI 构建;/ci retry 在 PR 当前 head 有构建时重试失败任务,无构建时基于最近一次旧构建的失败任务新建构建。刻意不出现 run allnightly 字样,保持新命令低曝光。

  5. 工作流入口与测试配套.github/workflows/run-ci-command.yml 的 issue_comment 过滤条件追加两个新命令的精确匹配,与 Python 端形成双保险;test_run_ci_command.py 新增 test_run_all_sets_buildkite_environmenttest_run_nightly_sets_buildkite_environment 校验构建 message 与 env 载荷,扩展精确解析测试(含 /ci run all please 拒绝用例),并把授权通知断言收紧为逐句检查新文案且不含新命令。

文件 模块 状态 重要度
.github/workflows/scripts/run_ci_command.py CI 命令 modified 5.01
.github/workflows/scripts/test_run_ci_command.py CI 命令 modified 5.37
.github/workflows/run-ci-command.yml CI 工作流 modified 2.95

关键符号

parse_command create_build_payload handle_run_ci notify_authorized run

关键源码片段

.github/workflows/scripts/run_ci_command.py infrastructure

CI 评论命令处理的核心脚本,新增命令常量、环境变量映射、payload 生成与调用链透传,所有逻辑变更的枢纽。

# 三个 /ci run 命令变体与 retry 命令,全部按精确字符串匹配
COMMAND_RUN_CI = "/ci run"
COMMAND_RUN_CI_ALL = "/ci run all"
COMMAND_RUN_CI_NIGHTLY = "/ci run nightly"
COMMAND_RETRY_FAILED = "/ci retry"# 命令 -> 注入 Buildkite 构建的环境变量
# 普通 /ci run 不额外注入;run all 开启全量测试;nightly 在其基础上再标记夜间构建
RUN_CI_COMMAND_ENV = {
    COMMAND_RUN_CI: {},
    COMMAND_RUN_CI_ALL: {"RUN_ALL": "1"},
    COMMAND_RUN_CI_NIGHTLY: {"RUN_ALL": "1", "NIGHTLY": "1"},
}
​
​
def parse_command(body: str) -> str | None:
    # 只接受集合内的精确命令,避免 /ci run all please 这类写法误触发
    if body in {*RUN_CI_COMMAND_ENV, COMMAND_RETRY_FAILED}:
        return body
    return None
​
​
def create_build_payload(
    *,
    actor: str,
    comment_id: int,
    command: str = COMMAND_RUN_CI, # 默认保持旧行为,旧调用方无需改动
    pr: Mapping[str, Any],
) -> dict[str, Any]:
    # 未知命令直接抛错,防止非法 env 或 message 进入 Buildkite
    if command not in RUN_CI_COMMAND_ENV:
        raise ValueError(f"Unsupported run command: {command}")
​
    env = {
        "VLLM_CI_GITHUB_COMMENT_ID": str(comment_id),
        "VLLM_CI_TRIGGERED_BY": actor,
        **RUN_CI_COMMAND_ENV[command], # 把命令对应的 RUN_ALL / NIGHTLY 合入基础 env
    }
    return {
        "commit": pr["head"]["sha"],
        "branch": pr["head"]["ref"],
        # message 带上实际命令,便于在 Buildkite 界面区分构建来源
        "message": f"PR #{pr['number']} {command} by @{actor}",
        "pull_request_id": pr["number"],
        "pull_request_base_branch": pr["base"]["ref"],
        "pull_request_repository": pr["head"]["repo"]["clone_url"],
        "pull_request_labels": [label["name"] for label in pr["labels"]],
        "ignore_pipeline_branch_filters": True,
        "env": env,
        "meta_data": {
            "github-comment-id": str(comment_id),
            "github-pr-number": str(pr["number"]),
            "github-triggered-by": actor,
        },
    }
.github/workflows/scripts/test_run_ci_command.py test-coverage

测试配套主要载体,新增两个环境载荷测试并收紧精确解析与通知文案断言,是验证新命令行为的关键证据。

def test_run_all_sets_buildkite_environment(self) -> None:
    github = FakeGitHub()
    buildkite = FakeBuildkite([[], []])
​
    # /ci run all 的载荷应带 RUN_ALL=1,且不应出现 NIGHTLY
    run(make_event(COMMAND_RUN_CI_ALL), github, buildkite)
​
    payload = buildkite.created_builds[0]
    self.assertEqual(payload["message"], "PR #42 /ci run all by @reviewer")
    self.assertEqual(payload["env"]["RUN_ALL"], "1")
    self.assertNotIn("NIGHTLY", payload["env"])
​
​
def test_run_nightly_sets_buildkite_environment(self) -> None:
    github = FakeGitHub()
    buildkite = FakeBuildkite([[], []])
​
    # /ci run nightly 在 RUN_ALL=1 基础上追加 NIGHTLY=1
    run(make_event(COMMAND_RUN_CI_NIGHTLY), github, buildkite)
​
    payload = buildkite.created_builds[0]
    self.assertEqual(payload["message"], "PR #42 /ci run nightly by @reviewer")
    self.assertEqual(payload["env"]["RUN_ALL"], "1")
    self.assertEqual(payload["env"]["NIGHTLY"], "1")
​
​
def test_only_exact_ci_commands_are_accepted(self) -> None:
    # 精确匹配是核心契约:新变体可解析,但带多余词缀的写法必须拒绝
    self.assertEqual(parse_command(COMMAND_RUN_CI), COMMAND_RUN_CI)
    self.assertEqual(parse_command(COMMAND_RUN_CI_ALL), COMMAND_RUN_CI_ALL)
    self.assertEqual(parse_command(COMMAND_RUN_CI_NIGHTLY), COMMAND_RUN_CI_NIGHTLY)
    self.assertEqual(parse_command(COMMAND_RETRY_FAILED), COMMAND_RETRY_FAILED)
    self.assertIsNone(parse_command("/ci run please"))
    self.assertIsNone(parse_command("/ci run all please"))
    self.assertIsNone(parse_command(" /ci run"))

评论区精华

claude[bot] 自动 review 提示 other

claude[bot] 在 PR 上留言,说明该仓库配置了手动 code review,可评论 `@claude review` 触发一次性审查或订阅后续推送。无实质技术内容。

结论:无技术影响,PR 由维护者 ywang96 直接合并。 · 已解决

AI 辅助实现与人工复核声明 other

PR body 声明该变更由 AI(OpenAI Codex)辅助实现、测试和起草,并以 draft 状态提交直到人工逐行复核;两个 commit 均带 Co-authored-by: OpenAI Codex 署名。这是 PR 流程上的重要背景,但并非来自 review 评论。

结论:作者声明已逐行复核并能为变更负责,PR 最终合并。 · 已解决

风险与影响

  1. 命令匹配双端需同步维护:命令过滤同时存在于 .github/workflows/run-ci-command.ymlif 表达式与 run_ci_command.pyparse_command 中,本 PR 已同步修改且有测试覆盖,但未来新增命令变体时漏改任一端会导致命令被静默忽略或直接报错。
  2. CI 资源消耗放大RUN_ALL=1NIGHTLY=1 会触发比默认更重的测试矩阵,显著增加 Buildkite 资源消耗;命令虽不公开宣传,但属于纯文本命令,任何知情人可在评论区输入,目前依赖既有授权机制兜底,若将来授权配置放宽需重新评估。
  3. 环境变量语义依赖下游 pipeline:本 PR 只负责注入 RUN_ALL / NIGHTLY 环境变量,Buildkite pipeline 侧如何消费这些变量不在本 PR 验证范围内,端到端行为依赖既有 pipeline 定义正确。
  4. 文案与测试耦合notify_authorized 的文本被测试逐句断言,后续文案微调需要同步更新测试用例,否则 CI 会失败,属于轻微维护成本。

对普通贡献者无感知,但授权通知文本变得更清晰(解释了 /ci retry 在有无现有构建时的两种行为);对维护者与 CI 管理员获得快捷入口,无需进入 Buildkite 后台即可通过评论触发全量或 nightly 测试,降低操作成本;对 CI 系统新增两个命令会向 Buildkite 传递新环境变量,可能增加 CI 资源消耗,但所有入口仍走严格授权链路;对团队流程确立了“精确命令 + 授权复用 + 非公开宣传”的 CI 控制模式,为后续扩展其他命令(如定向跑某类测试)提供了可复用的映射表范式。

命令匹配双端需同步维护 RUN_ALL/NIGHTLY 放大 CI 资源消耗 命令非公开宣传依赖白名单传播 端到端构建行为未验证

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论