Azure Devops Pipelines 中的循环和数组

a3y*_*3y3 7 azure azure-devops azure-pipelines

您可以使用类似于-${{ each x in y }}:. 根据我的理解,y可以是一个数组。

但是,我发现没有each. 描述其用法示例的唯一页面位于“模板”页面上。

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

- template: template.yml
  parameters: 
    books:
      - book1
      - book2
      - book3
Run Code Online (Sandbox Code Playgroud)

但是,我还想将数组定义为变量:

variables:
  books:
    - book1
    - book2
    - book3
Run Code Online (Sandbox Code Playgroud)

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

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

Cec*_*SFT 13

不支持将数组定义为变量,变量语法variables: { 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 }}
Run Code Online (Sandbox Code Playgroud)


leo*_*ess 10

您不需要模板来拥有 for 循环。只需使用split 函数

- stage:
  variables:
    - name: vars
      value: dev, nonprod, production

  jobs:
  - job: print_vars
    steps:
    - ${{ each var in split(variables.vars, ', ') }}:
      - script: |
          echo ${{ var }}
        displayName: Printing ${{ var }}
Run Code Online (Sandbox Code Playgroud)

您还可以使用变量对象本身作为映射,但这可能会导致问题。

- stage:
  variables:
    - name: DEV
      value: dev
    - name: NONPROD
      value: nonprod
    - name: PROD
      value: production

  jobs:
  - job: print_vars
    steps:
    - ${{ each var in variables }}:
      - script: |
          echo ${{ var.key }}
          echo ${{ var.value }}
        displayName: Printing ${{ var.key }}
Run Code Online (Sandbox Code Playgroud)


小智 5

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

在 Variables.prod.yaml 中:

variables:
- name: prod_vmnames
  value: VM1, VM2, VM3
Run Code Online (Sandbox Code Playgroud)

在管线中:

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
Run Code Online (Sandbox Code Playgroud)

哈。