如何通过命令行/脚本检测GitHub拉取请求是否因审核不足而被阻止
如何通过命令行/脚本检测GitHub拉取请求是否因审核不足而被阻止
我来帮你搞定这个需求!要检测PR是不是因为审核不足被阻止,咱们可以用GitHub官方的CLI工具(gh)或者直接调用GitHub REST API,两种方法都能实现脚本化的检测,下面给你详细拆解:
方法一:用GitHub CLI(gh)实现(推荐,更简单)
GitHub CLI是官方提供的命令行工具,不用自己处理API授权的细节,非常适合脚本场景。
前置准备
先确保你已经安装了gh,并且完成了登录:
gh auth login
脚本示例
下面的脚本会检测指定PR是否被阻止,并且判断是否是因为审核不足导致的:
# 替换成你的PR编号 PR_NUMBER=123 # 获取PR的关键状态数据 PR_DATA=$(gh pr view $PR_NUMBER --json mergeStateStatus,reviewDecision,requiredApprovingReviewCount,reviewRequests) # 解析JSON字段 MERGE_STATUS=$(echo $PR_DATA | jq -r '.mergeStateStatus') REVIEW_DECISION=$(echo $PR_DATA | jq -r '.reviewDecision') REQUIRED_REVIEWS=$(echo $PR_DATA | jq -r '.requiredApprovingReviewCount') PENDING_REQUESTS=$(echo $PR_DATA | jq -r '.reviewRequests.users | length') # 判断并输出结果 if [ "$MERGE_STATUS" == "BLOCKED" ]; then echo "PR 当前被阻止,原因排查:" if [ "$REVIEW_DECISION" == "REVIEW_REQUIRED" ]; then echo "- 审核不足:分支保护规则要求至少 $REQUIRED_REVIEWS 个有效审核(审核人不能是最后提交者)" if [ $PENDING_REQUESTS -gt 0 ]; then echo "- 还有 $PENDING_REQUESTS 个待处理的审核请求" fi fi # 你还可以在这里添加其他阻止原因的检测,比如状态检查失败、分支冲突等 else echo "PR 当前可以正常合并" fi
字段说明
mergeStateStatus:返回BLOCKED表示PR被阻止reviewDecision:返回REVIEW_REQUIRED说明审核数未达标(已经自动排除了最后提交者的无效审核)requiredApprovingReviewCount:分支保护规则要求的最少有效审核数
方法二:直接调用GitHub REST API(适合不想装gh的场景)
如果不想安装GitHub CLI,也可以直接用curl调用API,需要先生成一个个人访问令牌(PAT),权限要勾选repo范围。
脚本示例
# 替换成你的信息 PR_NUMBER=123 OWNER="你的用户名或组织名" REPO="仓库名称" PAT="你的个人访问令牌" # 获取PR基本信息 PR_DATA=$(curl -s -H "Authorization: token $PAT" \ "https://api.github.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER") # 获取目标分支的保护规则 PROTECTION_DATA=$(curl -s -H "Authorization: token $PAT" \ "https://api.github.com/repos/$OWNER/$REPO/branches/$(echo $PR_DATA | jq -r '.base.ref')/protection") # 解析关键字段 MERGEABLE=$(echo $PR_DATA | jq -r '.mergeable') REVIEW_DECISION=$(echo $PR_DATA | jq -r '.review_decision') REQUIRED_REVIEWS=$(echo $PROTECTION_DATA | jq -r '.required_pull_request_reviews.required_approving_review_count // 0') # 判断并输出结果 if [ "$MERGEABLE" == "false" ]; then echo "PR 当前被阻止,原因排查:" if [ "$REVIEW_DECISION" == "REVIEW_REQUIRED" ]; then echo "- 审核不足:分支保护规则要求至少 $REQUIRED_REVIEWS 个有效审核,且审核人不能是最后提交者" fi # 可扩展检测其他阻止原因,比如冲突、状态检查失败等 else echo "PR 当前可以正常合并" fi
注意点
GitHub API会自动处理“审核人不能是最后提交者”的规则——如果最后提交者自己审核了PR,这个审核不会被计入有效审核数,所以只要review_decision返回REVIEW_REQUIRED,就说明当前有效审核数没达到分支保护的要求。
备注:内容来源于stack exchange,提问作者Eyal Gerber
相关产品推荐
相关产品推荐

