如何避免GitHub中Push与合并请求触发重复流水线?
解决GitHub Actions中PR存在时避免触发Push流水线的问题
场景说明
当Feature1分支向epic1分支发起合并请求(PR)后,当前配置的GitHub Actions触发规则如下:
on: push: pull_request:
此时推送Feature1分支会同时触发两条流水线:
- 由
push事件触发的流水线 - 由
pull_request事件触发的流水线
下面提供几种实用方法,在存在打开的PR时,避免推送分支触发push流水线:
方法一:通过事件上下文条件过滤
在push事件对应的job中添加条件判断,仅当当前推送没有关联的PR时才执行任务。修改后的配置示例:
on: push: pull_request: jobs: # 仅在无打开的PR时执行的Push任务 push-specific-job: if: ${{ !github.event.pull_request }} runs-on: ubuntu-latest steps: - name: 执行Push专属操作 run: echo "仅当当前分支无打开的PR时,才会执行这个Push任务" # PR触发的任务保持不变 pr-specific-job: runs-on: ubuntu-latest steps: - name: 执行PR相关操作 run: echo "这是PR事件触发的任务"
原理:当分支存在打开的PR时,push事件的上下文github.event.pull_request会包含PR的相关信息,条件!github.event.pull_request会返回false,从而跳过该job的执行。
方法二:限制Push事件的触发分支
如果你的PR都是从Feature类分支合并到epic1这类目标分支,可以直接限制push事件仅在目标分支触发,Feature分支推送时不会触发push流水线。配置示例:
on: push: branches: - epic1 - main # 根据实际需求添加其他需要触发push流水线的分支 pull_request:
这种方式简单直接,适合分支策略固定的场景。
方法三:用GitHub CLI检查PR状态
通过GitHub CLI(gh)查询当前推送的分支是否存在打开的PR,根据查询结果决定是否继续执行任务。配置示例:
on: push: pull_request: jobs: push-job: runs-on: ubuntu-latest steps: - name: 检查当前分支是否有打开的PR id: check-open-pr run: | # 查询当前分支的打开PR数量 open_pr_count=$(gh pr list --head "${{ github.ref_name }}" --state open --json number --jq 'length') echo "open_pr_count=$open_pr_count" >> "$GITHUB_OUTPUT" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: 执行Push任务(仅无打开PR时) if: ${{ steps.check-open-pr.outputs.open_pr_count == '0' }} run: echo "当前分支无打开的PR,执行Push任务"
原理:利用gh pr list命令过滤出当前分支的打开PR,通过返回的数量判断是否存在有效PR,进而控制后续步骤的执行。
内容的提问来源于stack exchange,提问作者Tejas Patel
相关产品推荐
相关产品推荐

