如何获取GitHub Pull Request中含未上报第三方的必填状态检查状态?
获取GitHub Pull Request中所有必填状态检查(含未上报项)的方法
要拿到PR里所有必填状态检查(包括Jenkins等第三方工具尚未上报结果的项),需要结合分支保护规则和已提交的检查结果来对比,具体步骤如下:
核心思路
必填状态检查是在仓库的分支保护设置中定义的,不管是否已经执行,这些规则都存在。我们需要:
- 先获取目标分支的所有必填检查规则列表
- 再获取PR当前已完成的所有检查结果(包括GitHub Actions和第三方工具上报的)
- 对比两者,找出未上报的必填检查项
具体实现(用gh cli + jq)
1. 定义变量
OWNER="你的仓库所有者" REPO="仓库名称" PR_NUMBER="PR编号"
2. 获取PR的目标分支和HEAD提交SHA
# 获取PR的目标分支 TARGET_BRANCH=$(gh pr view $PR_NUMBER --repo $OWNER/$REPO --json baseRefName --jq '.baseRefName') # 获取PR HEAD提交的SHA COMMIT_SHA=$(gh pr view $PR_NUMBER --repo $OWNER/$REPO --json headRefOid --jq '.headRefOid')
3. 获取分支保护中的必填检查列表
这个API会返回该分支要求的所有必填检查名称,不管是否已经执行:
REQUIRED_CHECKS=$(gh api /repos/$OWNER/$REPO/branches/$TARGET_BRANCH/protection/required_status_checks --json contexts --jq '.contexts | sort')
4. 获取已上报的检查结果
需要同时获取两种类型的检查结果(部分第三方工具会用旧的Status API而不是Checks API):
# 获取已上报的Check Runs(包括GitHub Actions和用Checks API的第三方工具) EXISTING_CHECK_RUNS=$(gh api /repos/$OWNER/$REPO/commits/$COMMIT_SHA/check-runs --json check_runs --jq '[.check_runs[].name] | sort') # 获取已上报的Statuses(用旧Status API的第三方工具) EXISTING_STATUSES=$(gh api /repos/$OWNER/$REPO/commits/$COMMIT_SHA/statuses --json context --jq '[.[].context] | sort')
5. 对比找出未上报的必填检查
合并已有的检查结果,再和必填列表求差集:
# 合并并去重已有的检查名称 ALL_EXISTING=$(echo "$EXISTING_CHECK_RUNS $EXISTING_STATUSES" | jq -s 'add | unique | sort') # 计算差集,得到未上报的必填检查 MISSING_REQUIRED=$(echo "$REQUIRED_CHECKS $ALL_EXISTING" | jq -s '.[0] - .[1]')
6. 输出结果
echo "尚未上报的必填检查项:" echo $MISSING_REQUIRED | jq -r '.[]'
注意事项
- 调用分支保护API需要仓库的管理员权限,否则会返回权限错误。
- 部分第三方CI/CD工具可能使用旧的Status API上报结果,因此必须同时获取Check Runs和Statuses两种数据,避免遗漏。
- 如果仓库有多个分支保护规则,确保获取的是PR目标分支对应的规则。
内容的提问来源于stack exchange,提问作者Eyal Gerber
相关产品推荐
相关产品推荐

