如何从命令行重跑GitHub Action并更新Pull Request状态检查
解决GitHub Actions Workflow Dispatch重跑后PR状态检查不更新的问题
问题原因
用gh workflow run触发Workflow Dispatch时,工作流的运行上下文是目标分支而非Pull Request,GitHub不会自动将这次运行关联到PR的状态检查——哪怕运行的是同一提交,PR页面也不会识别为对应的状态更新。
解决方案
方案1:直接重跑PR触发的原有工作流实例(最可靠)
不要用Workflow Dispatch重新触发,而是找到PR对应的原始工作流运行实例并重跑,这样会自动关联PR状态检查:
- 先列出目标分支的工作流运行,找到PR触发的那一条的ID:
gh run list --branch <你的分支名> --workflow <工作流文件名.yml> - 用找到的运行ID重跑:
gh run rerun <运行ID>
方案2:通过Workflow Dispatch触发时手动关联PR状态检查
如果必须用Workflow Dispatch触发,需要在工作流中添加步骤,手动调用GitHub API更新对应提交的状态检查:
- 在你的工作流文件中,添加如下步骤(放在合适的位置,比如开始和结束时分别更新状态):
# 工作流开始时标记状态为运行中 - name: Mark PR check as in progress if: github.event_name == 'workflow_dispatch' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} COMMIT_SHA: ${{ github.sha }} CHECK_NAME: "你的状态检查名称" # 必须和PR页面显示的检查名称完全一致 run: | curl -X POST \ -H "Authorization: token $GITHUB_TOKEN" \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/repos/${{ github.repository }}/statuses/$COMMIT_SHA \ -d '{"state":"in_progress","context":"'"$CHECK_NAME"'","description":"Workflow Dispatch 重跑中"}' # 工作流结束后根据结果标记状态 - name: Mark PR check as completed if: github.event_name == 'workflow_dispatch' if: always() env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} COMMIT_SHA: ${{ github.sha }} CHECK_NAME: "你的状态检查名称" RUN_STATUS: ${{ job.status }} run: | if [ "$RUN_STATUS" = "success" ]; then STATE="success" DESC="重跑成功" elif [ "$RUN_STATUS" = "failure" ]; then STATE="failure" DESC="重跑失败" else STATE="error" DESC="重跑异常" fi curl -X POST \ -H "Authorization: token $GITHUB_TOKEN" \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/repos/${{ github.repository }}/statuses/$COMMIT_SHA \ -d '{"state":"'"$STATE"'","context":"'"$CHECK_NAME"'","description":"'"$DESC"'"}' - 触发时指定PR的head提交SHA而非分支名,确保更新的是PR对应的提交:
# 先获取PR的head提交SHA PR_HEAD_SHA=$(gh pr view <你的PR编号> --json headSha --jq .headSha) gh workflow run workflow_file_name.yml --sha "$PR_HEAD_SHA"
内容的提问来源于stack exchange,提问作者Eyal Gerber
相关产品推荐
相关产品推荐

