6

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

on:
  push:
    tags:
      - 'v*'

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

git branch --contains tags/v1.2.3

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

查看Github 操作文档,不清楚是使用逻辑 AND 还是逻辑 OR 评估多个条件。

4

1 回答 1

12

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

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

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

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

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(github.ref, 'refs/tags/v')
    steps: [...]

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

于 2021-03-03T19:09:19.773 回答