合并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

