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

如何避免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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:21:13