You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Github Actions中取消启动中的运行并等待待处理运行完成?

实现GitHub Actions中取消正在运行任务、等待待处理任务完成的方案

GitHub Actions原生的concurrency配置(cancel-in-progress: true)仅支持新启动的运行取消正在进行的旧运行,要实现相反逻辑——取消所有正在进行的运行,等待队列中的待处理运行完成,需要结合GitHub CLI(gh)编写自定义脚本完成。

具体实现Workflow示例

name: 管理运行队列并执行任务
on: [push]

jobs:
  manage-runs:
    runs-on: ubuntu-latest
    timeout-minutes: 120 # 根据待处理任务数量调整超时时间
    steps:
      - name: 安装GitHub CLI
        uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: npm install -g @github/cli

      - name: 授权GitHub CLI
        run: echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token

      - name: 获取同组的运行列表
        id: fetch-runs
        run: |
          # 定义与实际任务一致的并发组名称,这里用分支名作为标识
          CONCURRENCY_GROUP="task-group-${{ github.ref_name }}"
          # 筛选出同组的正在运行/待处理运行,排除当前运行本身
          RUN_DATA=$(gh run list --repo ${{ github.repository }} --group "$CONCURRENCY_GROUP" --status in_progress,queued --json id,status --exclude ${{ github.run_id }})
          echo "runs=$RUN_DATA" >> $GITHUB_OUTPUT

      - name: 取消所有正在运行的任务
        run: |
          # 解析JSON,提取正在运行的任务ID
          IN_PROGRESS_IDS=$(echo '${{ steps.fetch-runs.outputs.runs }}' | jq -r '.[] | select(.status == "in_progress") | .id')
          for RUN_ID in $IN_PROGRESS_IDS; do
            echo "正在取消运行: $RUN_ID"
            gh run cancel $RUN_ID
          done

      - name: 等待所有待处理任务完成
        run: |
          # 解析JSON,提取待处理的任务ID
          QUEUED_IDS=$(echo '${{ steps.fetch-runs.outputs.runs }}' | jq -r '.[] | select(.status == "queued") | .id')
          for RUN_ID in $QUEUED_IDS; do
            echo "等待运行 $RUN_ID 完成..."
            gh run watch $RUN_ID
          done

  # 你的实际业务任务,依赖上面的管理任务完成
  business-task:
    needs: manage-runs
    runs-on: ubuntu-latest
    concurrency:
      group: task-group-${{ github.ref_name }}
      cancel-in-progress: false
    steps:
      - name: 执行业务逻辑
        run: |
          echo "开始执行实际任务..."
          # 这里替换成你的业务命令

关键说明

  • 并发组一致性:manage-runs任务中定义的CONCURRENCY_GROUP必须和business-task的concurrency.group完全一致,才能准确筛选出同组的运行。
  • 权限保障:默认的GITHUB_TOKEN已经具备操作仓库Workflow运行的权限,无需额外配置密钥。
  • 避免自取消:用--exclude ${{ github.run_id }}排除当前运行,防止脚本误取消自己。

注意事项

  • 如果待处理任务较多或单任务执行时间长,需调整manage-runs的timeout-minutes,避免Job超时中断。
  • gh run watch会逐个等待待处理任务完成,若需要并行等待,可编写shell脚本结合后台进程实现。
  • 该方案依赖GitHub CLI,确保Runner环境能正常安装并使用gh命令(Ubuntu默认支持,Windows/macOS可能需要调整安装步骤)。

内容的提问来源于stack exchange,提问作者カルロサグ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 02:40:33