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

