GitHub Actions 排除分支上的拉取请求

7

假设我有一个工作流程,它会在每次将PR提交到主分支时启动,并以以下步骤开始:

on:
  pull_request:
    branches:
      - master

我希望如果 PR 来自于 depbot 分支,能够跳过所有的工作。类似以下代码:
on:
  pull_request:
    branches:
      - master
    head_ref-ignore:
      - depbot

我认为你可以使用以下方法跳过所有步骤:

 if: startsWith(github.head_ref, 'depbot') == false

但这并不是我想要的,因为它仍会启动该任务。我该如何在启动级别上实现这一点?

2个回答

3

根据文档,你无法在工作流程级别上实现你想要的,因为它是基于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:
       [ ... ]

问题是,这个工作流程总是会触发,只有当条件满足时才会执行所需的操作。


12
这适用于指定的基础分支。我正在寻找一种忽略特定 '来源' 头分支的 PR 的方法。 - aljabadi

2
但这不是我想要的,因为它仍会启动工作。这意味着您需要一个“门卫”工作(它将被启动并检查github.head_ref),并通过{{link1:job dependency}}调用第二个工作,只有在满足正确条件的情况下才会调用第二个工作。但关键是:您至少需要一个工作开始,以便检查条件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接