如何在GitHub Actions中将草稿PR转为待审PR时移除旧工作流运行?
解决草稿PR转待审时旧工作流运行未自动取消的问题
GitHub 默认不会在 PR 状态变更时自动取消旧的工作流运行,你可以通过以下两种方式处理:
1. 手动取消旧运行
直接进入 PR 的「Actions」标签页,找到所有处于「in progress」或「queued」状态的旧运行,点击右上角的「Cancel workflow」按钮即可终止这些运行。这种方式适合偶尔处理少量PR的场景。
2. 自动化取消旧运行
通过 GitHub Actions 配合 API 实现自动取消当前PR的旧运行,推荐使用现成的社区 Action 简化操作:
在你的工作流配置中添加专门的 job,当 PR 转为 ready_for_review 状态时触发,自动取消该PR下的其他未完成运行:
jobs: # 保留你原有的构建/测试 job build-test: runs-on: ubuntu-latest # ... 你的原有配置 # 添加取消旧运行的 job cancel-previous-runs: runs-on: ubuntu-latest # 仅在PR转为待审状态时触发 if: github.event_name == 'pull_request' && github.event.action == 'ready_for_review' steps: - name: Cancel incomplete workflow runs uses: styfle/cancel-workflow-action@0.11.0 with: access_token: ${{ github.token }} # 可选:指定要取消的工作流名称,不指定则取消当前PR下所有同工作流的旧运行 workflow_id: ${{ github.workflow }}
如果你不想使用第三方 Action,也可以自行编写脚本调用 GitHub API 实现:
jobs: cancel-previous-runs: runs-on: ubuntu-latest if: github.event_name == 'pull_request' && github.event.action == 'ready_for_review' steps: - name: Cancel old runs via GitHub API env: PR_NUMBER: ${{ github.event.pull_request.number }} OWNER: ${{ github.repository_owner }} REPO: ${{ github.event.repository.name }} CURRENT_RUN_ID: ${{ github.run_id }} GITHUB_TOKEN: ${{ github.token }} run: | # 获取当前PR下所有未完成的运行 RUNS=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \ "https://api.github.com/repos/$OWNER/$REPO/actions/runs?pull_requests=$PR_NUMBER&status=in_progress") # 过滤出除当前运行外的所有运行ID RUN_IDS=$(echo "$RUNS" | jq -r '.workflow_runs[] | select(.id != $CURRENT_RUN_ID) | .id') # 逐个取消运行 for ID in $RUN_IDS; do echo "Canceling run $ID..." curl -X POST -H "Authorization: token $GITHUB_TOKEN" \ "https://api.github.com/repos/$OWNER/$REPO/actions/runs/$ID/cancel" done
注意事项
- 默认的
${{ github.token }}已拥有足够权限取消工作流运行,无需额外配置个人访问令牌。 - 若仓库为私有仓库,确保工作流权限设置中开启了「Actions: Write」权限(默认已开启)。
内容的提问来源于stack exchange,提问作者chetsrock
相关产品推荐
相关产品推荐

