如何配置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
相关产品推荐
相关产品推荐

