【问题标题】:Loops and arrays in Azure Devops PipelinesAzure Devops Pipelines 中的循环和数组
【发布时间】:2020-07-10 13:49:43
【问题描述】:

您可以使用类似于-${{ each x in y }}: 的语法在 devops 管道 YAML 中创建循环。据我了解,y 可以是一个数组。

但是,我发现each 没有文档。描述其用法示例的唯一页面是the "Templates" page.

所以我的问题是:我该如何指定一个数组?我知道一种方法是使用-${{ each book in parameters.books }}:,然后传入books 的“列表”,例如:

- template: template.yml
  parameters: 
    books:
      - book1
      - book2
      - book3

不过,我还想将数组定义为变量:

variables:
  books:
    - book1
    - book2
    - book3

但是,为此,ADO 会抛出错误 A sequence was not expected

没有办法定义这样的数组吗?我想我会将这些称为-${{ each book in variables.books }}: 如果没有,还有其他方法可以指定列表吗?

【问题讨论】:

    标签: azure azure-devops azure-pipelines


    【解决方案1】:

    不支持将数组定义为变量,variable syntaxvariables: { string: string }。检查以下情况:

    https://developercommunity.visualstudio.com/content/problem/812728/variables-in-yaml-pipeline-are-not-allowing-to-def.html

    Yaml 变量一直是字符串:字符串映射。

    我们正准备在不久的将来发布一项功能,让您 传递更复杂的结构。敬请期待!

    目前只能使用参数传递和循环数组:

    parameters:
    - name: 'param'
      type: object
      default: 
      - FOO
      - BAR
      - ZOO
    
    steps:
    - ${{ each p in parameters.param }}:
      - script: echo ${{ p }}
    

    【讨论】:

    • 感谢您的回答,但我必须使用变量。参数是我现在的做法,但使用变量会使我的管道更简单。
    • 如果您可以删除您的参数建议并将此链接 developercommunity.visualstudio.com/content/problem/812728/… 添加到您的答案中,我会将其标记为已接受。
    • @SohamDongargaonkar 我已经修改了答案。
    • 我使用 MS azure 的次数越多,我不得不承认 MS 在支持其产品方面已经走了很长一段路,尤其是像 @CeceDong-MSFT 这样监控和回答 azure 问题的人......五颗星! !!!!!!
    • 这很好用,即使在从主脚本调用的模板中,但我无法让它与动态生成的列表一起工作,然后按照这个答案stackoverflow.com/questions/63387037/… 的建议传递给模板@我得到了错误:“预期的序列或映射。实际值 '$(VariableName)'”
    【解决方案2】:

    我克服变量数组限制的方法是将变量值字符串转换为管道中的数组。 参数不是一个选项,因为它们在管道运行时向用户公开。

    在 Variables.prod.yaml 中:

    variables:
    - name: prod_vmnames
      value: VM1, VM2, VM3
    

    正在筹备中:

    scriptType: bash
    scriptLocation: inlineScript
    inlineScript: |
      echo "$(date +"%Y-%m-%d %H:%M:%S") - INFO  - Script started"
      
      # "Generating Prod VMs array"
      IFS="," read -a vms_array <<< ${{ variables.prod_vmnames }}
      echo "VMs array is: $vms_array"
    
      # Run script on all VMs
      chmod +x AzVmRun.sh
      for vm in ${vms_array[@]}
      do
        echo "Launching script /Scripts/AzVmRun.sh on vm: $vm"
        ./AzVmRun.sh \
          -v $vm -k ${{ variables.kvname }}
      done
    

    HTH。

    【讨论】:

      猜你喜欢
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2021-03-16
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多