【问题标题】:Can you pass Variable Group values to sub template in yaml?您可以将变量组值传递给 yaml 中的子模板吗?
【发布时间】:2020-12-10 12:50:06
【问题描述】:

我正在尝试创建一个多阶段管道,其中为管道的每个阶段定义了变量组。目标是将组中的值作为参数传递给子模板。似乎在阶段定义的 Group 的值没有传递到子模板。它用空字符串覆盖“DEFAULTVALUE”。

pipeline.yml

trigger:
- none

pool:
  name: 'Azure Pipelines'
  vmImage: windows-latest

stages:
  - stage: DEV
    variables:
      - group: my-group-dev
    jobs:
      - template: sub-template.yml
        parameters:
          env: 'dev'
          subscriptionName: '$(SubscriptionName)' # This reference from the variable group doesn't get passed in
          subscriptionId: '$(SubscriptionId)'

  - stage: TEST
    variables:
      - group: my-group-test
    jobs:
      - template: sub-template.yml
        parameters:
          env: 'test'
          subscriptionName: '$(SubscriptionName)' # This reference from the variable group doesn't get passed in
          subscriptionId: '$(SubscriptionId)'

sub-template.yml

parameters:
  env: 'DEFAULTVALUE'
  subscriptionName: 'DEFAULTVALUE'
  subscriptionId: 'DEFAULTVALUE'

jobs:
  - deployment: ResourceDeployment
    displayName: Deploy Resources ${{ parameters.env }}
    environment: ${{ parameters.env }}
    strategy:
      runOnce:
        deploy:
          steps:
            - task: AzureFileCopy@4
              displayName: 'Upload ARM Templates'
              inputs:
                sourcePath: '$(Pipeline.Workspace)/templates'
                azureSubscription: '${{ parameters.subscriptionName }}'
                destination: 'azureBlob'
                storage: 'my-storage-account'
                containerName: 'arm'
              name: AzureFileCopy

            - task: AzureResourceManagerTemplateDeployment@3
              inputs:
                deploymentScope: 'Resource Group'
                azureResourceManagerConnection: '${{ parameters.subscriptionName }}'
                subscriptionId: '${{ parameters.subscriptionId }}'
                action: 'Create Or Update Resource Group'
                resourceGroupName: 'my-resource-group'
                location: 'eastus2'
                templateLocation: 'URL of the file'
                csmFileLink: '$(AzureFileCopy.StorageContainerUri)${{ parameters.env }}/templates/main.json$(AzureFileCopy.StorageContainerSasToken)'

我也尝试在子模板中添加变量组,但也无法正确解析...

有谁知道这是否可行?

