基于触发存储库的动态变量组选择

问题描述 投票:0回答:1

我尝试使用预定义变量 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']
azure azure-devops azure-pipelines
1个回答
0
投票

根据您的需求,您需要根据触发仓库名称设置变量组名称。

恐怕没有现成的方法可以直接满足您的要求。

变量组字段将在编译时设置变量。编译时变量: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
© www.soinside.com 2019 - 2024. All rights reserved.