Azure Devops管道中的循环和数组

时间:2020-07-10 13:49:43

标签: azure azure-devops azure-pipelines

您可以使用与-${{ 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 }}:,否则,还有其他方法可以指定列表吗?

2 个答案:

答案 0 :(得分:3)

不支持将数组定义为变量,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 }}

答案 1 :(得分: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。