如何仅对特定分支上的标签有条件地运行 Github 工作流操作?

时间:2021-03-03 14:21:00

标签: github-actions

我使用了几个不同的 Github 工作流程,其中包括一个只能在官方版本上运行的工作流程。 .github/workflows/release.yml 内部是这个 on 条件:

on:
  push:
    tags:
      - 'v*'

但是,如果我们团队中的某个人意外(或故意)从 develop 分支推送标签,这仍然可以运行。理想情况下,我们希望将其锁定,以便标签必须位于 main 分支上(因为它是受保护的),甚至可能更进一步,如果我们能够确保标签仅引用与相应版本相关的特定合并提交。例如,如果我运行

git branch --contains tags/v1.2.3

这通常会输出我制作标签的 main 分支。我可以在 github 工作流中添加一个条件来检查它的输出吗?

查看 Github action documentation 并不清楚是否使用逻辑 AND 或逻辑 OR 评估多个条件。

1 个答案:

答案 0 :(得分:2)

on 中指定的事件类型之间有一个逻辑 OR。所以例如

on:
  push:
    tags: ['v[0-9].[0-9]+.[0-9]+']
    branches: [master]

不幸的是,会触发任何分支上任何匹配标签的工作流程,也会触发带有或不带有标签的 master 上的任何推送。我还按照 doc 中的示例更新了标签模式。

您必须决定是否只为标签运行工作流,然后过滤掉除主文件之外的任何内容:

on:
  push:
    tags: ['v[0-9].[0-9]+.[0-9]+']

jobs:
  myjob:
    runs-on: ubuntu-latest
    if: ${{ github.ref == 'refs/heads/master' }}
    steps: [...]

或者反过来:

on:
  push:
    branches: [master]

jobs:
  myjob:
    runs-on: ubuntu-latest
    if: ${{ startsWith('refs/tags/v', github.ref) }}
    steps: [...]

例如,如果您的工作流包含其他可能在推送到 master 时运行的作业,您可能会选择第二种解决方案。您还会注意到,标签的过滤器在第二个标签上不太准确,可能会出现问题。还需要注意的是,您可以使用 on 中的条件跳过整个工作流程,使用 jobs.<job_id>.if 跳过整个作业,但也可以使用 jobs.<job_id>.steps[*].if

跳过步骤
相关问题