数组到 yaml 中的字符串并绑定到变量

何俊

我正在尝试创建 azure 管道,其中一部分是使用任务 AzureResourceGroupDeployment,它将 overrideParameters 作为字符串的格式:'-key value'

我想组合多个参数并为多个项目使用 yaml 模板,所以这部分需要来自 azure 变量组值和键列表的组合来调用这些值。

基本上我有一个数组:

["foo", "bar"]

我喜欢将其转换为字符串:

"-foo fooValue -bar barValue"

foobar是键。

fooValuebarValue来自使用相同键名 foo 和 bar 映射的变量组。

我知道yaml 中有一个Each-expression,但不确定如何使用它将数组组合为单个字符串作为变量。

我也尝试制作 powershell 脚本,但它不会返回 $-signs 以便 yaml 稍后解析。

yaml 文件的一部分:

parameters:
  varGroup: '' # variable group
  overrideParamKeys: [] # list of keys to put in arm. example: ['foo', 'bar'] converts to '-foo $(foo) -bar $(bar)'

stages:

- stage: 'deploy_${{ parameters.environment }}'
  displayName: ${{ parameters.environment }}
  variables:
  - group: '${{ parameters.varGroup }}' # use variable groupo
  - name: armOverrideParamValues
    value: ''

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

  jobs:  
  - job: 'setup_arm_variables'
    condition: gt(length('${{ join('', parameters.overrideParamKeys) }}'), 0)
    steps:
    - pwsh: |
        Write-Host "overrideParamKeys $Env:overrideParamKeys"
        function Combine-ArmOverrideKeys {
          param (
            [Parameter(Mandatory=$true)]
            [string]
            $keysString
          )
          $keys = $keysString.Split(", ")
          $valString=""
          foreach($key in $keys) {
            $valString += " -$key \$($key)"
          }
          return $valString.Trim();
        }
        $armOverrideParamValues = Combine-ArmOverrideKeys -keys $Env:overrideParamKeys
        Write-Host armOverrideParamValues $armOverrideParamValues
      displayName: "Combining arm override keys to variable 'armOverrideParamValues'"
      name: armOverrideParamValues
      env:
        overrideParamKeys: ${{ join(', ', parameters.overrideParamKeys) }}

  - job: test_variables
    steps:
    - echo: variables.armOverrideParamValues $variables.armOverrideParamValues

  # ...other job with task AzureResourceGroupDeployment using overrideParameters with value from variables.armOverrideParamValues
何俊

我想到了:

使用 powershell 脚本将键 ["foo", "bar"] 的字符串数组转换为参数字符串模板“-foo ${foo} -bar ${bar}”,然后将在运行时使用它从可变组。结果 armOverrideParamVals 可以放在任务 AzureResourceGroupDeployment 输入 overrideParameters 中。

parameters:
  varGroup: '' # variable group
  overrideParamKeys: [] # list of keys to put in arm. example: ['foo', 'bar'] converts to '-foo $(foo) -bar $(bar)' Azure variable-group names are not case sensitive, arm template parameters are and start lowercase.
  environment: '' # env you are deploying to. example dev, test, prod

stages:

- stage: 'deploy_${{ parameters.environment }}'
  displayName: ${{ parameters.environment }}
  variables:
  - group: '${{ parameters.varGroup }}'
  - name: armOverrideParamValues
    value: ''

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

  jobs:  
  - job: 'setup_arm_variables'
    steps:
    - ${{ if eq(join('', parameters.overrideParamKeys), '') }}:
      - script: echo no overrideParamKeys
    - ${{ if not(eq(join('', parameters.overrideParamKeys), '')) }}:
    # joins overrideParamKeys to a string as -key ${key}
    # which will be converted at runtime in deployment stage to key value.
    # that will be then passed in to the armOverrideParameters of AzureResourceGroupDeployment
      - pwsh: |
          Write-Host "overrideParamKeys $Env:overrideParamKeys"
          function Combine-ArmOverrideKeys {
            param (
              [Parameter(Mandatory=$true)]
              [string]
              $keysString
            )
            $keys = $keysString.Split(", ")
            $valString=""
            foreach($key in $keys) {
              if($key -eq " " -or $key -eq "") {
                continue
              }
              $valString += " -$key " + '"$' + "($key)" + '"'
            }
            return $valString.Trim();
          }
          $armOverrideParamValues = Combine-ArmOverrideKeys -keys $Env:overrideParamKeys
          Write-Host armOverrideParamValues $armOverrideParamValues # for debug
          Write-Host "##vso[task.setvariable variable=armOverrideParamValues;isOutput=true]$armOverrideParamValues"
        displayName: "Combining arm override keys to variable 'armOverrideParamValues'"
        name: combineArmOverrideKeys
        env:
          overrideParamKeys: ${{ join(', ', parameters.overrideParamKeys) }}

  - deployment: 'deploy_arm'
    displayName: 'Deploy ARM Templates: ${{parameters.armFilePath}}'
    ${{ if not(eq(join('', parameters.overrideParamKeys), '')) }}:
      dependsOn: ['setup_arm_variables']
    variables:
      # gets the parameter template which is in format "-key ${key}"
      ${{ if not(eq(join('', parameters.overrideParamKeys), '')) }}:
        armOverrideParamVals: $[dependencies.setup_arm_variables.outputs['combineArmOverrideKeys.armOverrideParamValues']]
      ${{ if eq(join('', parameters.overrideParamKeys), '') }}:
        armOverrideParamVals: ''
    # rest of the deployment

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章