Azure devops 我希望Azure管道构建与触发管道刚刚构建的分支同名的分支

Azure devops 我希望Azure管道构建与触发管道刚刚构建的分支同名的分支,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,问题 我在一个项目中有两个存储库A和B,每个存储库都有自己的管道A-CI和B-CI。回购是Azure回购Git(因此不是外部回购)。我让它在A-CI完成时触发管道B-CI。如果A-CI被提交到分支develope触发,则B-CI被触发以生成master,尽管B也有develope分支。 我想在a的新开发版本构建完成后,为开发环境构建一个新版本的B 是否可以让管道资源触发B-CI管道,以构建与管道资源刚刚构建的分支同名的分支?如果在B中没有匹配的分支,那么它可以返回到master 但是,如果A-C

问题

我在一个项目中有两个存储库
A
B
,每个存储库都有自己的管道
A-CI
B-CI
。回购是Azure回购Git(因此不是外部回购)。我让它在
A-CI
完成时触发管道
B-CI
。如果
A-CI
被提交到分支
develope
触发,则
B-CI
被触发以生成
master
,尽管
B
也有
develope
分支。
我想在
a
的新开发版本构建完成后,为开发环境构建一个新版本的
B

是否可以让管道资源触发
B-CI
管道,以构建与管道资源刚刚构建的分支同名的分支?如果在
B
中没有匹配的分支,那么它可以返回到
master

但是,如果
A-C
B-CI
都引用同一存储库的不同管道YAML,则此场景是可行的

管道YAML

A-CI

触发器:
- '*'
阶段:
-阶段:建造
工作:
-工作:建筑工作
游泳池:
名称:“MyBuildPool”
步骤:
-powershell:|
编写主机“Building A”
B-CI

资源:
管道:
-管道:管道A
资料来源:“A-CI”
触发:
分支机构:
-主人
-发展
-特征/*
触发:
- '*'
阶段:
-阶段:建造
工作:
-工作:建筑工作
游泳池:
名称:MyBuildPool
步骤:
-powershell:|
写入主机$(Build.SourceBranch)#始终是refs/heads/master
写入主机$(Build.Reason)#是ResourceTrigger
背景信息

这背后的主要思想是,
A
包含IaC项目,每当项目的基础架构发生变化时,也应该部署所有应用程序。
我不想将IaC放入应用程序repo中,因为我们有多个应用程序,所以我必须将IaC代码分成几个块。
然后我可能仍然会遇到同样的问题,因为一些资源(如Azure KeyVault)在应用程序之间共享,因此
A
仍将包括所有应用程序使用的常用内容,对其进行更改将需要重新部署所有应用程序。

请检查:

如果触发管道和被触发管道使用相同的存储库,那么当一个管道触发另一个管道时,两个管道将使用相同的提交运行。如果您的第一个管道构建代码,而第二个管道对其进行测试,这将非常有用

但是,如果两个管道使用不同的存储库,则触发的管道将使用其默认分支中的最新版本的代码。

在这种情况下,由于
master
如果
B-CI的默认分支
$(Build.SourceBranch)
始终是
refs/heads/master

作为解决方法:

您可以为存储库
B
创建新的yaml管道。您可以将yaml文件的类似内容用于B-CI。您只需将其中的某些内容更改为:

resources:
  pipelines:
    - pipeline: Pipeline_A
      source: 'A-CI'
      trigger:
        branches:
          - develop

当我们创建新的yaml文件时,它总是放在主分支中。对我来说,我在dev branch中创建了一个同名文件,并在其中复制了相同的内容。然后我删除了master branch中的新yaml文件,现在当构建A-CI管道的开发时,将使用B repos的开发。

我认为我找到了一个很好的解决方法,因为内置管道触发器没有解决我们的具体问题(尽管我不能说我们是否有一个奇怪的方法和更好的方法)

我现在所做的是基于此使用,并手动触发管道

管道YAML

A-CI

触发器:
- '*'
阶段:
-阶段:建造
displayName:构建一些东西并创建管道工件
工作:
-工作:建筑工作
游泳池:
名称:“MyBuildPool”
步骤:
-powershell:|
编写主机“Building A”
#省略了发布工件的步骤
-阶段:触发管道
displayName:触发应用程序管道
工作:
-工作:TriggerAppPipelinesJob
displayName:触发应用程序管道
步骤:
-bash:az扩展列表| grep azure devops
displayName:“确保已安装Azure CLI DevOps扩展”
-狂欢节:|
echo${AZURE_DEVOPS_CLI_PAT}az DEVOPS登录
az devops配置--默认组织=https://dev.azure.com/MyOrg project=“MyProject”--使用git别名true
displayName:“登录Azure CLI”
环境:
AZURE_DEVOPS_CLI_PAT:$(System.AccessToken)
#通过传递这个A-CI运行的构建Id,我可以在B-CI中使用它来下载A-CI的匹配工件。
#如果没有匹配的分支,则该命令失败。
-狂欢节:|
az管道运行--分支$(Build.SourceBranch)--名称“B-CI”--变量a_Version=“$(Build.BuildId)”-o无
displayName:“触发器管道”
B-CI

触发器:
- '*'
阶段:
-阶段:建造
工作:
-工作:建筑工作
游泳池:
名称:MyBuildPool
步骤:
-powershell:|
写入主机$(Build.SourceBranch)#与触发A-CI分支相同
写入主机$(Build.Reason)#B-CI是手动触发的,但用户是项目集合生成服务,因此可以区分自动运行

由于B-CI现在是手动触发的,因此不再需要资源节点。

请为我指出解释此行为的文档部分。您的变通方法是否意味着不可能在A-CI构建的基础上构建每个匹配的分支?我们使用git flow作为分支策略,因此发布/*分支、修补程序/*、开发和维护