有没有一种方法可以在Azure DevOps Pipelines YAML中参数化/动态设置变量组名称?

时间:2020-02-10 22:11:21

标签: azure azure-devops azure-pipelines azure-pipelines-release-pipeline

我有一个嵌套的Azure DevOps YAML管道:

---
name: Some Release Pipeline

trigger: none

variables:
  - group: "DEV VARIABLE GROUP" # This is the environment variable library

stages:
  - stage: Stage1
    displayName: "Stage 1"
    dependsOn: []
    jobs:
      - template: /pipelines/pipeline_templates/sometemplate.yml

我想做的是在任何环境中重用此发布管道。理想情况下,我将设置管道变量“ group-name”,然后将其分配给该组。像这样:

---
name: Some Release Pipeline

trigger: none

variables:
 - group: "$(group-name)" # This is the environment variable library

stages:
 - stage: Stage1
    displayName: "Stage 1"
    dependsOn: []
    jobs:
      - template: /pipelines/pipeline_templates/sometemplate.yml

但是,这似乎不起作用。拼命地,我尝试了多种方法:

  • 使用${{ group-name }}
  • 我尝试使用以下方式将组名作为参数传递:
    jobs:
      - template: /pipelines/pipeline_templates/sometemplate.yml
        parameters:
          variablegroup: $(group-name)

,然后在作业中的sometemplate.yml中进行设置。例如:

jobs:
  - job: Job1
    variables:
      - group: ${{ parameters.variablegroup }}

但是,这也不起作用。

  • 我尝试按照建议的insertion使用here{{ insert }})。但是,或者我不知道如何正确使用插入,或者由于我总是遇到某种形式的验证错误而无法正常工作。

根据thisthisthisthis看来似乎不可能。

我想知道是否有人找到了解决方案(然后进行调用DevOps REST API的杂乱工作)?

3 个答案:

答案 0 :(得分:0)

您是否尝试注入变量mapping as a parameter

参数不限于标量字符串。只要参数扩展的地方希望有映射,该参数就可以是映射。同样,可以在需要序列的地方传递序列。

# sometemplate.yml
parameters:
  variables: {}

jobs:
- job: build
  variables: ${{ parameters.variables }}
# somepipeline.yml
name: Some Release Pipeline

trigger: none

stages:
 - stage: Stage1
    displayName: "Stage 1"
    dependsOn: []
    jobs:
      - template: sometemplate.yml
        parameters:
          variables: 
            group: "DEV VARIABLE GROUP"

我已经使用参数将任务集注入到模板中其他任务之前/之后的动作中,但是我没有使用它来注入映射。我认为该特定实现会变得棘手的领域在the need to use name/value syntax中。我想如果您要将组映射传递到作业中,则定义变量的任何其他操作都需要使用扩展语法。

如果同时使用变量和变量组,则必须对各个(未分组的)变量使用名称/值语法:

此外,在使用运行时$()与“编译”或扩展时间${{ }}语法时,可能还需要小心。使用变量时,您可能希望尽可能使用扩展时间参考。

答案 1 :(得分:0)

您将组名作为参数传递给模板的直觉是正确的。我能够使它正常工作:

模板文件passing-variable-groups.yml

parameters:
- name: deploymentVariableLibraries
  type: object
  default:
    dev: ''
    qa: ''
    prod: ''

jobs:
- job: TestDev
  variables:
    - group: ${{parameters.deploymentVariableLibraries.dev}}
  steps:
    - script: echo "$(whichEnvironment)"
- job: TestQa
  variables:
    - group: ${{parameters.deploymentVariableLibraries.qa}}
  steps:
    - script: echo "$(whichEnvironment)"
- job: TestProd
  variables:
    - group: ${{parameters.deploymentVariableLibraries.prod}}
  steps:
    - script: echo "$(whichEnvironment)"

管道

trigger: none

resources:
  repositories:
    - repository: templates
      type: git
      name: c4ePipelineExamples-Templates

jobs:
- template: passing-variable-groups.yml@templates
  parameters:
    deploymentVariableLibraries:
      dev: 'test-dev'
      qa: 'test-qa'
      prod: 'test-prod'

每个作业的输出分别是DEV,QA和PROD(每个测试变量库中whichEnvironment的值)。

答案 2 :(得分:0)

以下对我有用,没有任何模板

variables:
- group: variables-${{variables['Build.SourceBranchName']}}