You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Github Actions中实现PR获指定批准次数后更新/添加标签?

在GitHub Actions中实现PR批准次数达标后的标签自动化

完全可以实现PR获得指定次数批准后自动添加/更新标签的功能,无需依赖仅支持路径/分支规则的labeler工具。以下是具体实现方案:

核心实现思路

借助GitHub Actions的pull_request_review事件触发工作流,通过调用GitHub REST API统计PR的有效批准次数,达到设定阈值时自动添加或调整标签。

完整Workflow配置

在仓库的.github/workflows/目录下创建auto-label-on-approval.yml文件,内容如下:

name: Auto Label on PR Approvals
on:
  # 每次提交PR评审时触发
  pull_request_review:
    types: [submitted]
  # 可选:PR创建、重新打开或代码同步时,重新检查批准状态
  pull_request:
    types: [opened, reopened, synchronize]

jobs:
  manage-label:
    runs-on: ubuntu-latest
    steps:
      - name: Check approvals and update label
        uses: actions/github-script@v7
        with:
          script: |
            // 自定义配置:按需修改以下参数
            const REQUIRED_APPROVALS = 2; // 需要的有效批准次数
            const TARGET_LABEL = 'ready-to-merge'; // 目标标签名

            // 获取当前PR的所有评审记录
            const { data: reviews } = await github.rest.pulls.listReviews({
              owner: context.repo.owner,
              repo: context.repo.repo,
              pull_number: context.issue.number
            });

            // 统计有效批准:排除PR作者自批,只保留状态为APPROVED的评审
            const validApprovals = reviews.filter(review => {
              return review.state === 'APPROVED' && review.user.login !== context.payload.pull_request.user.login;
            });
            const approvalCount = validApprovals.length;

            // 获取PR当前已有的标签
            const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number
            });
            const hasTargetLabel = currentLabels.some(label => label.name === TARGET_LABEL);

            // 根据批准次数处理标签
            if (approvalCount >= REQUIRED_APPROVALS) {
              if (!hasTargetLabel) {
                await github.rest.issues.addLabels({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: context.issue.number,
                  labels: [TARGET_LABEL]
                });
                console.log(`已添加标签 "${TARGET_LABEL}",当前有效批准次数:${approvalCount}`);
              } else {
                console.log(`标签 "${TARGET_LABEL}" 已存在,当前有效批准次数:${approvalCount}`);
              }
            } else {
              if (hasTargetLabel) {
                await github.rest.issues.removeLabel({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: context.issue.number,
                  name: TARGET_LABEL
                });
                console.log(`已移除标签 "${TARGET_LABEL}",当前有效批准次数:${approvalCount}(未达到要求的${REQUIRED_APPROVALS}次)`);
              } else {
                console.log(`无需操作,当前有效批准次数:${approvalCount}(未达到要求的${REQUIRED_APPROVALS}次)`);
              }
            }

关键细节说明

  1. 触发时机:

    • 主触发事件为pull_request_review.submitted,每次有人提交评审(批准、请求修改、评论)都会触发工作流,实时响应评审状态变化。
    • 额外添加pull_request的触发类型,确保PR状态变更时(如代码更新、重新打开)也会重新检查批准次数。
  2. 有效批准统计:

    • 过滤PR作者自己的批准,避免自批凑数。
    • 仅统计状态为APPROVED的评审,若评审人撤回批准(状态变为CHANGES_REQUESTED或DISMISSED),会自动排除,保证计数准确。
  3. 标签逻辑:

    • 达到批准次数时自动添加标签,标签已存在则不重复操作。
    • 未达到次数时,若之前已添加过标签则自动移除,确保标签状态与批准状态一致。
  4. 权限配置:
    在仓库的「Settings > Actions > General」中,将「Workflow permissions」设置为「Read and write permissions」,确保工作流有权限修改PR标签。

扩展方案

如果需要对应不同批准次数设置多个标签(比如1次批准加needs-1-more-approval,2次加ready-to-merge),可修改脚本逻辑,增加多组阈值和标签的判断分支即可。

内容的提问来源于stack exchange,提问作者kkkkkkkkkkkkkkkkk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:41:21