Search code examples
azure-devopsyamlcontinuous-integrationazure-pipelinesazure-pipelines-yaml

Azure DevOps Template Job name by parameters with dependency


The release pipeline don't use the parameter given to the template and use the default empty string value

Error Message:

An error occurred while loading the YAML build pipeline. Unexpected symbol: '.'. Located at position 34 within expression: and(succeeded(), ne(dependencies..outputs['diff.no_diff'], 'true')).

# templates/microservice-release.yaml
parameters:
  - name: microservice
    default: ''
  - name: name
    default: ''
jobs:
- job: ${{ parameters.name }}
  displayName: Check for Changes
  pool:
    name: MyPool
  steps:
  - checkout: self
    clean: true
  - bash: |
      if git diff --quiet HEAD~ HEAD ${{ parameters.microservice }}; then
        echo "##[section]No changes Found in ${{ parameters.microservice }}"
        echo "##vso[task.setvariable variable=no_diff;isOutput=true]true"
      else
        echo "##[section]There are changes. Build is required."
      fi
    name: diff
      
- job:
  dependsOn:
  - ${{ parameters.name }}
  condition: and(succeeded(), ne(dependencies.${{ parameters.name }}.outputs['diff.no_diff'], 'true'))
  displayName: ${{ parameters.microservice }}
trigger:
- Mybranch

jobs:
    - template: templates/microservice-release.yaml
      parameters:
       name: microservice1
       microservice: 'microservice1'

    - template: templates/microservice-release.yaml
      parameters:
       name: microservice2
       microservice: 'microservice2'

Solution

  • The error could happen when you have no name value defined in your main.yaml.

    Please double check the name value.

    enter image description here

    I used your main.yaml, and template.yaml, fixed the checkout step in template(remove clean but add fetchDepth as need to diff with HAED~, i delete the pool as i used Microsoft-hosted agent pool).

      - checkout: self
        #clean: true
        fetchDepth: 2
    

    It works as expected. Eg: only update on microservice2, it can detect the change:

    enter image description here

    Here is the yaml, you can copy and paste to your side for a check.

    main.yaml:

    trigger: none
    
    jobs:
        - template: templates/microservice-release.yaml
          parameters:
            name: microservice1
            microservice: 'microservice1'
            
        - template: templates/microservice-release.yaml
          parameters:
            name: microservice2
            microservice: 'microservice2'
    

    template.yaml:

    # templates/microservice-release.yaml
    parameters:
      - name: microservice
        default: ''
      - name: name
        default: ''
    jobs:
    - job: ${{ parameters.name }}
      displayName: Check for Changes
      steps:
      - checkout: self
        #clean: true
        fetchDepth: 2
    
      - bash: |
          if git diff --quiet HEAD~ HEAD ${{ parameters.microservice }}; then
            echo "##[section]No changes Found in ${{ parameters.microservice }}"
            echo "##vso[task.setvariable variable=no_diff;isOutput=true]true"
          else
            echo "##[section]There are changes. Build is required."
          fi
        name: diff
          
    - job: 
      dependsOn:
      - ${{ parameters.name }}
      condition: and(succeeded(), ne(dependencies.${{ parameters.name }}.outputs['diff.no_diff'], 'true'))
      displayName: ${{ parameters.microservice }}
      steps:
      - script: echo test
    

    enter image description here