Есть ли способ параметризовать / динамически устанавливать имена групп переменных в Azure DevOps Pipelines YAML? - PullRequest
2 голосов
/ 11 февраля 2020

У меня есть вложенный Azure конвейер YAML DevOps:

---
name: Some Release Pipeline

trigger: none

variables:
  - group: "DEV VARIABLE GROUP" # This is the environment variable library

stages:
  - stage: Stage1
    displayName: "Stage 1"
    dependsOn: []
    jobs:
      - template: /pipelines/pipeline_templates/sometemplate.yml

Я хотел бы повторно использовать этот конвейер выпуска для любой среды. В идеале я бы установил переменную конвейера "имя-группы", а затем назначил ее группе. Примерно так:

---
name: Some Release Pipeline

trigger: none

variables:
 - group: "$(group-name)" # This is the environment variable library

stages:
 - stage: Stage1
    displayName: "Stage 1"
    dependsOn: []
    jobs:
      - template: /pipelines/pipeline_templates/sometemplate.yml

Однако, похоже, это не работает. В отчаянии я пробовал разные подходы:

  • Использование ${{ group-name }}
  • Я пытался передать имя группы в качестве параметра, используя:
    jobs:
      - template: /pipelines/pipeline_templates/sometemplate.yml
        parameters:
          variablegroup: $(group-name)

и затем установите его в sometemplate.yml в задании. Например:

jobs:
  - job: Job1
    variables:
      - group: ${{ parameters.variablegroup }}

Однако это тоже не сработало.

  • Я пытался использовать вставка ({{ insert }}), как предлагалось здесь . Однако либо я не знаю, как правильно использовать вставку, либо это не работает, либо я всегда сталкивался с какой-либо формой ошибок проверки.

Согласно это и это , и это , и это это не представляется возможным.

Мне интересно, нашел ли кто-нибудь решение этой проблемы (кроме того, что делает действительно грязный обходной путь вызова DevOps REST API)?

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Ваша интуиция передачи имени группы в качестве параметра в шаблон верна. Я смог заставить это работать:

Файл шаблона, передаваемый-variable-groups.yml

parameters:
- name: deploymentVariableLibraries
  type: object
  default:
    dev: ''
    qa: ''
    prod: ''

jobs:
- job: TestDev
  variables:
    - group: ${{parameters.deploymentVariableLibraries.dev}}
  steps:
    - script: echo "$(whichEnvironment)"
- job: TestQa
  variables:
    - group: ${{parameters.deploymentVariableLibraries.qa}}
  steps:
    - script: echo "$(whichEnvironment)"
- job: TestProd
  variables:
    - group: ${{parameters.deploymentVariableLibraries.prod}}
  steps:
    - script: echo "$(whichEnvironment)"

Pipeline

trigger: none

resources:
  repositories:
    - repository: templates
      type: git
      name: c4ePipelineExamples-Templates

jobs:
- template: passing-variable-groups.yml@templates
  parameters:
    deploymentVariableLibraries:
      dev: 'test-dev'
      qa: 'test-qa'
      prod: 'test-prod'

Мой вывод из каждого задания - DEV, QA, PROD соответственно (значение whichEnvironment в каждой библиотеке тестовых переменных).

0 голосов
/ 11 февраля 2020

Вы пытались вставить переменные , отображающие как параметр .

Параметры не ограничиваются скалярными строками. Пока место, где расширяется параметр, ожидает сопоставления, параметр может быть сопоставлением. Аналогично, последовательности могут передаваться там, где ожидаются последовательности.

# sometemplate.yml
parameters:
  variables: {}

jobs:
- job: build
  variables: ${{ parameters.variables }}
# somepipeline.yml
name: Some Release Pipeline

trigger: none

stages:
 - stage: Stage1
    displayName: "Stage 1"
    dependsOn: []
    jobs:
      - template: sometemplate.yml
        parameters:
          variables: 
            group: "DEV VARIABLE GROUP"

Я использовал параметры для внедрения наборов задач, как до / после действий, для других задач в шаблоне, но у меня нет не использовал это, чтобы внедрить отображение. Я бы подумал, что область, в которой эта конкретная реализация может застрять, заключается в необходимости использовать name/value синтаксис . Я полагаю, что если вы передаете групповое сопоставление в задание, все, что определяет переменные, должно использовать расширенный синтаксис.

Если вы используете как переменные, так и группы переменных, вам придется использовать Синтаксис имя / значение для отдельных (не сгруппированных) переменных:

Кроме того, вам может потребоваться соблюдать осторожность при использовании среды выполнения $() против «compile» или время расширения ${{ }} синтаксис. При работе с переменными вы, возможно, захотите использовать ссылки на время расширения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...