【问题标题】:How can i trigger by branch AND tag in azure pipeline?如何在 azure 管道中通过分支 AND 标签触发?
【发布时间】:2020-02-10 16:49:18
【问题描述】:

我想创建一个 azure 管道,这样当我推送到分支 (develop) AND 标签 (test*) 时,管道将被触发。但是,当我在没有标签的情况下推送到分支(开发)时会触发管道,这表明当推送到(开发)分支OR(测试*)标签时触发器正在执行。

示例:

trigger:
  branches:
    include:
      - develop
      - refs/tags/{test*}

只有在推送到(开发)分支引用了(测试*)标签时,如何才能触发触发器?

【问题讨论】:

  • 尝试在您的问题中添加一些为什么。如果读者知道你为什么想要你的问题,他们也许可以给你更全面和更有帮助的答案。

标签: azure-devops azure-pipelines


【解决方案1】:

根据Triggers 上的文档

当您指定触发器时,它会替换默认的隐式触发器,并且只有推送到明确配置为包含的分支才会触发管道。 首先处理包含,然后从该列表中删除排除。

我认为文档中缺少(或只是令人困惑)的是,满足给定部分(分支、路径、标签)中包含的任何 1 的项目会针对该部分列出,如果它们满足任何 1 exclude 子句那个部分。 除非使用所有三个部分。那么以下注释适用:

如果您指定标签与分支过滤器包含文件路径的组合,则触发器将在满足分支过滤器并且标签或 路径过滤器满足。

总结

首先创建include: 集合,然后从该列表中删除excludes

部分被OR组合在一起(branches OR tags)(branches OR paths),除非使用了ALL部分,那么它们就是(branches AND (tags OR paths))

考虑到这一点:

如果您只想继续使用分支部分,则需要选择一个选项,从列表中删除所有不需要的分支,并且只明确包含标记 ref(像分支一样处理)。

包含标签并排除不需要的分支模式

trigger:
  branches:
    include:
    - refs/tags/test*
    exclude:
    # a list of the branches for which you don't want to trigger
    - master
    - features/*
    - bugs/*
    - hotfix/*

如果您不限于仅使用分支部分,那么使用所有 3 个部分将通过包含 develop 分支和 test* 标记但不包括 all 路径来到达那里。

包括标签和期望的分支,但排除该分支上的所有路径

trigger:
  branches:
    include:
      - develop
  tags:
    include:
      - test*
  paths:
    exclude:
      - /*

第二个选项基本上是shouldFire = (branch == develop && (tag == test* || false)),相当于shouldFire = (branch == develop && tag == test*)

【讨论】:

  • 我可以确认上面的第二个带有路径 exclude 的示例不再像描述的那样工作。应用标签时,会触发在功能分支上使用该语法的测试作业。
【解决方案2】:

上面 Josh Gust 的回答在当时可能是正确的,但不幸的是,情况似乎不再如此了。

recent update to the Azure docs 完全改变了包含/排除逻辑的工作方式。

考虑到这一点,在我看来,除了特定的分支 plus 标记组合之外,没有办法完全阻止管道触发。这是非常不幸的。

下一个最好的事情似乎是尽早中止管道。您可以执行以下操作:

  • 确保管道设置为仅在您需要的标签出现时触发。使用标准 tags include 设置实现此目的。
  • 备选方案 1: 作为第一步,如果分支名称不是您所期望的,则有条件地将构建中止为“已取消”。这似乎很复杂,您可能希望使用库 like this
  • 备选方案 2:eq(variables['Build.SourceBranchName'], 'master') 之类的条件添加到管道中的每一步。这很乏味,但很简单。

在确定要在 YAML 脚本中使用的分支名称时,请牢记docs 中的这一警告(前提是您使用的是 Git):

Build.SourceBranchName:引用中的最后一个路径段。例如,在refs/heads/master 中,此值为master。在refs/heads/feature/tools 中,此值为tools

从您 2 月 12 日的评论来看,在我看来,乔希的建议当时对您有用。 如果您能确认它是否仍然按预期工作,我们将不胜感激。 如果它仍然工作,那么 Azure 文档更新一定是错误的,我想向他们提出问题超过这个。

【讨论】:

    【解决方案3】:

    谢谢@Josh Gust 先生

    我试过这段代码,它运行了

    trigger:
      branches:
        include:
          - develop
      tags:
        include:
          - test*
      paths:
        exclude:
          - /*
    

    【讨论】:

    • 啊.. 一个很好且简单的实现,可以排除所有路径并包含带有通配符的标签。
    • 当我这样做时,它似乎只关心分支。即使我可以清楚地看到构建上有 Schedule 标记,只有 tags 也不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2018-06-12
    • 2021-11-23
    相关资源
    最近更新 更多