如何在GitHub Action工作流中获取并判断commit状态
解答
无法直接在workflow配置的if字段中原生获取commit状态做判断——GitHub Actions的内置上下文没有暴露commit status的相关字段,需要先调用GitHub官方接口拉取对应commit的状态,再基于返回结果执行条件判断。
实现步骤
pull_request_review事件触发时,内置上下文已经自带当前PR对应头提交的SHA:${{ github.event.pull_request.head.sha }},配合工作流自动生成的secrets.GITHUB_TOKEN就能完成接口查询,不需要额外配置访问凭证。
- 先给工作流配置最小必要权限,避免接口调用无权限:
permissions: statuses: read checks: read # 若要查询Checks类型的检查结果需要添加该权限 contents: read
- 在作业中添加前置查询步骤,拉取目标commit的状态并存为步骤输出,供后续逻辑判断。如果要判断commit所有检查的聚合状态,写法如下:
jobs: ci_verify_job: runs-on: ubuntu-latest name: ci verify job steps: - name: Query commit status id: get_commit_status run: | resp=$(curl -s -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ "https://api.github.com/repos/${{ github.repository }}/commits/${{ github.event.pull_request.head.sha }}/status") # 返回的state可选值:success/pending/failure/error commit_state=$(echo "$resp" | jq -r '.state') echo "state=$commit_state" >> $GITHUB_OUTPUT
- 后续需要按状态条件执行的步骤,直接判断前置步骤的输出值即可:
- name: Run verify task if: steps.get_commit_status.outputs.state == 'success' run: | # 放置实际需要执行的作业逻辑 echo "Commit status check passed, start job"
注意事项
- 如果只需要判断某一个特定CI系统的上报状态,而非commit所有检查的聚合结果,将查询接口替换为
/commits/<sha>/statuses,用jq过滤出context字段匹配目标CI名称的条目,再提取其state值判断即可。 - 如果所用CI是通过GitHub Checks上报结果(而非传统commit status),将查询接口替换为Checks列表接口
/commits/<sha>/check-runs,过滤出目标CI对应的check条目,取conclusion字段做判断即可。 - 若存在CI状态上报延迟的情况,可以在查询步骤前加1-2分钟的等待,或者加简单重试逻辑,避免拉取到未更新的旧状态导致判断错误。
内容的提问来源于stack exchange,提问作者Darren Findlay
相关产品推荐
相关产品推荐

