如何在Azure管道中通过分支AND标记触发?

时间:2020-02-10 16:49:18

标签: azure-devops azure-pipelines

我想创建一个蔚蓝的管道,以便当我按下分支(开发) AND 标签(测试*)时,将触发该管道。但是,在没有标签的情况下,当我推送到分支(开发)时,将触发管道,这表明在推送到(测试)标签()时执行触发器。

示例:

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

仅当推送到(开发)分支并且具有对(test *)标记的引用时,如何才能触发触发器?

3 个答案:

答案 0 :(得分:5)

根据Triggers

上的文档

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

我认为文档中缺少(或仅造成混淆)的是,给定部分(分支,路径,标签)中满足任何1个条件的项目均列在该部分中,如果满足以下条件,则将其删除:该部分。 (如果使用了所有三个部分)。然后,以下注意事项适用:

如果您指定的标记与包含文件路径的分支过滤器结合使用,则在满足分支过滤器标记或< / strong>满足路径过滤条件。

摘要

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

部分将一起(branches OR tags)(branches OR paths)一起使用,除非使用了 ALL 部分,则它们是(branches AND (tags OR paths))

请牢记:

如果您只想继续使用branchs部分,则需要使用一个选项,该选项将从列表中删除所有不需要的分支,并且仅显式包括标记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*标记将您带到那儿,但不包括所有路径。

包括标记和所需分支,但排除该分支上的所有路径

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

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

答案 1 :(得分:2)

上面乔什·古斯特的回答在当时可能是正确的,但不幸的是,情况似乎不再如此。

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

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

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

  • 确保将管道设置为仅在存在所需标签时触发。使用标准的tags include设置即可实现。
  • 替代1:作为第一步,如果分支名称不是您期望的名称,则有条件地中止构建为“ cancelled”。这似乎涉及很多,您可能要使用库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文档更新错误,并且我想向他们提出问题对此。

答案 2 :(得分:1)

谢谢你,@乔什·古斯特先生

我尝试了这段代码,它就运行了

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