执行摘要
- 一句话:定时调度触发额外测试层,引入PR awareness注释
- 推荐动作:值得精读该PR的工作流设计,尤其是
_pr-awareness-comment.yml中通过HTML注释槽位替换和concurrency group序列化的实践,以及call-pr-test-extra的调度策略。对于维护多层级CI的仓库有参考价值。
功能与动机
现有每天3次的定时调度仅覆盖基础测试层(pr-test.yml),而extra-tier测试(包括#24725中移到run-ci-extra标签门控下的约50个测试,以及#25203和#25236中添加的B200/H200 8 GPU条件测试)仅通过PR标签或手动workflow_dispatch触发,缺少定时回归兜底。
实现拆解
- 新增
_pr-awareness-comment.yml可重用工作流:通过workflow_call接收workflow_kind参数,在PR body中插入/更新两个槽位(pr-test和pr-test-extra),显示对应CI的运行状态。使用actions/github-script和pulls.get/update API,通过concurrency group序列化并发写操作。
- 修改
pr-test.yml:添加run_all_tests输入参数;新增call-pr-test-extra作业,仅在schedule事件或test_parallel_dispatch=true时触发,调用pr-test-extra.yml;新增call-pr-awareness作业,在check-changes后立即更新意识块。
- 修改
pr-test-extra.yml:添加call-pr-awareness作业,确保即使PR没有run-ci-extra标签(作业被跳过)也能更新意识块,让作者看到此次运行是空操作。
- 调整健康检查跳过条件:在
SKIP_STAGE_HEALTH_CHECK中增加test_parallel_dispatch和run_all_tests条件,避免批量/全量运行时因单个阶段失败而提前终止。
- 为Stage Job添加名称:在
_pr-test-stage.yml和_pr-test-check-changes.yml中添加name字段,使GHA UI中的矩阵任务显示为“extra-a-test-1-gpu-small (0)”而非裸“(0)”,提升可读性。
关键文件:
.github/workflows/_pr-awareness-comment.yml(模块 CI工作流;类别 infra;类型 infrastructure;符号 existingBlock, extractSlot, newPrTest, newPrExtra): 新增的核心工作流,负责在PR body中维护CI意识块,实现两个工作流的运行状态展示。
.github/workflows/pr-test.yml(模块 CI工作流;类别 infra;类型 infrastructure): 主CI工作流,新增run_all_tests输入和call-pr-test-extra作业,实现调度时触发extra测试。
.github/workflows/pr-test-extra.yml(模块 CI工作流;类别 infra;类型 infrastructure): extra测试工作流,新增call-pr-awareness作业,确保即使PR无标签也能更新意识块。
.github/workflows/_pr-test-check-changes.yml(模块 CI工作流;类别 infra;类型 infrastructure): 可重用工作流,增加name字段使GHA UI显示更清晰。
.github/workflows/_pr-test-stage.yml(模块 CI工作流;类别 infra;类型 infrastructure): 可重用工作流,增加name字段使矩阵任务名称包含stage名,提升可读性。
关键符号:existingBlock, extractSlot, newPrTest, newPrExtra
关键源码片段
.github/workflows/_pr-awareness-comment.yml
新增的核心工作流,负责在PR body中维护CI意识块,实现两个工作流的运行状态展示。
# .github/workflows/_pr-awareness-comment.yml
# 可重用工作流:在 PR body 中维护 CI 意识块
name: PR Awareness Comment
on:
workflow_call:
inputs:
workflow_kind:
description: "Which workflow is calling: 'pr-test' or 'pr-test-extra'"
required: true
type: string
permissions:
pull-requests: write
jobs:
update-pr-body:
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
# 用 concurrency group 防止 pr-test 和 pr-test-extra 同时更新时发生冲突
concurrency:
group: pr-awareness-${{ github.event.pull_request.number }}
cancel-in-progress: false
steps:
- name: Update awareness block in PR body
uses: actions/github-script@v7
env:
KIND: ${{ inputs.workflow_kind }}
with:
script: |
const kind = process.env.KIND;
const { data: pr } = await github.rest.pulls.get({ ... });
const body = pr.body || '';
// 提取现有意识块,保留另一个工作流的槽位
const existingBlock = (body.match(/<!-- pr-awareness:start -->[\\s\\S]*?<!-- pr-awareness:end -->/) || [''])[0];
const prevPrTest = extractSlot(existingBlock, '<!-- slot:pr-test:start -->', '<!-- slot:pr-test:end -->');
const prevPrExtra = extractSlot(existingBlock, '<!-- slot:pr-test-extra:start -->', '<!-- slot:pr-test-extra:end -->');
// 仅更新调用者自己的槽位,另一个保持原样
// … 具体替换逻辑略
评论区精华
无Review评论;Issue中作者提供了两个Actions运行链接用于验证,合并者使用/tag-and-rerun-ci重新触发CI。未发现实质性设计争论。
风险与影响
- 风险:
- PR body并发写入:
pr-test和pr-test-extra都可能更新同一PR的意识块,虽通过concurrency group序列化,但若两个工作流同时触发(可能性低),后执行者可能覆盖前者的槽位。已通过逐槽位替换而非整体覆盖缓解。
- Extra状态未接入required check:
call-pr-test-extra的结果未加入pr-test-finish的needs:,因此定时调度下extra测试失败不会影响父运行状态(PR中仍可见),但不会阻止合入。若需严格门禁需后续跟进。
- 条件覆盖不全:
call-pr-test-extra的触发条件为github.event_name == 'schedule' || inputs.test_parallel_dispatch == true,但未包含workflow_dispatch;通过test_parallel_dispatch可模拟全量运行,但文档中未明确说明。
- 影响:对用户:无直接功能影响。对系统:定时调度会增加extra测试层的执行频率(每天3次→实际新增约50个测试及B200/H200任务),但CI资源消耗有限。对团队:extra测试获得定时回归覆盖,减少main上引入回归的风险;PR创建者能通过意识块快速了解CI状态,降低沟通成本。影响程度中等,属于CI稳定性提升。
- 风险标记:PR body并发写入风险, Extra状态未接入required check, 定时调度跳过stage health check
关联脉络
- PR #24725 [ci] Move ~50 tests under run-ci-extra label gate: 该PR引入了extra-test的标签门控机制,是本次需要为extra测试提供定时调度覆盖的直接原因。
- PR #25203 [ci] Add B200 8-gpu conditional test: 引入B200 8 GPU条件测试,属于extra-tier测试,缺少定时回归。
- PR #25236 [ci] Add H200 8-gpu conditional test: 引入H200 8 GPU条件测试,同样属于extra-tier测试。
参与讨论