我在同一存储库的两个不同分支stage
和prod
中具有完全相同的管道。
我希望分支stage
上的管道在创建以stage@
开头的标签(例如stage@1.0.1
)时运行;同样,我希望分支prod
上的管道在创建以prod@
开头的标签(例如prod@1.0.1
)时运行。
在分支stage
中,触发器的定义如下:
# .azure-pipelines.yml [refs/branches/stage]
trigger:
tags:
include:
- stage@*
在分支prod
中,触发器的定义如下:
# .azure-pipelines.yml [refs/branches/prod]
trigger:
tags:
include:
- prod@*
现在,我在[Deploy to STAGE]
分支中的文件上,在名为stage
的Azure DevOps上创建了一个管道,而在[Deploy to PROD]
分支中的文件中,在Azure DevOps上创建了一个名为prod
的管道。 / p>
我尝试创建标签:
$ git branch
master
prod
* stage
$ git tag -a stage@1.0.6 -m "stage@1.0.6"
$ git push --tags
我希望[Deploy to STAGE]
管道可以启动,但是两个管道都启动了:
我错过了什么吗?触发器不应该只包含与定义的模式匹配的标签吗?如何纠正触发器以实现所述流程?
答案 0 :(得分:3)
两个管道Deploy to STAGE
和Deploy to Prod
是两个相同的管道。尽管您在创建管道Prod
时从分支Deploy to Prod
中选择了文件,但该管道也将应用于Stage
分支。这是因为两个管道都使用相同的azure-pipelines.yml文件,并且该文件同时存在于stage和prod分支上。
从构建运行的屏幕截图中,您可以看到两个管道正在构建完全相同的阶段标签。如果您在prod
分支中添加标签,则会看到两个管道也会被触发。
实际上,您只需要创建两个管道之一即可。它们都将应用于生产分支和阶段分支。因此,您只需删除管道Deploy to Prod
。当您将标签推入产品分支时。您会注意到管道Deploy to STAGE
正在构建prod标签。
如果必须创建两个管道。您需要在prod
分支中重命名azure-pipelines.yml文件,或使用一些内容和不同的名称创建一个新的yml文件。然后从这个新的yml文件创建管道Deploy to PROD
。
如果您选择创建一个新的yml文件来创建管道Deploy to PROD
,则需要在prod分支的原始azure-pipelines.yml文件中禁用触发器(trigger: none
),以便该管道将标签推到prod分支时,Deploy to Stage
不会触发生成prod标签。
总而言之,如果要为不同的分支创建不同的管道,则必须创建不同的管道yml文件。
答案 1 :(得分:1)
我试图重现您的情况,但我无法获得相同的结果。
因此对于stage
中的管道
trigger:
tags:
include:
- stage@*
steps:
- powershell: Write-Host "stage"
和prod
trigger:
tags:
include:
- prod@*
steps:
- powershell: Write-Host "prod"
我知道了:
但是,我建议您使用其他方法,因为这很容易出错,因为合并两个分支时,您始终需要牢记不要触摸此文件。创建两个单独的分支,一个分支带有用于舞台标签的触发器,另一个分支带有用于prod标签的触发器。将常见内容提取到模板中,如果任务中的某些参数不同,请在模板中将它们作为参数。 关于模板,您可以阅读here。