azure-devopsparametersazure-pipelinesazure-pipelines-yaml

Partial override of object type parameter with default values


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.


Solution

  • 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:

    enter image description here