функция lower(), похоже, не работает в конвейере Azure DevOps YAML

#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. Хорошо, возможно, имеет смысл опубликовать ваши результаты в качестве ответа, чтобы кто-то другой с аналогичными обстоятельствами повторно использовал ваше исправление.