如何仅允许手动 workflow_dispatch 在特定分支上运行?

14
我有一个 GitHub Actions 工作流文件,它允许使用 workflow_dispatch 事件手动触发。GitHub 提供了下拉列表来选择在哪个分支上运行工作流。
我想知道是否有任何方法可以将该选项限制为特定分支(或特定分支)。
具有 workflow_dispatch 的工作流文件示例:
name: A test workflow title
on:
  push:
  workflow_dispatch:
    # branches:    # *** This seems to not be supported! ***
      # - main

jobs:
  print-hello-world:
    runs-on: ubuntu-20.04
    steps:
      - name: Print hello world
        run: echo "Hello world!"
2个回答

8

通过使用if语句,您可以在工作流程由特定分支的workflow_dispatch触发时添加一个步骤以使作业失败。

name: A test workflow title
on:
  push:
  workflow_dispatch:

jobs:
  print-hello-world:
    runs-on: ubuntu-20.04
    steps:
      - name: Fail if branch is not main
        if: github.event_name == 'workflow_dispatch' && github.ref != 'refs/heads/main'
        run: |
          echo "This workflow should not be triggered with workflow_dispatch on a branch other than main"
          exit 1

      - name: Print hello world
        run: echo "Hello world!"

      - name: Log github context
        run: echo "${{ toJSON(github) }}"

你也可以通过在作业级别下放置负条件来跳过该作业:

jobs:
  print-hello-world:
    if: github.event_name != 'workflow_dispatch' || github.ref == 'refs/heads/main'
    runs-on: ubuntu-20.04
    steps:
    ...


这个很好,但是只有在所有分支中放置了这段代码才能正常工作。如果有人创建了一个新的分支并删除了这一部分,那么该分支中的工作流将没有这个检查。 - R-JANA
@R-JANA 没错,这个解决方案的一个缺点。我进行了快速检查,没有找到一种方法,作为组织所有者,限制开发人员的写入访问权限,以防止他们编辑工作流文件或在不同于“main”的分支上运行它们。我知道使用经典令牌是可能的。 - Ohav

1

一个简单的方法是使用环境保护规则

  1. 创建一个工作流文件的环境,例如production,方法是进入设置 > 环境
  2. 创建production后,在环境列表中点击production,您将在部署分支的顶部找到它。
  3. 您应该能够看到一个带有默认选项所有分支的按钮。您可以选择匹配模式的受保护分支选定分支

在作业下将此环境添加到您的工作流文件中,如下所示:

name: A test workflow title
on:
  push:
  workflow_dispatch:
  
jobs:
  print-hello-world:
    runs-on: ubuntu-20.04
    environment: production
    steps:
      - name: Print hello world
        run: echo "Hello world!"

参考资料:
https://docs.github.com/zh/actions/deployment/targeting-different-environments/using-environments-for-deployment#environment-protection-rules

https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#creating-an-environment


1
这很有趣,但并不会阻止任何开发人员在他的分支中注释掉environment:行,然后从他的分支进行调度。 不过,如果将其与VARIABLES和SECRETS功能相结合,这些功能可以在特定环境中设置,管理者可以通过仅向特定部署公开变量和密码来防止敏感操作。 - Ohav

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