Azure Pipelines YAML: неожиданное значение 'переменные'

Я использую Azure Pipelines как часть Azure DevOps. Я пытаюсь определить переменные в моем файле шаблона, потому что мне нужно использовать одно и то же значение несколько раз.

Это мое 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:  
    ...

При попытке использовать этот конвейер я получаю сообщение об ошибке:

/stage-template.yml (Строка: 7, Столбец: 1): Неожиданное значение 'переменных'

Почему это не работает? Что я сделал не так?

3 ответа

Вы не можете использовать шаблон, включенный в качестве шаблона этапа, задания или шага (т. е. включенный нижеstages,jobsилиstepsэлемент конвейера). Вы можете использовать толькоvariablesв переменном шаблоне.

Документация, к сожалению, не очень ясна по этому поводу.

Включая шаблон этапа

      # pipeline-using-stage-template.yml

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

Включение шаблона переменной

      # pipeline-using-var-template.yml

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

steps:
- script: echo A step.

Если вы используете шаблон для включения переменных в конвейер, включенный шаблон можно использовать только для определения переменных.

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

У вас не может быть параметров в конвейере, только в 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 ]

если вы хотите использовать переменные в шаблонах, вы должны использовать правильный синтаксис:

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

Это работает для меня:

В вашем родительском yaml:

этапы:

  • stage: stage1

    displayName: 'этап от родителя'

    вакансии:

    • шаблон: template1.yml
      параметры: param1: 'somevalueforparam1'

..... внутри template1:

параметры:

      param1: ''

param2: ''

вакансии:

  • job: job1

    рабочая среда:

    чистый: все

    displayName: 'Установить задание'

    бассейн:

            name: 'yourpool'
    

    переменные:

    • имя: var1

      значение: 'значение1'

Другие вопросы по тегам