Я новичок в 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-скрипта, чтобы сделать это возможным, если только нет прямого пути. Я пропустил :)
Судя по вашему описанию, у вас есть несколько переменных с одинаковым именем в разных группах переменных.
Обратитесь к этому документу: Управление группами переменных
Если несколько групп переменных включают одну и ту же переменную, последняя группа переменных, которая использует переменную в файле, устанавливает значение переменной.
В этом случае, если вы укажете две группы переменных непосредственно в корневом узле 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 к передней части имен переменных внутри групп переменных, что, я думаю, я и сделаю, поскольку это кажется лучшим маршрутом. . Большое спасибо :)