如何在 Azure 管道中组合 Git 分支和标记触发器



>上下文

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 重复最少。

最新更新