我有一个 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.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')"
如果您始终使用默认的合并提交消息,则可以使用如下所示的作业级别条件:
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 调用之间推送新的提交。