>上下文
Azure 管道支持不同类型的 CI 触发器(文档(。
示例 A:
trigger:
branches:
include:
- master
如果在主分支中检测到新提交,管道将运行。
示例 B:
trigger:
branches:
include:
- refs/tags/v*
如果检测到以v
开头的新标记,管道将运行。
我希望我的管道在上述两个条件都满足时运行:分支和标记。
示例 C(未按预期工作(:
trigger:
branches:
include:
- master
- refs/tags/v*
将这两个触发器结合起来似乎就像一个 or 条件,而不是一个 and 条件。
问题
如何仅在有新的v*
标签时才触发master
分支上的管道?
在我看来这是不可能的。以下文档:
如果将标记与包含文件路径的分支筛选器结合使用,则在满足分支筛选器且满足标记或路径筛选器时,将触发触发器。
不幸的是,添加条件在这里无济于事,因为我们没有足够的信息。例如tag
触发器,我们有这个
BUILD_SOURCEBRANCH=refs/tags/release-07
BUILD_SOURCEBRANCHNAME=release-07
对于branch
触发此操作:
BUILD_SOURCEBRANCH=refs/heads/master
BUILD_SOURCEBRANCHNAME=master
即使您尝试使用git branch
手动检查分支名称,您也会得到:
* (HEAD detached at 154ce86)
对我来说,这是开发人员社区功能请求的一个很好的候选者。
我找到了一种通过使用模板和参数来做到这一点的方法。
例
首先,使用参数化任务和脚本创建common.yaml
:
parameters:
- name: myMessage
type: string
default: 'Hello from template!'
- script: |
echo ${{ parameters.myMessage }}
此 yaml 可以包含任意数量的参数、共享任务和脚本。
然后,为主分支创建一个master.yaml
:
trigger:
branches:
include:
- master
extends:
template: common.yml
parameters:
myMessage: 'Hello from master!' # Overrides default parameter value
为每个新版本标记创建另一个要运行的tags.yaml
:
trigger:
branches:
include:
- refs/tags/v*
extends:
template: common.yml
parameters:
myMessage: 'Hello from tags!' # Overrides default parameter value
最后,在 Azure DevOps Web 界面中创建两个管道。将其中一个管道连接到master.yaml
,另一个连接到tags.yaml
。
通过此设置,每个触发器都是独立的,并且 yaml 重复最少。