#azure-devops #azure-pipelines-yaml
#azure-devops #azure-pipelines-yaml
Вопрос:
Я пытаюсь использовать функцию lower() в шаблоне YAML, но не понимаю поведения. У меня есть группа переменных с именем Infra.Environment.Короткое имя со значением «Dev». В моем шаблоне YAML я определил переменную из группы переменных:
variables:
- name: environmentShortName
value: $(Infra.Environment.ShortName)
В задаче я ссылаюсь на эту переменную:
- task: AzureResourceGroupDeployment@2
displayName: 'Deploy Storage Account'
inputs:
azureSubscription: ${{ parameters.subscription }}
resourceGroupName: mst-${{ lower(variables.environmentShortName) }}-infra
location: '$(Infra.Environment.Region.Primary)'
csmFile: '$(Pipeline.Workspace)/$(Build.DefinitionName)/Resources/infra-storageAccount.json'
csmParametersFile: '$(Pipeline.Workspace)/$(Build.DefinitionName)/Resources/infra-storageAccount.parameters.json'
deploymentOutputs: ArmOutputs
Я экспериментировал с различными выражениями, но не понимаю, почему я не могу преобразовать значение переменной group в нижний регистр:
resourceGroupName: mst-${{ lower(variables.environmentShortName) }}-infra
=> mst-Dev-infra (нижний, похоже, не работает)
resourceGroupName: ${{ format('mst-{0}-infra', lower(variables.environmentShortName)) }}
=> mst-Dev-infra (формат работает, но lower — нет)
resourceGroupName: $[format('mst-{0}-infra', lower(variables.environmentShortName))]
=> $[format(‘mst-{0}-infra’, lower(переменные.environmentShortName))] (выражение не вычислено)
resourceGroupName: mst-${{ lower(variables['Infra.Environment.ShortName']) }}-infra
=> mst—infra (пустое значение)
resourceGroupName: mst-${{ lower('Dev') }}-infra
=> mst-dev-infra (lower работает с постоянным значением)
Ответ №1:
Решением было использовать переменные среды выполнения, поскольку группа переменных не разрешена во время компиляции. Выражения времени выполнения имеют некоторые ограничения, но работает следующее:
- name: environmentShortName
value: $[lower(variables['Infra.Environment.ShortName'])]
resourceGroupName: mst-$(environmentShortName)-infra
Ответ №2:
Следующий фрагмент будет работать правильно и напишет «mst-test-infra» в качестве выходных данных:
variables:
environmentShortName: TEST
steps:
- powershell: Write-Host "${{ format('mst-{0}-infra', lower(variables.environmentShortName)) }}"
Это связано с тем, что переменной присвоено буквальное значение, а значение известно во время компиляции.
Если значение environmentShortName зависит от другой переменной, например:
environmentShortName: $(System.TeamProject)
Функция lower() не будет работать корректно и ведет себя так, как вы описали.
Существует (мое) логическое объяснение: выражение ${{ variables.environmentShortName}}
разрешается во время компиляции, и, возможно, значение вашей переменной еще не готово к разрешению.
Чтобы справиться с таким поведением, рассмотрите возможность изменения местоположения, где lower()
применяется, и переместите его в часть объявления переменной:
variables:
environmentShortName: ${{ lower(variables['System.TeamProject'] ) }}
steps:
- powershell: Write-Host "mst-$(environmentShortName)-infra"
Комментарии:
1. Спасибо, Александр, в моем случае не работает, поскольку переменная поступает из группы переменных и не является предопределенной переменной. Но ваши предложения помогли мне найти решение.
2. Хорошо, возможно, имеет смысл опубликовать ваши результаты в качестве ответа, чтобы кто-то другой с аналогичными обстоятельствами повторно использовал ваше исправление.