In ADO, I want to partially override object type parameter using templates.
For example:
main.yml
parameters:
- name: person
type: object
default:
first_name: "Jane"
last_name: "Doe"
role: "Student"
- template: templates/template.yml
parameters:
person: ${{parameters.person}}
template.yml
parameters:
- name: person
type: object
Here, I want to send object parameter, person, only with role: “Teacher” like this, and in template.yml, person object’s first_name is “Jane” and last_name is “Doe”, but role will be “Teacher”. Is this possible?
project.yml
extends:
template: template/main/main.yml
parameters:
person:
role: "Teacher"
I tried the code above, but in template-yml, it could not parse first_name or last_name.
1
You cannot partially override an object parameter in the pipelines via passing part of the elements directly.
As a workaround, you can replace the role
with your target value when pass the parameter to your template.
The main.yml
:
trigger: none
pool:
vmImage: ubuntu-latest
parameters:
- name: person
type: object
default:
first_name: "Jane"
last_name: "Doe"
role: "Student"
steps:
- script: |
echo "${PERSON}"
env:
PERSON: ${{ convertToJson(parameters.person) }}
- template: templates/template.yml
parameters:
person_update:
${{each pair in parameters.person}}:
${{if and( eq(pair.key, 'role'), eq(pair.value, 'student' )) }}:
${{pair.key}}: 'Teacher'
${{else}}:
${{pair.key}}: ${{pair.value}}
The template.yml
:
parameters:
- name: person_update
type: object
default: {}
steps:
- script: |
echo "${PERSON}"
env:
PERSON: ${{ convertToJson(parameters.person_update) }}
Result:
This should achieve the same result
- template: templates/template.yml
parameters:
person:
first_name: ${{ parameters.person.first_name }}
last_name: ${{ parameters.person.last_name} }
role: "Teacher"
3
TL;DR you cannot partially override properties of an object
parameter in Azure YAML pipelines.
But you can use coalesce function to provide default values for properties that are not set.
Example
templates/template.yml
parameters:
- name: person
type: object
steps:
- script: |
echo "First name: ${{ coalesce(parameters.person.first_name, 'Jane') }}"
displayName: 'Display first name'
- script: |
echo "Last name: ${{ coalesce(parameters.person.last_name, 'Doe') }}"
displayName: 'Display last name'
- script: |
echo "Role: ${{ coalesce(parameters.person.role, 'Student') }}"
displayName: 'Display role'
my-pipeline.yml
trigger: none
pool:
vmImage: ubuntu-latest
parameters:
- name: person
type: object
default:
first_name: "Jane"
last_name: "Doe"
role: "Student"
steps:
- checkout: none
- template: templates/template.yml
parameters:
person: ${{ parameters.person }}
- template: templates/template.yml
parameters:
person:
role: "Teacher"
- template: templates/template.yml
parameters:
person:
first_name: "John"
last_name: "Smith"