假设我有一个在每个要掌握的 PR 上运行的工作流程,其开头为:
on:
pull_request:
branches:
- master
如果 PR 来自
depbot
分支,我想跳过所有工作。比如:
on:
pull_request:
branches:
- master
head_ref-ignore:
- depbot
我认为您可以使用
跳过所有步骤(一次一个) if: startsWith(github.head_ref, 'depbot') == false
但这不是我想要的,因为它仍然会启动工作。我怎样才能在启动阶段实现这一目标?
根据文档,您无法在工作流程级别实现您想要的目标,因为它基于
base branches
。
因此,下面的这些实现将不起作用。
on:
pull_request:
branches:
- 'master' # matches refs/heads/master
- '!depbot' # excludes refs/heads/depbot
或者
on:
pull_request:
branches-ignore:
- 'depbot' # ignore refs/heads/depbot
编辑答案
解决方案可能是使用
setup job
检查 github.head_ref
上下文变量,并设置将在表达式中使用的输出,以便在满足条件时运行以下作业。
类似这样的:
jobs:
setup:
runs-on: ubuntu-latest
outputs:
condition: ${{ steps.condition.outputs.condition }}
steps:
- id: condition
run: |
if [[ ${{ github.head_ref }} == *"depbot"* ]]; then
echo "condition=true" >> $GITHUB_OUTPUT
else
echo "condition=false" >> $GITHUB_OUTPUT
fi
other-job:
needs: [setup]
runs-on: ubuntu-latest
if: ${{ needs.setup.outputs.condition }} == 'true'
steps:
[ ... ]
问题是,此工作流程将始终触发,如果不满足条件,它将不会执行所需的操作。
但这不是我想要的,因为它仍然会启动工作。
这意味着您需要启动一项“看门人”工作(并检查 github.head_ref),并且通过 工作依赖,仅在满足正确条件时才会调用第二个工作。
但要点是:您至少需要开始一项工作,才能检查状况。
虽然有点晚了,但您可以将 [skip ci] 添加到 dependentabot 提交消息的开头,以阻止它们触发工作流程。 https://docs.github.com/en/actions/managing-workflow-runs/skipping-workflow-runs