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

如何配置GitHub Actions工作流仅触发Push或Pull Request事件之一

解决方案

可以实现,你可以通过在工作流中添加前置检查任务,判断当前推送的分支是否存在打开的MR(PR),如果存在就终止push事件的工作流执行;同时保留pull_request事件的正常触发。

完整配置示例

on:
  push:
    branches: "*"
  pull_request:
    branches: "*"

jobs:
  # 前置检查:如果是push事件且分支有打开的MR,就终止工作流
  check-pr-exists:
    runs-on: ubuntu-latest
    if: github.event_name == 'push'
    steps:
      - name: 检查当前分支是否有打开的MR
        run: |
          # 使用GitHub CLI查询当前分支的开放MR数量
          PR_NUM=$(gh pr list --head "${{ github.ref_name }}" --state open --json number | jq '. | length')
          if [ "$PR_NUM" -gt 0 ]; then
            echo "当前分支存在开放的MR,停止push事件的工作流"
            exit 1
          fi
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  # 这个任务会在非MR分支的push事件,或所有pull_request事件中运行
  common-job:
    needs: check-pr-exists
    runs-on: ubuntu-latest
    if: github.event_name == 'pull_request' || (github.event_name == 'push' && success())
    steps:
      - name: 执行通用任务
        run: echo "运行通用工作流步骤"

  # 仅在pull_request事件中运行的专属任务
  pr-only-job:
    runs-on: ubuntu-latest
    if: github.event_name == 'pull_request'
    steps:
      - name: 执行MR专属任务
        run: echo "运行MR专属工作流步骤"

配置说明

  • check-pr-exists任务仅在push事件触发时运行,通过GitHub CLI查询当前分支是否有开放的MR,若存在则退出并终止后续任务执行。
  • common-job依赖前置检查任务,只有当push事件的检查通过(分支无MR),或者触发的是pull_request事件时才会运行。
  • pr-only-job保持原有的仅在pull_request事件运行的逻辑。

备选方案(仅跳过特定任务)

如果你不需要完整终止push事件的工作流,只是想让push事件下的某些任务不运行,也可以直接在对应任务的if条件中加入分支是否有MR的判断:

on:
  push:
    branches: "*"
  pull_request:
    branches: "*"

jobs:
  push-only-job:
    runs-on: ubuntu-latest
    if: github.event_name == 'push'
    steps:
      - name: 检查是否为MR分支
        id: check-pr
        run: |
          PR_NUM=$(gh pr list --head "${{ github.ref_name }}" --state open --json number | jq '. | length')
          echo "pr_exists=$([ "$PR_NUM" -gt 0 ] && echo "true" || echo "false")" >> $GITHUB_OUTPUT
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: 执行非MR分支的push任务
        if: steps.check-pr.outputs.pr_exists == 'false'
        run: echo "仅在非MR分支的push事件中运行"

  pr-only-job:
    runs-on: ubuntu-latest
    if: github.event_name == 'pull_request'
    steps:
      - name: 执行MR专属任务
        run: echo "仅在MR事件中运行"

这样配置后,当你推送到MR分支时,push事件的工作流会触发,但push-only-job里的实际任务会被跳过,不会重复执行和pull_request事件重叠的逻辑。

内容的提问来源于stack exchange,提问作者Shuzheng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:34:52