Azure Pipelines — обработка одинаковых имен переменных в разных группах переменных

Я новичок в Azure Pipelines и пытаюсь обрабатывать одно и то же имя переменной в разных группах переменных. Я не могу быть слишком конкретным из соображений безопасности, но общая суть такова, что у меня есть несколько сред, к которым я обращаюсь через API, и я хотел бы иметь возможность передавать данные любым способом между этими средами. Общий расклад такой:

У меня есть группы переменных с разными именами (на данный момент их 2, но в проде их будет 10-12)

'alpha'
'beta'

которые содержат одни и те же переменные:

'env' # hoping to use as a key from parameters to fetch this data
'url' # api url
'token' # api key

Я хотел бы иметь возможность получать исходную и целевую среду от пользователя, а затем устанавливать переменные внутри канала sourceUrl, sourceEnv и sourceToken — destUrl, destEnv, destToken из этих групп переменных.

Я знаю, что в документации переменным с таким же именем просто присвоено значение последней указанной группы переменных, поэтому мне интересно, нужно ли мне использовать сценарий bash для динамической установки этих переменных. Надеюсь, yaml прояснит это:

trigger: none

parameters:
  - name: sourceEnv
    type: string
    default: alphaDev
    values:
      - alphaDev
      - betaDev
    displayName: 'Source Environment'

  - name: destEnv
    type: string
    default: betaDev
    values:
      - alphaDev
      - betaDev
    displayName: 'Destination Environment'

variables:
  - group: ${{ parameters.sourceEnv }} # i want to set sourceUrl sourceEnv and sourceToken to these values

  - group: ${{ parameters.destEnv }} # i want to set desturl destEnv and destToken to these values

# so essentially the variables would be:
  - name: sourceUrl
    value: ${{ parameters.sourceEnv}}.$(url)

  - name: sourceToken
    value: ${{ parameters.sourceEnv}}.$(token)

# and same for destination 

Я видел, что вы можете напрямую объявлять группы переменных внутри заданий, что я сейчас и делаю с POC.

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

Что касается кода, я подумал, может ли сработать установка переменных сразу после вызова группы?

variables:
  - group: ${{ parameters.sourceEnv }} 
  - name: sourceUrl
    value: $(url)

  - group: ${{ parameters.destEnv }} 
  - name: destUrl
    value: $(url)

но это просто устанавливает для них обоих значение URL-адреса destEnv.

Надеюсь, мои требования ясны, и, возможно, этот вопрос невероятно нов, но, как я уже сказал, я новичок в Azure-конвейерах и надеюсь, что кто-нибудь сможет помочь, скажем, с помощью bash-скрипта, чтобы сделать это возможным, если только нет прямого пути. Я пропустил :)

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по вашему описанию, у вас есть несколько переменных с одинаковым именем в разных группах переменных.

Обратитесь к этому документу: Управление группами переменных

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

В этом случае, если вы укажете две группы переменных непосредственно в корневом узле YAML (на основе вашего примера в вопросе), он будет использовать значение в группе переменных destEnv. Это ожидаемое поведение.

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

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

поэтому мне интересно, нужно ли мне использовать сценарий bash для динамической установки этих переменных.

Да. Это необходимо. Вам необходимо установить группу переменных в двух разных заданиях/этапах и использовать переменные перекрестных заданий/этапов, чтобы сопоставить правильное значение с переменными исходного и конечного окружения. Обратитесь к этому документу: Используйте выходные переменные из задач

Вот пример:

parameters:
  - name: sourceEnv
    type: string
    default: alphaDev
    values:
      - alphaDev
      - betaDev
    displayName: 'Source Environment'

  - name: destEnv
    type: string
    default: betaDev
    values:
      - alphaDev
      - betaDev
    displayName: 'Destination Environment'

jobs:
- job: SourceEnv
  dependsOn:
  variables:
    - group: ${{ parameters.sourceEnv }} 
  steps:
    - bash: |
        echo "##vso[task.setvariable variable=sourceUrl;isOutput=true]${{ parameters.sourceEnv}}.$(url)"
        echo "##vso[task.setvariable variable=sourceToken;isOutput=true]${{ parameters.sourceEnv}}.$(token)"
      name: setvarStep

- job: DestEnv
  dependsOn:
  variables:
    - group: ${{ parameters.destEnv }}
  steps:
    - bash: |
        echo "##vso[task.setvariable variable=destUrl;isOutput=true]${{ parameters.destEnv}}.$(url)"
        echo "##vso[task.setvariable variable=destToken;isOutput=true]${{ parameters.destEnv}}.$(token)"
      name: setvarStep

- job: UseVariables
  dependsOn:
    - SourceEnv
    - DestEnv
  variables:
    sourceUrl: "$[ dependencies.SourceEnv.outputs['setvarStep.sourceUrl'] ]"
    sourceToken: "$[ dependencies.SourceEnv.outputs['setvarStep.sourceToken'] ]"
    destUrl: "$[ dependencies.DestEnv.outputs['setvarStep.destUrl'] ]"
    destToken: "$[ dependencies.DestEnv.outputs['setvarStep.destToken'] ]"
  steps:
    - script: |
        echo $(sourceUrl)
        echo $(sourceToken)
        echo $(destUrl)
        echo $(destToken)

С другой стороны, независимо от того, используем ли мы классический режим или YAML, не рекомендуется определять переменную с одинаковым именем в разных группах переменных. Вы также можете рассмотреть возможность установки имени переменной на основе имени среды в группе переменных.

Спасибо, это действительно полезно. После выхода из системы я также подумывал о том, чтобы сделать то, что вы сказали в конце, и прикрепить имя env к передней части имен переменных внутри групп переменных, что, я думаю, я и сделаю, поскольку это кажется лучшим маршрутом. . Большое спасибо :)

Joseph Thomas 09.08.2024 10:54

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