如何在GitHub Push触发的Workflow中获取PR创建者与审批者信息?
如何在Push触发的GitHub Workflow中获取前置PR的创建者和审批者信息
一、获取PR信息的最佳实现方式
推送到main分支的提交通常对应合并的Pull Request,核心思路是通过提交SHA关联到对应的PR,再通过GitHub API提取所需信息,推荐使用官方的gh命令行工具或actions/github-script Action简化操作:
方法1:使用gh命令行(简洁高效)
在Workflow中添加以下步骤(需确保已配置GITHUB_TOKEN授权):
# 获取当前推送提交关联的PR编号 PR_NUMBER=$(gh pr view --json number --jq '.number' "$GITHUB_SHA") # 如果存在关联PR,提取创建者和审批者 if [ -n "$PR_NUMBER" ]; then # 获取PR创建者 PR_CREATOR=$(gh pr view "$PR_NUMBER" --json author --jq '.author.login') # 获取所有审批者(筛选状态为APPROVED的评审) PR_APPROVERS=$(gh pr view "$PR_NUMBER" --json reviews --jq '.reviews[] | select(.state=="APPROVED") | .author.login' | paste -sd "," -) # 可将信息存入环境变量或写入文件,供后续步骤使用 echo "PR_CREATOR=$PR_CREATOR" >> $GITHUB_ENV echo "PR_APPROVERS=$PR_APPROVERS" >> $GITHUB_ENV fi
方法2:使用actions/github-script(灵活可编程)
适合需要复杂逻辑处理的场景,示例Step如下:
- name: 获取PR创建者和审批者信息 uses: actions/github-script@v7 with: script: | // 通过提交SHA获取关联的PR列表 const { data: pulls } = await github.rest.pulls.list({ owner: context.repo.owner, repo: context.repo.repo, state: 'closed', head: context.sha }); if (pulls.length > 0) { const pr = pulls[0]; // 提取PR创建者 const creator = pr.user.login; // 获取所有审批者 const { data: reviews } = await github.rest.pulls.listReviews({ owner: context.repo.owner, repo: context.repo.repo, pull_number: pr.number }); const approvers = reviews .filter(review => review.state === 'APPROVED') .map(review => review.user.login); // 将信息输出到环境变量 core.exportVariable('PR_CREATOR', creator); core.exportVariable('PR_APPROVERS', approvers.join(',')); console.log(`PR创建者: ${creator}`); console.log(`审批者: ${approvers.join(', ')}`); } else { console.log('当前提交无关联的Pull Request'); }
二、设计层面的最优方案
要保持Push触发主Workflow的同时获取PR信息,推荐以下两种架构:
方案1:主流程+辅助Job分离
- 保留原有的构建、部署Job不变,新增一个独立的辅助Job,专门负责PR信息的收集与记录
- 辅助Job依赖主Job完成后执行(通过
needs关键字关联),确保信息收集不影响核心部署流程 - 优势:核心流程与辅助解耦,便于后续修改或扩展信息记录逻辑
方案2:嵌入Step到主Workflow
- 在原Workflow的构建/部署步骤前后,插入PR信息收集的Step
- 将收集到的信息作为构建制品的元数据(比如写入部署日志、附加到Docker镜像标签、存入GitHub Artifact)
- 优势:流程紧凑,无需额外Job调度,适合信息需与制品强关联的场景
关键注意事项
- 权限配置:默认的
GITHUB_TOKEN已包含pull_requests: read权限,无需额外申请 - 异常处理:需添加判断逻辑,处理直接推送(无PR合并)的场景,避免流程中断
- 信息持久化:根据需求选择存储方式,比如写入GitHub Artifact供后续查询,或同步到内部部署系统的记录中
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

