首页 > 解决方案 > Azure Devops - 为每个部署环境创建一个映射变量

问题描述

部署微服务时,我需要从 Azure 安全文件存储下载证书文件。我有大约十几个微服务,每个微服务大约有 6 个生命周期/环境。证书名称不遵循严格的命名约定。我想创建一个变量 hashmap/map/associative 数组。

我尝试将这些作为参数输入 azure-pipeline.yaml

- name: sslCerts
  type: object 
  default:
  - environmentName: Development
    sslCertificate: service1-dev.p12
    sslCertificateKey: service1-dev
  - environmentName: Sandbox
    sslCertificate: service1-sbxdev.p12
    sslCertificateKey: service-sbxdev-key

但我不知道如何取消引用它们:

jobs: 
  # ######################## Stage: Terraform Plan and Apply in Dev ########################
  - template: ../azure-pipelines-template/apply-stages.yml
    parameters:
      sslCertificate: ${{ parameters.sslCerts[${{ parameters.envName }} ].sslCertificate)

然后我尝试了“B”计划来编写一个 powershell 脚本来输出简单的变量。它在作业开始运行之前因为 DownLoadSecureFile 任务错误而失败(未找到安全文件)。所以下面的代码永远没有机会运行。

$DeploymentPath = $args[0]

$certs = @{
    Sandbox = {
        certName = "sbx-cert"
        certKey  = "sbx-cert-key"
    }
    Development = {
        certName = "dev-cert"
        certKey  = "dev-cert-key"
    }

}

$cert = $certs[$DeploymentPath]

# These Magic Codes create variable in Azure Devops 
write-output "##vso[task.setvariable variable=sslCertificate]$cert.certName"
write-output "##vso[task.setvariable variable=sslCertificateKeyFile]$cert.certKey"

我真的不想创建 70 多个变量文件(微服务和环境的每种组合)。是否有一些我缺少的对象参数的插值。我可以在脚本或 terraform 中复制 DownloadSecureFile 任务并将其从 AzureDevops yaml 中取出吗?

标签: azure-devopsyaml

解决方案


你非常接近,有两件事需要改变:

  1. 将您的参数声明为映射(而不是数组):

    parameter:
    - name: sslCerts
      type: object 
      default:
        Development:
          sslCertificate: service1-dev.p12
          sslCertificateKey: service1-dev
        Sandbox:
          sslCertificate: service1-sbxdev.p12
          sslCertificateKey: service-sbxdev-key
    

    这样环境名就变成了key,引用的时候就可以使用了。

  2. 一旦你在里面${{ }},就不需要嵌套它:

    jobs: 
    # ######################## Stage: Terraform Plan and Apply in Dev ########################
    - template: ../azure-pipelines-template/apply-stages.yml
      parameters:
        sslCertificate: ${{ parameters.sslCerts[parameters.envName].sslCertificate $}}
    
    

推荐阅读