如何仅取消Pull Request的GitHub Action任务,合并后不取消?
解决方案
可以通过动态配置concurrency参数实现需求,无需拆分两个Workflow。核心思路是根据事件类型(pull_request/push)分别设置不同的并发组规则和取消逻辑:
name: CodeQL on: push: branches: [main] pull_request: branches: [main] concurrency: # PR事件用ref作为组标识,push事件用唯一的commit SHA作为组标识 group: ${{ github.event_name == 'pull_request' ? format('{0}-{1}', github.workflow, github.ref) : format('{0}-{1}', github.workflow, github.sha) }} # 仅在PR事件时取消正在运行的旧任务 cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: codeql: name: CodeQL runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Initialize CodeQL uses: github/codeql-action/init@v2 with: languages: go - name: Autobuild uses: github/codeql-action/autobuild@v2 - name: CodeQL uses: github/codeql-action/analyze@v2
逻辑说明
- Pull Request场景:
- 并发组使用
${github.workflow}-${github.ref},同一个PR的多次提交/更新会归属到同一组 cancel-in-progress设为true,新触发的任务会自动取消该组内正在运行的旧任务,符合预期
- 并发组使用
- Push到main场景:
- 并发组使用
${github.workflow}-${github.sha},每个push的commit SHA是唯一的,因此每个任务都会属于独立的组 cancel-in-progress设为false,确保每个main分支的CodeQL分析都能完整执行,不会被后续push任务取消
- 并发组使用
这样就用单个Workflow实现了"PR自动取消旧任务,main分支任务不互相取消"的需求。
内容的提问来源于stack exchange,提问作者Hongbo Miao
相关产品推荐
相关产品推荐

