如何在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}次)`); } }
关键细节说明
触发时机:
- 主触发事件为
pull_request_review.submitted,每次有人提交评审(批准、请求修改、评论)都会触发工作流,实时响应评审状态变化。 - 额外添加
pull_request的触发类型,确保PR状态变更时(如代码更新、重新打开)也会重新检查批准次数。
- 主触发事件为
有效批准统计:
- 过滤PR作者自己的批准,避免自批凑数。
- 仅统计状态为
APPROVED的评审,若评审人撤回批准(状态变为CHANGES_REQUESTED或DISMISSED),会自动排除,保证计数准确。
标签逻辑:
- 达到批准次数时自动添加标签,标签已存在则不重复操作。
- 未达到次数时,若之前已添加过标签则自动移除,确保标签状态与批准状态一致。
权限配置:
在仓库的「Settings > Actions > General」中,将「Workflow permissions」设置为「Read and write permissions」,确保工作流有权限修改PR标签。
扩展方案
如果需要对应不同批准次数设置多个标签(比如1次批准加needs-1-more-approval,2次加ready-to-merge),可修改脚本逻辑,增加多组阈值和标签的判断分支即可。
内容的提问来源于stack exchange,提问作者kkkkkkkkkkkkkkkkk
相关产品推荐
相关产品推荐

