繁体   English   中英

Azure Devops Pipeline 中的变量组 yaml 变量表达式

[英]Variable group yaml variable expression in Azure Devops Pipeline

我在使用 AzureKeyVault 任务进行变量表达式时遇到了困难。 azureSubscription 和 KeyVaultName 值表达式都没有被解析为在变量组中包含变量。 如果我在 yaml 中以任何方式手动定义这些变量,它就会起作用。 在 azure-pipelines.yml 或我在阶段开始时导入的模板 variables_test.yml 中。

我在文档中读到,变量组中的变量应该像这样 $(var) 那样使用,但是它会抛出一个错误,说像“$(var)”这样的订阅不存在。

模板:azure-pipelines.yml:

- stage: Test

  variables:
  - template: variables_Test.yml  # Template reference
  - group: testVariableGroup

  dependsOn: []

  jobs:

  - job: Test
    
    steps:

    - task: AzureKeyVault@1
      inputs:
        azureSubscription: ${{ variables.spn_kv_app }}
        KeyVaultName: ${{ variables.keyVaultName }}
        SecretsFilter: '*'

在登台的日志中,我可以看到从变量组中设置的变量:

Job preparation parameters
Variables:
  keyVaultName: $[ variablegroups.testVariableGroup.keyVaultName ]
  resourceGroupName: $[ variablegroups.testVariableGroup.resourceGroupName ]
  spn_cd_app: $[ variablegroups.testVariableGroup.spn_cd_app ]
  spn_kv_app: $[ variablegroups.testVariableGroup.spn_kv_app ]
  storageAccountName: $[ variablegroups.testVariableGroup.storageAccountName ]

需要注意的重要一点是,这些变量未设置为变量组中的机密。

附注。 对于任何有兴趣的人。 我创建了票证:

https://github.com/MicrosoftDocs/vsts-docs/issues/7586

https://developercommunity.visualstudio.com/content/problem/949342/azuresubscription-serviceconnection.html

如果有什么会被解决,我会发布一个答案。

我不认为这是一个错误,而是一个产品限制。 有两种字段不能分配“外部”(也称为 var 组)变量:

  • 指向Service Connections的那些,用于许多不同类型的任务,例如 ARM 模板部署。 (根据任务可能有许多不同的名称,例如“azureSubscription”、“serviceConnection”等)
  • 环境名称,在部署作业中是必需的

这实际上是记录在案的,但在一个非常隐蔽的地方(应该在主变量页面上!)。 请参阅此处的最后一段。

您可能会说“但我在 XYZ 情况下使用了它并且它起作用了!” 我同意你的看法,但这是非常不可预测的,取决于任务的类型。 根据经验,我从不在可变组中使用服务连接和环境。

但是存在一种解决方法! 您可以不使用 vargroups,而是在主管道中使用带有静态值的变量(以后可以根据需要调用任意数量的模板),甚至可以使用“变量文件”,它就像变量组一样工作,这是一个外部 yaml 模板包含这些变量及其值。 因此,通过这样做,您可以将这些参数保存在一个位置,而无需在解决方案中的每个管道和模板上查找它们。

这是最基本的例子:

main_pipeline.yml:

variables:
  - service_connection: my-service-connection-name
  - environment: Production

jobs:
  - deployment: JOB_DEPLOY
    environment: ${{ variables.environment }}
    strategy:
      runOnce:
        deploy:
          steps:
            - task: AzurePowerShell@5
              inputs:
                azureSubscription: '${{ variables.service_connection }}'
                ScriptType: 'FilePath'
                ScriptPath: '$(Build.Repository.LocalPath)/my_script.ps1'

您还可以指向外部变量模板:

main_pipeline.yml:

variables:
  - template: project-settings.yml@self

jobs:
  - deployment: JOB_DEPLOY
    environment: ${{ variables.environment }}
    strategy:
      runOnce:
        deploy:
          steps:
            - task: AzurePowerShell@5
              inputs:
                azureSubscription: '${{ variables.service_connection }}'
                ScriptType: 'FilePath'
                ScriptPath: '$(Build.Repository.LocalPath)/my_script.ps1'

项目设置.yml:

variables:
  - name: service_connection
    value: my-service-connection-name
  - name: environment
    value: Production

这两个示例的工作方式相同。 重要的是在文件中包含静态值,并使用所谓的“模板表达式”语法( ${{ }} )。 这样做的原因是因为模板表达式运行管道之前得到处理,并且那时系统只能使用静态值。 这使得这些服务连接和环境能够在需要时获取变量的值。

Azure Devops Pipeline 中的变量组 yaml 变量表达式

它应该与$(var) 尝试检查以下测试 yaml 文件:

主 Yaml:

trigger:
- master

variables:
- group: Test2

pool:
  vmImage: 'windows-latest'

stages:

- template: azure-pipelines.yml

模板azure-pipelines.yml

stages:
- stage: Test

  dependsOn: []

  jobs:

  - job: Test

    steps:

    - task: AzureKeyVault@1
      inputs:
        azureSubscription: $(spn_kv_app)
        KeyVaultName: $(keyVaultName)
        SecretsFilter: '*'

还有我的变量组:

在此处输入图片说明

作为测试结果:

在此处输入图片说明

所以,它在我这边工作正常。 请检查您的变量组名称和变量名称。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM