到目前为止,管道似乎运行良好。它是动态的,因为它将触发所有发布分支、所有存储库,这正是我们想要的。
我们真正想要的是能够使用后备引用,以防触发构建的分支 Build.SourceBranch 对于一个或多个存储库不可用。
trigger:
- none
pool:
name: <POOL_NAME>
demands:
- agent.name -equals <AGENT_NAME>
# Overrides the value for Build.BuildNumber, which is used to name the artifact (ZIP file) that is produced
name: '$(Date:yyyyMMdd)T$(Hours)$(Minutes)$(Seconds)'
resources:
repositories:
- repository: REPO-A
type: git
ref: $(Build.SourceBranch)
name: <COMPANY>/REPO-A
trigger:
branches:
include:
- 'release/*'
- repository: REPO-B
type: git
ref: $(Build.SourceBranch)
name: <COMPANY>/REPO-B
trigger:
branches:
include:
- 'release/*'
stages:
- stage: 'BuildAndUploadArtifact'
jobs:
- job:
workspace:
clean: all
steps:
- checkout: self
- checkout: REPO-A
- checkout: REPO-B
- task: CmdLine@2
inputs:
script: |
echo "hello, world!"
考虑这两种情况:
场景 1 - 使用此管道
场景 2 - 不适用于此管道
我们希望能够为 REPO-B 指定一个后备引用,以便它可以回退到该分支。如果使用 MASTER 指定后备引用,则 REPO-A 将使用 release/2024-1 分支,而 REPO-B 将使用 MASTER 分支。
今天可以实现吗?
注意!: 此管道已大大简化。实际上,还有更多的存储库,并且这些存储库在后续步骤中作为一个应用程序一起构建。
是的,您可以根据源分支动态定义变量值,然后将该变量用作repo-B ref 值。这样它就可以退回到 repo-B 来结帐。
下面的示例 yaml:
trigger: none
# dynamically set the branch value, please change according to your real requirement
variables:
${{ if or( eq(variables['Build.SourceBranchName'], 'dev1'), contains(variables['Build.SourceBranch'], 'bugfix/') ) }}:
branch: $(Build.SourceBranchName)
${{ else }}:
branch: 'main'
pool:
VMimage: Ubuntu-latest
resources:
repositories:
- repository: repo-A
name: 'wadetest1/test1'
ref: $(Build.SourceBranch)
type: git
trigger:
- bugfix/*
- release/*
- dev1
- repository: repo-B
name: 'wadetest1/test2'
type: git
ref: $(branch) #<- use the dynamic variable here
trigger:
- dev1
steps:
- checkout: self
- checkout: repo-A
- checkout: repo-B
它将在
main
上检出后备分支 repo-B
,因为它没有release/test1 分支: