我尝试使用预定义变量 Build.Repository.Name 在 yml azure 管道中动态提供变量组的名称。 我在管道中添加了一些存储库作为附加资源,它们根据某个分支上的提交触发管道。
这是当前的管道:
parameters:
- name: repos
type: object
default: [repo1, repo2]
resources:
repositories:
- repository: repo1
type: git
name: project1/repo1
- repository: repo2
type: git
name: project1/repo2
jobs:
- ${{each repo in parameters.repos}}:
- job:
displayName: Repo ${{ repo }}
variables:
- group: ${{ repo }}
steps:
- script: |
if [ "$(Build.Repository.Name)" != ${{ repo }} ]; then
echo "Skipping to the next repo"
return 0
fi
displayName: Finding the trigger repository
- template: template/do-work.yml
上面的管道按原样工作,但它很快就会遍历所有存储库,我需要添加 10 多个存储库,这会减慢管道速度。
如果接受以下内容就完美了,但在这种情况下,变量的值是管道所在的存储库,而不是触发存储库:
variables:
- group: ${{ variables['Build.Repository.Name']
根据您的需求,您需要根据触发仓库名称设置变量组名称。
恐怕没有现成的方法可以直接满足您的要求。
变量组字段将在编译时设置变量。编译时变量:Build.Repository.Name指向的值就是Pipeline所在的repo。
在运行时,变量的值将更改为触发 Pipeline 的资源存储库的名称。
所以当我们使用编译时格式:
- group: ${{ variables['Build.Repository.Name']}}
时,它只会设置Pipeline所在的repo,而不会触发repo。
目前,我们没有预定义变量可以正确读取在编译时触发管道的存储库名称。
作为解决方法,您可以将管道拆分为两个管道。第一个管道将使用 PowerShell/Bash 脚本将运行时变量:$(Build.Repository.Name)值传递给第二个管道中的参数值。
例如:
管道一:
resources:
repositories:
- repository: repo1
type: git
name: project1/repo1
- repository: repo2
type: git
name: project1/repo2
jobs:
- job: Passvariable
steps:
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
$token = "$(pat)"
$url="https://dev.azure.com/{Orgname}/{Projectname}/_apis/pipelines/{PipelineRunID}/runs?api-version=5.1-preview"
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))
$JSON = "
{
`"resources`": {
`"repositories`": {
`"self`": {
`"ref`": `"refs/heads/main`"
}
}
},
`"templateParameters`": {
`"Reponame`":`"$(Build.Repository.Name)`"
},
}"
$response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Post -Body $JSON -ContentType application/json
管道二:
parameters:
- name: repos
type: object
default: [repo1, repo2]
- name: reponame
type: string
jobs:
- ${{each repo in parameters.repos}}:
- job:
displayName: Repo ${{ repo }}
variables:
- group: ${{ paramters.reponame }}
steps:
- script: |
if [ "$(Build.Repository.Name)" != ${{ repo }} ]; then
echo "Skipping to the next repo"
return 0
fi
displayName: Finding the trigger repository
- template: template/do-work.yml