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)”这样的订阅。
模板:
蔚蓝-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 ]
需要注意的重要一点是,这些变量未设置为变量组中的秘密。
PS。对于任何感兴趣的人。我创建了工单:
https://github.com/MicrosoftDocs/vsts-docs/issues/7586
如果有任何问题我会post回答。
Variable group yaml variable expression in Azure Devops Pipeline
它应该与 $(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: '*'
我的变量组:
作为测试结果:
所以,它在我这边工作得很好。请检查您的变量组名称和变量名称。
希望对您有所帮助。
我认为这不是错误,而是产品限制。有两种类型的字段不能分配“外部”(又名来自 var 组)变量:
- 指向服务连接的那些,用于许多不同类型的任务,例如 ARM 模板部署。 (根据任务可能有许多不同的名称,例如“azureSubscription”、“serviceConnection”等)
- 环境名称,在部署作业中是必需的
这实际上是有记录的,但是在一个非常隐蔽的地方(应该在主变量页面上!)。请参阅最后一段 here。
你可能会说 “但我在 XYZ 情况下使用了它并且它起作用了!” 我会同意你的看法,但这很难预测,取决于任务的类型.根据经验,我从不在变量组中使用服务连接和环境。
但有一个解决方法!您可以在主管道中使用具有静态值的变量(稍后可以调用任意数量的模板),甚至使用一个像变量组一样工作的“变量文件”,一个包含这些变量及其值的外部 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'
项目-settings.yml:
variables:
- name: service_connection
value: my-service-connection-name
- name: environment
value: Production
两个示例的工作方式相同。
重要的是在文件中包含静态值,并使用所谓的“模板表达式”语法(${{ }}
)。
这样做的原因是因为模板表达式在运行管道之前得到处理,并且在那个时候,系统只有静态值可用。这使得那些服务连接和环境能够在需要时获取变量的值。
我在 AzureKeyVault 任务的变量表达式方面遇到困难。 azureSubscription 和 KeyVaultName 值表达式都没有被解析为在变量组中具有变量。如果我在 yaml 中以任何方式手动定义这些变量,它就会起作用。在 azure-pipelines.yml 或我在阶段开始时导入的模板 variables_test.yml 中。
我在文档中读到,变量组中的变量应该像这样使用 $(var) 但它会抛出一个错误,指出不存在像“$(var)”这样的订阅。
模板: 蔚蓝-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 ]
需要注意的重要一点是,这些变量未设置为变量组中的秘密。
PS。对于任何感兴趣的人。我创建了工单:
https://github.com/MicrosoftDocs/vsts-docs/issues/7586
如果有任何问题我会post回答。
Variable group yaml variable expression in Azure Devops Pipeline
它应该与 $(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: '*'
我的变量组:
作为测试结果:
所以,它在我这边工作得很好。请检查您的变量组名称和变量名称。
希望对您有所帮助。
我认为这不是错误,而是产品限制。有两种类型的字段不能分配“外部”(又名来自 var 组)变量:
- 指向服务连接的那些,用于许多不同类型的任务,例如 ARM 模板部署。 (根据任务可能有许多不同的名称,例如“azureSubscription”、“serviceConnection”等)
- 环境名称,在部署作业中是必需的
这实际上是有记录的,但是在一个非常隐蔽的地方(应该在主变量页面上!)。请参阅最后一段 here。
你可能会说 “但我在 XYZ 情况下使用了它并且它起作用了!” 我会同意你的看法,但这很难预测,取决于任务的类型.根据经验,我从不在变量组中使用服务连接和环境。
但有一个解决方法!您可以在主管道中使用具有静态值的变量(稍后可以调用任意数量的模板),甚至使用一个像变量组一样工作的“变量文件”,一个包含这些变量及其值的外部 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'
项目-settings.yml:
variables:
- name: service_connection
value: my-service-connection-name
- name: environment
value: Production
两个示例的工作方式相同。
重要的是在文件中包含静态值,并使用所谓的“模板表达式”语法(${{ }}
)。
这样做的原因是因为模板表达式在运行管道之前得到处理,并且在那个时候,系统只有静态值可用。这使得那些服务连接和环境能够在需要时获取变量的值。