我想创建一个蔚蓝的管道,以便当我按下分支(开发) AND 标签(测试*)时,将触发该管道。但是,在没有标签的情况下,当我推送到分支(开发)时,将触发管道,这表明在推送到(测试)标签(或)时执行触发器。
trigger:
branches:
include:
- develop
- refs/tags/{test*}
仅当推送到(开发)分支并且具有对(test *)标记的引用时,如何才能触发触发器?
答案 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
设置即可实现。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:
- /*