【问题讨论】:

    标签: azure azure-devops


    【解决方案1】:

    在阶段级别下定义的变量组中无法引用服务连接端点是一个已知问题。

    您可以通过以下解决方法解决此问题:

    1、在全局级别而不是阶段级别定义变量组见下图:

    trigger:
    - none
    
    pool:
      name: 'Azure Pipelines'
      vmImage: windows-latest
    
    # define the variable group under global level.
    
    variables:
    - group: my-group-dev
    - group: my-group-test
    
    
    stages:
      - stage: DEV
        jobs:
          - template: sub-template.yml
            parameters:
              env: 'dev'
              subscriptionName: '$(SubscriptionName)' # This reference from the variable group doesn't get passed in
              subscriptionId: '$(SubscriptionId)'
    
      - stage: TEST
        jobs:
          - template: sub-template.yml
            parameters:
              env: 'test'
              subscriptionName: '$(SubscriptionName)' # This reference from the variable group doesn't get passed in
              subscriptionId: '$(SubscriptionId)'
    

    2、在UI页面链接变量组。

    在yaml管道编辑页面-->点击3dots-->Triggers-->Variables Tab-->Link Variables组

    请参阅下面的主题以获取更多信息。

    Using a variable for the service connection

    Azure subscription endpoint ID cannot be provided through a variable in build definition YAML file

    【讨论】:

    • 谢谢。我将尝试添加共享变量组并按约定访问服务连接名称。
    • 通过知道问题只是服务连接参数来解决它。感谢您的帮助,我希望 MSFT 尽快解决问题,这样其他人就不必忍受这种废话了!
    • 嗨,Levi,我刚刚重新审视了这个。我最终通过使用来自 Github 问题的一些信息让它工作。它涉及引用一个“共享”变量组,该变量组包含两个连接的连接名称,然后作为参数传递给子步骤。
    【解决方案2】:

    您需要将变量组名称传递给模板,并在模板级别将其应用于变量范围,如下所示:

    parameters:
      env: 'DEFAULTVALUE'
      subscriptionName: 'DEFAULTVALUE'
      subscriptionId: 'DEFAULTVALUE'
      variableGroupName: 'DEFAULTVALUE`
    
    jobs:
      - deployment: ResourceDeployment
        displayName: Deploy Resources ${{ parameters.env }}
        environment: ${{ parameters.env }}
        variables:
          - group: {{ paramaters.variableGroupName }}
        strategy:
          runOnce:
            deploy:
              steps:
                - task: AzureFileCopy@4
                  displayName: 'Upload ARM Templates'
                  inputs:
                    sourcePath: '$(Pipeline.Workspace)/templates'
                    azureSubscription: '${{ parameters.subscriptionName }}'
                    destination: 'azureBlob'
                    storage: 'my-storage-account'
                    containerName: 'arm'
                  name: AzureFileCopy
    
                - task: AzureResourceManagerTemplateDeployment@3
                  inputs:
                    deploymentScope: 'Resource Group'
                    azureResourceManagerConnection: '${{ parameters.subscriptionName }}'
                    subscriptionId: '${{ parameters.subscriptionId }}'
                    action: 'Create Or Update Resource Group'
                    resourceGroupName: 'my-resource-group'
                    location: 'eastus2'
                    templateLocation: 'URL of the file'
                    csmFileLink: '$(AzureFileCopy.StorageContainerUri)${{ parameters.env }}/templates/main.json$(AzureFileCopy.StorageContainerSasToken)'
    

    这类似于this topic:

    出于安全原因,我们只允许您通过显式参数将信息传递到模板代码中。 https://docs.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=azure-devops

    这意味着使用您的模板的管道的作者需要提交更改,他们将所需的信息明确传递到您的模板代码中。

    这有一些例外,变量是在同一个文件中或在管道编译时静态定义的,但一般来说,最好对不涉及系统定义的只读动态变量的所有内容使用参数和自定义的动态输出变量。

    我必须变量组

    • 质量检查
    • 产品

    两者都有isProd变量

    然后我的模板是

    parameters:
      variableGroupName: 'QA'
    
    jobs:
    - job: ResourceDeployment
      variables:
      - group: ${{ parameters.variableGroupName }}
      steps:
      - script: echo '$(isProd)'
    

    主文件是

    trigger: none
    pr: none
    
    stages:
    - stage: QA
      jobs:
      - template: sub-template.yml
        parameters:
          variableGroupName: 'QA'
    
    - stage: PROD
      jobs:
      - template: sub-template.yml
        parameters:
          variableGroupName: 'PROD'
    

    我得到了:

    【讨论】:

    • 非常感谢,我会尽快尝试一下 - 戴夫
    • 嗨,这并没有治愈它。我将 AzureFileCopy 任务中 azureSubscription 的值引用为 $(_ServiceConnectionName)。我试过带引号,不带引号,还有${{ variables._ServiceConnectionName }}
    • _ServiceConnectionName是变量组中的变量名?
    • 感谢您对此的帮助。似乎另一个人(Levi)一针见血,因为引用服务连接名称是一个问题。 MSFT 的一些奇怪的内部运作,但至少现在我让它工作......
    • @DavidC 很酷。很高兴您解决了您的问题。
    猜你喜欢
    • 2023-03-20
    • 2022-06-29
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多