#variables #azure-devops #yaml #azure-pipelines
#переменные #azure-devops #yaml #azure-конвейеры
Вопрос:
Мы работаем над преобразованием наших классических конвейеров Azure в конвейеры YAML. Одна вещь, которая не ясна, — это как гарантировать, что две разные группы переменных с переменными с одинаковым именем, но разным значением, не наступают друг на друга.
Например, если у меня есть группы переменных vg1
, и vg2
у каждой переменной есть имя secretDataDestination
, как мне убедиться, что secretDataDestination
в конвейере YAML используется правильное?
Более тревожный пример: если у нас изначально есть две группы переменных без перекрывающихся имен переменных, как мы можем гарантировать, что добавление нового перекрывающегося имени переменной в группу не заменит использование переменной, как предполагалось изначально?
Комментарии:
1. Вы читали документацию ? «Вы можете ссылаться на несколько групп переменных в одном конвейере. Если несколько групп переменных включают одну и ту же переменную, значение переменной будет установлено группой переменных, включенной последней в ваш файл YAML. »
Ответ №1:
Обходным путем является использование выходных переменных в Azure DevOps с помощью небольшого встроенного кода задачи PowerShell.
Сначала создайте 2 задания. Каждое задание со своей собственной группой переменных, в данном случае Staging
и Prod
. Обе группы содержат переменные apimServiceName
и apimPrefix
. Добавьте переменные в качестве выходных данных задания, повторив их следующим isOutput=true
образом:
- job: StagingVars
dependsOn:
variables:
- group: "Staging"
steps:
- powershell: >-
echo "##vso[task.setvariable variable=apimServiceName;isOutput=true]$(apimServiceName)"
echo "##vso[task.setvariable variable=apimPrefix;isOutput=true]$(apimPrefix)"
name: setvarStep
- job: ProdVars
dependsOn:
variables:
- group: "Prod"
steps:
- powershell: >-
echo "##vso[task.setvariable variable=apimServiceName;isOutput=true]$(apimServiceName)"
echo "##vso[task.setvariable variable=apimPrefix;isOutput=true]$(apimPrefix)"
name: setvarStep
Затем используйте переменные в новом задании, где вы указываете новое имя переменной и переходите к выходным данным задания, чтобы получить значение. это работает, поскольку каждая группа переменных помещается в свое задание, поэтому они не будут перезаписывать какую-либо переменную:
- job:
dependsOn:
- StagingVars
- ProdVars
variables:
ServiceNameSource: "$[ dependencies.StagingVars.outputs['setvarStep.apimServiceName'] ]"
UrlprefixSource: "$[ dependencies.StagingVars.outputs['setvarStep.apimPrefix'] ]"
ServiceNameDestination: "$[ dependencies.ProdVars.outputs['setvarStep.apimServiceName'] ]"
UrlprefixDestination: "$[ dependencies.ProdVars.outputs['setvarStep.apimPrefix'] ]"
Ответ №2:
если у меня есть группы переменных vg1 и vg2, каждая с переменной с именем secretDataDestination, как мне убедиться, что в конвейере YAML используется правильное secretDataDestination?
Независимо от того, используем ли мы классический режим или YAML, не рекомендуется определять переменную с одинаковым именем в разных группах переменных. Поскольку, когда вы ссылаетесь на разные группы переменных, содержащие одно и то же имя переменной в одном конвейере, вы не можете избежать наложения друг на друга.
Когда вы используете одно и то же имя переменной в разных группах переменных в одном конвейере, как и сказал Мэтт,
«Вы можете ссылаться на несколько групп переменных в одном конвейере. Если несколько групп переменных включают одну и ту же переменную, значение переменной будет установлено группой переменных, включенной последней в ваш файл YAML. «
variables:
- group: variable-group1
- group: variable-group2
Это означает, что значение переменной в группе переменных, записанное позже, перезапишет значение переменной в группе переменных, записанной первой
Я думаю, вы уже знаете это, поэтому вы отправляете свой второй вопрос. Теперь давайте перейдем ко второму вопросу.
если у нас изначально есть две группы переменных без перекрывающихся имен переменных, как мы можем гарантировать, что добавление нового перекрывающегося имени переменной в группу не заменит использование переменной, как предполагалось изначально?
Действительно, Azure devops в настоящее время не имеет такой функции или механизма, чтобы разумно определять, имеют ли разные группы переменных одно и то же имя переменной, и выдавать запрос.
Я думаю, что это разумный запрос, я добавляю ваш запрос на эту функцию на наш сайт UserVoice, который является нашим основным форумом для предложений продуктов:
Возможность обнаружения одной и той же переменной в группе переменных
В качестве обходного пути самый простой и прямой способ — открыть переменную группу ссылки вашего конвейера на вкладке Библиотека и напрямую ctrl
F
для поиска существования той же переменной.
Другой способ — использовать REST API Variablegroups — получить группы переменных по идентификатору, чтобы получить все переменные, затем цикл сравнивает с переменной, которую мы собираемся ввести, существует ли та же переменная.
Комментарии:
1. Это полезно. В настоящее время у нас нет проблем с перекрытием. Однако по мере разработки новых конвейеров высока вероятность того, что нам придется что-то предпринять, чтобы предотвратить это.
2. На ум только что пришел потенциально проблемный сценарий. Перекрывающиеся имена переменных могут быть вектором угрозы. Разработчик, имеющий возможность редактировать группы переменных, мог бы, например, добавить перекрывающееся «secretDataDestination» для извлечения данных. Нашим аудиторам такая возможность не очень понравится.
3. Ваше предложение по использованию REST API variablegroups может быть тем, что нам нужно. Безусловно, было бы полезно, если бы эта функциональность могла быть встроена и доступна в качестве проверки времени выполнения конвейера. 🙂
4. @GaTechThomas, да, встроенная функциональность будет отличной! Я отправляю этот запрос команде разработчиков developercommunity.visualstudio.com/idea/1229514 /… , вы можете проголосовать за него и добавить свой комментарий.
5. Смотрите Мой ответ для простой альтернативы, я полностью не согласен с тем, чтобы не использовать одни и те же переменные в разных группах переменных. Эти группы существуют в основном для различения сред, где имена ваших переменных должны оставаться неизменными, но значение будет отличаться. В некоторых случаях вам требуется более 1 группы одновременно, это должно поддерживаться таким образом, чтобы вы могли импортировать группу переменных с возможностью префикса для всех переменных, чтобы вы могли различать.