[英]How to combine Git branch and tag triggers in Azure Pipelines
语境
Azure 管道支持不同类型的 CI 触发器( 文档)。
示例 A:
trigger:
branches:
include:
- master
如果在 master 分支中检测到新的提交,管道将运行。
示例 B:
trigger:
branches:
include:
- refs/tags/v*
如果检测到以v
开头的新标签,则管道将运行。
我希望我的管道在上述两个条件都为真时运行:分支和标记。
示例 C(未按预期工作):
trigger:
branches:
include:
- master
- refs/tags/v*
结合这两个触发器似乎就像一个或条件,而不是一个和条件。
问题
只有当有新的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 分支创建一个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 重复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.