Prhub

#25387 ci: standalone PR awareness workflow (decouple from pr-test reusable chain)

原始 PR 作者 hnyls2002 合并时间 2026-05-15 18:20 文件变更 4 提交数 5 评论 2 代码增减 +107 / -146

执行摘要

PR awareness 独立 workflow,降低 pulls:write 传播

PR body 中描述:'Decouples PR awareness from pr-test.yml's reusable workflow chain so pulls: write no longer propagates transitively. Fixes release-branch-cut.yml startup_failure.' 关联 #25320 和 #25322,进一步收拢 CI 权限模型。

值得精读,尤其是独立工作流模式、重试策略和权限最小化设计。对于希望优化 CI 安全及解耦的团队有参考价值。

讨论亮点

该 PR 未引发 review 讨论,仅有一条 bot 自动回复和一条 /tag-and-rerun-ci 命令触发。变更经过作者多次自审 commit 后直接合入。

实现拆解

  1. 删除原 awareness 工作流:移除 .github/workflows/_pr-awareness-comment.yml(123 行),该工作流通过 workflow_call 在 pr-test 链中更新 PR body 的 awareness 块。
  2. 新增独立工作流 pr-states.yml:基于 pull_request 事件(opened、synchronize、reopened、labeled、unlabeled)独立运行,通过 GitHub API 获取对应 workflow run 并拼接 CI 状态块(支持重试机制和 skipped 过滤)。
  3. 修改 pr-test.yml 和 pr-test-extra.yml:删除 call-pr-awareness job,将 pull-requests 权限从 write 降级为 read,不再需要向 PR 写入能力。
  4. Commit 演进:从最初的移动 awareness 开始,逐步完善 skipped 过滤、移除多余分隔符、重命名为 pr-states、删除一次性迁移代码,最终形成清晰的内聚工作流。
文件 模块 状态 重要度
.github/workflows/_pr-awareness-comment.yml CI 工作流 removed 7.22
.github/workflows/pr-states.yml CI 工作流 added 6.77
.github/workflows/pr-test.yml CI 工作流 modified 4.03
.github/workflows/pr-test-extra.yml CI 工作流 modified 4.05

关键符号

findRunBySha findRunWithRetry isReal

关键源码片段

.github/workflows/pr-states.yml infrastructure

新增的独立工作流,替代旧 awareness 功能,通过 pull_request 事件触发,包含重试和 skipped 过滤。

/* pr-states.yml – 核心 update-pr-body 步骤的 Script */
const sha = context.payload.pull_request.head.sha;
const labels = context.payload.pull_request.labels.map(l => l.name);
const hasExtra = labels.includes('run-ci-extra');// 按 workflow 文件名查找最近一次运行(最多重试 6 次,间隔 5 秒)
async function findRunBySha(workflowFile) {
  const { data } = await github.rest.actions.listWorkflowRuns({
    owner: context.repo.owner,
    repo: context.repo.repo,
    workflow_id: workflowFile,
    head_sha: sha,
    per_page: 1,
  });
  return data.workflow_runs[0] || null;
}async function findRunWithRetry(workflowFile, maxAttempts = 6, delayMs = 5000) {
  for (let i = 0; i < maxAttempts; i++) {
    const run = await findRunBySha(workflowFile);
    if (run) return run;
    if (i < maxAttempts - 1) await new Promise(r => setTimeout(r, delayMs));
  }
  return null;
}// 跳过被完全跳过 (skipped) 的运行(如未触发 label 时)
const isReal = (run) => run && run.conclusion !== 'skipped';// 查找 pr-test 和 pr-test-extra 的运行结果
const ptRun = await findRunWithRetry('pr-test.yml');
const peRun = hasExtra ? await findRunWithRetry('pr-test-extra.yml') : null;const ptText = isReal(ptRun) ? `[Run #${ptRun.id}](${ptRun.html_url})` : '_Not run yet_';
const peText = !hasExtra
  ? ':warning: **Not enabled** — add `run-ci-extra` label to opt in.'
  : (isReal(peRun) ? `[Run #${peRun.id}](${peRun.html_url})` : ':warning: **Not run on latest push**');// 构建新状态块并替换 PR body
const newBlock = [
  '<!-- pr-states:start -->',
  '---',
  '### CI States',
  '',
  `Latest PR Test: ${ptStart}${ptText}${ptEnd}`,
  `Latest PR Test (Extra): ${peStart}${peText}${peEnd}`,
  '<!-- pr-states:end -->',
].join('\n');

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  1. 权限降级风险:pr-test.yml 和 pr-test-extra.yml 的 pull-requests 从 write 降为 read,若其他未察觉的 job 隐性依赖 write 权限(如 label 操作),可能失效。但经检查,这些工作流内无其他需要写 PR 的步骤。
  2. 独立工作流并发控制:pr-states.yml 使用 concurrency 组序列化,但若与旧版 awareness 同时运行(过渡期),可能互相覆盖。但由于旧版已被移除,不存在此问题。
  3. API 依赖:pr-states.yml 依赖 GitHub API 查询 workflow run,若 API 限速或暂不可用,状态块可能延迟更新,但使用者有重试逻辑(最多 6 次,每次 5s)。
  4. 无测试覆盖:纯 YAML/JS 变更,无单元测试或集成测试,需通过实际 PR 事件验证。

对 CI 系统:PR awareness(CI 状态块)更新与主测试链解耦,权限隔离更严格,修复了 release-branch-cut 的启动故障。对开发者:无直接可见影响;PR body 底部的状态块依然由独立工作流维护。对运维:减少了 CI 工作流之间隐式权限传递,降低安全风险。影响范围限于 GitHub Actions 配置,不涉及业务代码。

权限降级影响未知引用 独立工作流并发控制 无测试覆盖 依赖 GitHub API 可用性

关联 Issue

#25320 ci: dispatch pr-test-extra.yml from pr-test.yml on the scheduled cron
#25322 Deprecate /rerun-stage; scrub CUDA target_stage infra

完整报告

参与讨论