如何在GitHub Actions中实现失败时提前终止剩余任务?
GitHub CI 实现失败时提前终止剩余 Actions
完全可以实现,根据你的CI场景(串行/并行),有两种常用解决方案:
方案一:通过Job依赖关系(串行执行场景)
如果你的两个检查可以改成串行执行(先跑第一个,再跑第二个),直接用needs配置依赖就能实现:
- 在第二个Job的配置里加上
needs: [第一个Job的ID],这样只要第一个Job失败,第二个Job会直接被标记为「跳过」,不会启动执行。 - 示例配置:
jobs: first-check: runs-on: ubuntu-latest steps: - name: 执行第一个检查 run: # 这里写你的检查命令 second-check: runs-on: ubuntu-latest needs: first-check # 依赖第一个Job的执行结果 steps: - name: 执行第二个检查 run: # 这里写你的检查命令
方案二:主动取消运行中的Job(并行执行场景)
如果必须保持两个检查并行执行,就得借助GitHub API主动终止还在运行的Job,具体步骤如下:
- 先给Workflow的GITHUB_TOKEN添加
actions: write权限,在Workflow开头配置:
permissions: actions: write
- 在第一个Job中添加失败触发的步骤,调用API取消当前Workflow里的其他运行中Job:
jobs: first-check: runs-on: ubuntu-latest steps: - name: 执行第一个检查 id: first-step run: # 这里写你的检查命令,失败时会触发后续步骤 - name: 失败时取消其他Job if: failure() uses: actions/github-script@v6 with: script: | // 获取当前Workflow的所有Job const jobs = await github.rest.actions.listJobsForWorkflowRun({ owner: context.repo.owner, repo: context.repo.repo, run_id: context.runId }); // 筛选出当前Job以外的运行中Job const runningJobs = jobs.data.jobs.filter(job => job.id !== context.jobId && job.status === 'in_progress' ); // 逐个取消这些Job for (const job of runningJobs) { await github.rest.actions.cancelWorkflowRunJob({ owner: context.repo.owner, repo: context.repo.repo, job_id: job.id }); } second-check: runs-on: ubuntu-latest steps: - name: 执行第二个检查 run: # 这里写你的检查命令
注意事项
- 必须确保GITHUB_TOKEN拥有
actions: write权限,否则无法调用取消Job的API。 - 如果第二个Job已经执行完成,取消操作不会产生任何影响。
内容的提问来源于stack exchange,提问作者ror
相关产品推荐
相关产品推荐

