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

如何让GitHub Actions忽略仅修改PR正文的edited触发?

GitHub PR检查:忽略仅修改正文的触发场景

我在使用GitHub Enterprise时配置了如下Workflow,要求只有PR变更通过test任务后才能合并:

on:
  pull_request:
    branches: [...]
    types: [opened, reopened, synchronize, edited]

jobs:
  test:
    runs-on: self-hosted
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

    steps:
      ...

edited事件既包含仅修改PR正文的情况,也包含修改基准分支的情况,因此我尝试添加if语句来忽略仅修改正文的场景:

jobs:
  test:
    if: github.event.action != 'edited' || github.event.changes.base
    runs-on: self-hosted
    steps:
      ...

但这里存在问题:GitHub会将被跳过的test任务判定为"成功",这意味着原本test失败的PR,仅修改正文后就能直接合并。我曾尝试用needs让test仅在代码变更时运行,但GitHub会将未运行的test任务判定为"失败"。需要解决的核心问题是:如何让GitHub不处理仅修改PR正文所触发的PR检查?

解决方案

参考@Azeem的建议,我实现了如下解决方法:

name: foo

on:
  pull_request:
    branches: [...]
    types: [opened, reopened, synchronize, edited]

concurrency:
  group: ${{ github.event.pull_request.head.sha }}
  cancel-in-progress: false

jobs:
  prepare:
    runs-on: self-hosted
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

  check-the-last-test-status:
    needs: prepare
    runs-on: self-hosted
    outputs:
      status: ${{ steps.check-status.outputs.result }}
    steps:
      - name: Check the 'test' status of the latest commit (${{ github.event.pull_request.head.sha }})
        id: check-status
        if: ${{ github.event.action == 'edited' && !github.event.changes.base }}
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          IS_THE_LAST_TEST_SUCCESS=$(gh run list \
            --workflow "foo" \
            --event pull_request \
            --branch ${{ github.event.pull_request.head.ref }} \
            --commit ${{ github.event.pull_request.head.sha }} \
            --json status,conclusion \
            --jq '[.[] | select(.status == "completed" and .conclusion == "success")] | any')
          echo "Is the last test success: $IS_THE_LAST_TEST_SUCCESS"
          if [[ "$IS_THE_LAST_TEST_SUCCESS" == 'true' ]]; then
            echo "result=success" >> $GITHUB_OUTPUT
          else
            echo "result=failure" >> $GITHUB_OUTPUT
          fi;

      - name: Cancel
        if: steps.check-status.conclusion != 'skipped' && steps.check-status.outputs.result == 'failure'
        run: |
          gh run cancel ${{ github.run_id }}
          gh run watch ${{ github.run_id }}


  test:
    needs: check-the-last-test-status
    if: needs.check-the-last-test-status.outputs.status != 'success'
    runs-on: self-hosted
    steps:
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20.10.0'

      - ...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 18:55:12