Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Loops and arrays in Azure Devops Pipelines

You can create a loop in devops pipelines YAML by using a syntax similiar to -${{ each x in y }}:. From my understanding, y can be an array.

However, I find that there is no documentation for each. The only page describing an example of it's usage is on the "Templates" page.

So my question is: how do I go about specifying an array? I know one way is to use -${{ each book in parameters.books }}: and then pass in a "list" of books like:

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

However, I'd also like to define an array as a variable:

variables:
  books:
    - book1
    - book2
    - book3

However, for this, ADO throws an error A sequence was not expected.

Is there no way to define an array like that? I'd imagine I'd then refer to these as -${{ each book in variables.books }}: If not, is there any other way to specify a list?

like image 701
a3y3 Avatar asked Jul 10 '20 13:07

a3y3


People also ask

What are the types of Pipelines in Azure DevOps?

Azure Pipelines combines continuous integration (CI) and continuous delivery (CD) to test and build your code and ship it to any target. Continuous Integration (CI) is the practice used by development teams of automating merging and testing code.

What is the difference between pipeline and release pipeline in Azure DevOps?

The Azure DevOps Server provides two different types of pipelines to perform build, deployment, testing and further actions. A Build Pipeline is used to generate Artifacts out of Source Code. A Release Pipeline consumes the Artifacts and conducts follow-up actions within a multi-staging system.


2 Answers

It's not supported defining an array as a variable, the variable syntax is variables: { string: string }. Check the following case:

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

Yaml variables have always been string: string mappings.

We are preparing to release a feature in the near future to allow you to pass more complex structures. Stay tuned!

Currently, you can only use parameters to pass and loop array:

parameters:
- name: 'param'
  type: object
  default: 
  - FOO
  - BAR
  - ZOO

steps:
- ${{ each p in parameters.param }}:
  - script: echo ${{ p }}
like image 67
Cece Dong - MSFT Avatar answered Sep 18 '22 18:09

Cece Dong - MSFT


The way I overcame the limitations on variables arrays was to transform the variable value string into an array in the pipeline. Parameters are not an option as they are exposed to the user at Pipeline run.

in Variables.prod.yaml:

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

in the pipeline:

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.

like image 41
Gopher62 Avatar answered Sep 17 '22 18:09

Gopher62