如何在GitHub Actions工作流级别配置并发与事件执行优先级?
GitHub Actions 工作流并发控制方案
针对你提出的两个需求,我们可以通过concurrency配置和Job依赖来实现:
一、取消旧的Synchronize触发任务,保留最新实例
通过为同一个PR设置专属的并发组,并针对synchronize事件启用「取消正在运行的旧任务」机制:
concurrency: # 为每个PR创建独立的并发组,确保同PR的任务互相影响 group: pr-${{ github.event.pull_request.number }} # 仅当触发事件是pull_request的synchronize动作时,取消旧任务 cancel-in-progress: ${{ github.event_name == 'pull_request' && github.event.action == 'synchronize' }}
这样配置后,当同一个PR触发多个synchronize任务时,新任务启动会自动取消队列中或正在运行的旧任务,只保留最新的实例。
二、让Review任务等待Synchronize任务完成执行
将工作流拆分为两个独立Job,通过needs关键字建立依赖关系,确保Review任务必须等PR处理任务完成后再运行:
完整工作流示例:
name: PR & Review Workflow on: pull_request: types: - opened - synchronize pull_request_review: types: - submitted concurrency: group: pr-${{ github.event.pull_request.number }} cancel-in-progress: ${{ github.event_name == 'pull_request' && github.event.action == 'synchronize' }} jobs: # 处理PR的opened/synchronize事件 pr-handler: if: github.event_name == 'pull_request' runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 # 这里添加你的PR处理逻辑,比如构建、测试等 - name: Run PR checks run: | echo "Running checks for PR #${{ github.event.pull_request.number }} (event: ${{ github.event.action }})" # 处理PR review的submitted事件,依赖pr-handler完成 review-handler: if: github.event_name == 'pull_request_review' needs: pr-handler runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 # 这里添加你的审核后处理逻辑,比如合并验证、通知等 - name: Process review run: | echo "Processing review for PR #${{ github.event.pull_request.number }}"
关键逻辑说明:
pr-handlerJob仅在pull_request事件触发时运行,负责执行PR相关的核心操作review-handlerJob仅在pull_request_review事件触发时运行,通过needs: pr-handler强制它必须等待同PR的pr-handlerJob完成后才能启动- 同一个PR的所有任务都属于同一个并发组,确保当
synchronize任务正在运行时,review-handler会进入队列等待,不会提前执行
内容的提问来源于stack exchange,提问作者Swathi DA
相关产品推荐
相关产品推荐

