首页 > 解决方案 > Azure DevOps YAML模板传递哈希集/映射/字典/对象-键值?

问题描述

假设我有一个主要的 azure devops 管道 azure-pipelines.yml,我在其中调用了我的模板 deploy.yml。

在主管道中,我希望能够声明散列集/映射/字典类型的变量或参数或任何其他可以传递给模板的键值结构。

我可以看到可以传入对象类型,但我无法理解它的用法。我怎样才能实现以下目标?

请注意appSettings: {"key1":"value1","key2":"value2"}azure-pipelines.yml 中的内容是一种幻想,但很好地展示了我希望它如何工作。

天蓝色管道.yml:

trigger:
 - main

- job: deploy
  pool:
    vmImage: ${{ parameters.poolVmImage }}
  steps:
  - template: deploy.yml
    parameters:
      azureServiceConnection: ${{ parameters.azureServiceConnection }}
      resourceGroupName: 'foo'
      appServiceName: 'bar'
      appSettings: {"key1":"value1","key2":"value2"}

部署.yml:

parameters:
  - name: azureServiceConnection
  - name: resourceGroupName
  - name: appServiceName 
  - name: appSettings

steps:
- task: AzureCLI@2
  displayName: Deploy zip
  name: deployZip
  inputs:
    azureSubscription: ${{ parameters.azureServiceConnection }}
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az webapp deployment source config-zip \
        -g ${{ parameters.resourceGroupName }} \
        -n ${{ parameters.appServiceName }} \
        --src ./deployment.zip

      az webapp config appsettings set \
        -g ${{ parameters.resourceGroupName }} \
        -n ${{ parameters.appServiceName }} \
        --settings ${{ parameters.appSettings }}

标签: azureazure-devopsyamlazure-pipelines

解决方案


我怎样才能实现以下目标?

您确实可以使用对象类型参数。

但是在模板中,不能一次使用多个对象参数,所以需要使用每个表达式循环遍历每个对象。

例如: - ${{ each setting in parameters.appSettings }}:

这是我的示例,您可以参考:

部署.yml:

parameters:
  - name: azureServiceConnection
  - name: resourceGroupName
  - name: appServiceName 
  - name: appSettings
    type: object
    default: []

steps:

- task: AzureCLI@2
  displayName: Deploy zip
  name: deployZip
  inputs:
    azureSubscription: ${{ parameters.azureServiceConnection }}
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az webapp deployment source config-zip \
        -g ${{ parameters.resourceGroupName }} \
        -n ${{ parameters.appServiceName }} \
        --src ./deployment.zip


- ${{ each setting in parameters.appSettings }}: 
  - task: AzureCLI@2
    displayName: Deploy settings
    inputs:
      azureSubscription: ${{ parameters.azureServiceConnection }}
      scriptType: 'bash'
      scriptLocation: 'inlineScript'
      inlineScript: |
        az webapp config appsettings set \
          -g ${{ parameters.resourceGroupName }} \
          -n ${{ parameters.appServiceName }} \
          --settings ${{ setting }}

天蓝色管道.yml:

trigger:
 - none

parameters:
- name: InstanceArgs 
  type: object
  default: [key2=value2,key3=value3]
jobs:
- job: deploy
  pool:
    vmImage: windows-latest
  steps:

  - template: deploy.yml
    parameters:
      azureServiceConnection: '${{ parameters.azureServiceConnection }}'
      resourceGroupName: 'foo'
      appServiceName: 'bar'
      appSettings: ${{ parameters.InstanceArgs }}

注意:由于模板中的参数是obejct类型,所以需要在主yaml文件中设置相同类型的参数来传递对象。

工作流程:将对象类型参数传递给模板。该模板将首先运行 deploy zip 命令。然后它会遍历每一个传递的对象,并使用config settings命令将它们一个一个传递给webapp。

结果:

在此处输入图像描述


推荐阅读