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

Eve*_*ett 2 github-actions

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

on:
  push:
    tags:
      - 'v*'
Run Code Online (Sandbox Code Playgroud)

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

git branch --contains tags/v1.2.3
Run Code Online (Sandbox Code Playgroud)

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

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

ITC*_*hap 5

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

on:
  push:
    tags: ['v[0-9].[0-9]+.[0-9]+']
    branches: [master]
Run Code Online (Sandbox Code Playgroud)

不幸的是,会触发任何分支上任何匹配标签的工作流程,但也会触发带有或不带有标签的 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: [...]
Run Code Online (Sandbox Code Playgroud)

或者反过来:

on:
  push:
    branches: [master]

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

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

  • 当通过推送标签触发操作时,“github.ref”类似于“refs/tags/xxx”;当通过推送分支触发操作时,“github.ref”是“refs/heads/main”。所以这看起来像第 22 条军规:当我推送分支时,我看不到标签,当我推送标签时,我看不到分支。 (10认同)