In ADO, I want to partially override object type parameter using templates.
For example:
parameters:
- name: person
type: object
default:
first_name: "Jane"
last_name: "Doe"
role: "Student"
- template: templates/template.yml
parameters:
person: ${{parameters.person}}
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?
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.
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: