如何在拉取请求后仅在推送时触发推送而不是在分支合并时触发

问题描述 投票:0回答:2

我有一个 github 工作流程,它在推送时触发。如果有 PR 并且分支被合并,我不希望它被触发。 需要有关如何做到这一点的建议。

我当前的下面的代码不起作用,因为 github.event.pull_request.merged 仅适用于或在触发时才有价值。

on:
  push:
    branches:
      - test

jobs:
  do_not_run_on_merged:
    if: (github.event.pull_request.merged == false)
    runs-on: ubuntu-latest
    steps:
      - run: |
          echo This is not a merge
  
github-actions
2个回答
0
投票

您可以使用

github.ref

如果它是
merge
,则
ref
将是
refs/pr_num/merge
,对于任何其他
push
,它将是
refs/heads/test
,因此您可以使用它。

# You can use:
if: "contains(github.ref, '/merge')"
# Or:
if: "!contains(github.ref, 'refs/heads/test')"

0
投票

如果您始终使用默认的合并提交消息,则可以使用如下所示的作业级别条件:

jobs:
  do_not_run_on_merged:
    if: "!startsWith(github.event.head_commit.message, 'Merge ')"

否则,你必须实际运行至少一个步骤来检查,例如通过 GitHub API 查询最新提交的父级数量:

jobs:
  check_if_merged:
    runs-on: ubuntu-24.04
    outputs:
      is_merged: ${{ steps.check.outputs.is_merged }}
    steps:
      - name: Check if merge commit
        id: check
        env:
          GITHUB_TOKEN: ${{ github.token }}
        run: |
          parents=$(gh api "repos/$GITHUB_REPOSITORY/commits/$GITHUB_SHA" \
              --jq '.parents | length')

          if ((parents > 1)); then
              echo "is_merged=true" >> "$GITHUB_OUTPUT"
          fi

  do_not_run_on_merged:
    needs: check_if_merged
    if: needs.check_if_merged.outputs.is_merged != 'true'

除了

$GITHUB_SHA
,您还可以使用分支引用
test
,但这会出现竞争条件,即在工作流启动和进行 API 调用之间推送新的提交。

© www.soinside.com 2019 - 2024. All rights reserved.