我使用了几个不同的 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 评估多个条件。
答案 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