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

合并PR时Github Actions未触发Pull Request事件的问题咨询

问题

合并Pull Request(PR)时,我的GitHub Actions仅收到Push事件,完全未触发Pull Request事件。按GitHub官方说明,此时应该触发类型为closed的Pull Request事件,但实际并未出现,导致没法用github.event.pull_request.merged判断PR是否合并。这是预期情况吗?还有什么靠谱方法能在Action里检测PR已合并?

我试过检查提交信息里是否包含“Merge pull request”,但如果用户修改默认合并信息删掉这个字符串,这个方案就失效了。

附上我们的Workflow文件,其中处理PR的任务在合并时没触发,只触发了处理提交的任务:

name: Github-Jira Integration

on:
  [push, pull_request]
    
jobs:
  commit:
    runs-on: win10-machine

    env:
      JIRA_URL: ${{ secrets.JIRA_URL }}
      JIRA_USER: ${{ secrets.JIRA_USER }}
      JIRA_PWORD: ${{ secrets.JIRA_PWORD }}
      GITHUB_EVENT: ${{ toJson(github.event) }}
      
    if: github.event_name != 'pull_request'
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
        with:
          repository: our_repo
          path: generic_tools

      - name: Setting up Node.js Version
        uses: actions/setup-node@v3
        with:
          node-version: 14
          
      - name: Installing Node Modules
        run: |
          cd generic_tools/github-plugin
          npm install
          npm install -g ts-node
      
      - name: Run
        shell: cmd
        run: |
          ts-node generic_tools/github-plugin/src/app.ts "head_commit"

  pull_request:
    runs-on: win10-machine
    
    env:
      JIRA_URL: ${{ secrets.JIRA_URL }}
      JIRA_USER: ${{ secrets.JIRA_USER }}
      JIRA_PWORD: ${{ secrets.JIRA_PWORD }}
      GITHUB_EVENT: ${{ toJson(github.event) }}
      
    if: github.event_name == 'pull_request' || github.event.pull_request.merged == true
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
        with:
          repository: our_repo
          path: generic_tools

      - name: Setting up Node.js Version
        uses: actions/setup-node@v3
        with:
          node-version: 14
          
      - name: Installing Node Modules
        run: |
          cd generic_tools/github-plugin
          npm install
          npm install -g ts-node
      
      - name: Run
        shell: cmd
        run: |
          ts-node generic_tools/github-plugin/src/app.ts "pull_request"

解决方案

1. PR合并未触发closed事件的原因

这不是预期情况,先排查几个关键点:

  • 确认仓库没有设置跳过CI的规则(比如合并提交信息里带[skip ci]);
  • 检查合并方式:如果用squash合并后直接推送,而非标准PR合并流程,可能导致事件异常;
  • 你的Workflow当前on字段配置是[push, pull_request],理论上会监听所有PR事件类型,没问题,但如果之前有修改过限定特定action(比如只写pull_request.opened),需要改回来。

2. 可靠检测PR合并的方法

方法一:精准监听PR的closed事件+merged状态

修改pull_request任务的if条件,明确针对PR关闭且合并的场景:

if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true

这样当PR合并时,会触发pull_request事件,且action为closed、merged为true,就能正常执行任务。

方法二:在Push事件中查询关联PR

如果Push事件确实无法触发PR事件,可以在commit任务里通过GitHub API查询当前提交是否来自已合并的PR:

  • 用github.sha拿到当前推送的提交SHA;
  • 用GitHub官方的gh命令行工具查询:
gh pr list --state merged --search "SHA:${GITHUB_SHA}" --json merged --jq '.[0].merged'

返回true就说明该提交属于已合并的PR,注意要给Action配置GITHUB_TOKEN权限才能用gh工具。

方法三:修正当前Workflow的条件判断

你现在的pull_request任务if条件有问题:Push事件里github.event.pull_request不存在,直接判断github.event.pull_request.merged == true会报错,导致任务不执行。可以调整为:

if: (github.event_name == 'pull_request' && (github.event.action != 'closed' || github.event.pull_request.merged == true))

这样既处理PR的常规事件,也能覆盖合并时的closed场景。

3. 临时规避方案(不推荐)

如果上述方法暂时没法实施,可以检查提交的父提交数量:标准合并提交有两个父提交,squash合并只有一个,但这种方法不如前两种可靠,仅作临时过渡用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:38:24