Draex_
Draex_

Reputation: 3474

Azure Pipelines YAML: Unexpected value 'variables'

I'm using Azure Pipelines as a part of Azure DevOps. I'm trying to define variables in my template file, because I need to use the same value multiple times.

This is my stage-template.yml:

parameters:
 - name: param1
   type: string
 - name: param2
   type: string

variables:
  var1: path/${{ parameters.param2 }}/to-my-file.yml

stages:
 - stage: Deploy${{ parameters.param2 }}
   displayName: Deploy ${{ parameters.param1 }}
   jobs:  
    ...

When trying to use this pipeline, I get an error message:

/stage-template.yml (Line: 7, Col: 1): Unexpected value 'variables'

Why is this not working? What did I do wrong?

Upvotes: 51

Views: 50938

Answers (3)

riQQ
riQQ

Reputation: 12693

You can't have variables in a template that is included as a stage, job or step template (i.e. included below a stages, jobs or steps element in a pipeline). You can only use variables in a variable template.

The documentation sadly is not really clear about that.

Including a stage template

# pipeline-using-stage-template.yml

stages:
- stage: stage1
[...]
# stage template reference, no 'variables' element allowed in stage-template.yml
- template: stage-template.yml 

Including a variable template

# pipeline-using-var-template.yml

variables:
# variable template reference, only variables allowed inside the template
- template: variables.yml

steps:
- script: echo A step.

If you are using a template to include variables in a pipeline, the included template can only be used to define variables.

https://learn.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=azure-devops#variable-reuse

Upvotes: 33

Appy
Appy

Reputation: 51

This works for me:

In your parent yaml:

stages:
- stage: stage1
  displayName: 'stage from parent'
  jobs:
  - template: template1.yml  
    parameters:
        param1: 'somevalueforparam1'

inside template1:

parameters:  
    param1: ''  
    param2: ''    
jobs:
- job: job1  
  workspace:    
    clean: all  
    displayName: 'Install job'  
   pool:    
      name: 'yourpool'  
  variables:
   - name: var1     
     value: 'value1'

Upvotes: 1

4c74356b41
4c74356b41

Reputation: 72151

you cant have parameters in the pipeline, only in the templateReferences:

name: string  # build numbering format
resources:
  pipelines: [ pipelineResource ]
  containers: [ containerResource ]
  repositories: [ repositoryResource ]
variables: # several syntaxes, see specific section
trigger: trigger
pr: pr
stages: [ stage | templateReference ]

if you want to use variables in templates you have to use proper syntax:

parameters:
 - name: param1
   type: string
 - name: param2
   type: string

stages:
- stage: Deploy${{ parameters.param2 }}
  displayName: Deploy ${{ parameters.param1 }}
  variables:
    var1: path/${{ parameters.param2 }}/to-my-file.yml
  jobs:  
  ...

Upvotes: 3

Related Questions