Как установить и прочитать переменную пользовательской среды в Azure DevOps Pipeline?
У меня есть некоторый код автоматизации тестирования, который считывает некоторые значения из переменной среды, хранящейся на моем локальном компьютере, например:
Environment.GetEnvironmentVariable("SAUCE_USERNAME", EnvironmentVariableTarget.User);
Я пытаюсь использовать Azure Pipelines для создания этой переменной во время выполнения конвейера, а затем прочитать ее в моем коде автоматизации тестирования. Использование файла YAML.
Я читаю эту переменную на этапе тестирования VS конвейера Azure. Поэтому, если я установлю переменную, она должна быть действительна для конвейера Azure.
Я попытался использовать документацию здесь, но безуспешно.
Попробовал и этот код ниже, но он не работает с этой ошибкой:
azure-pipelines.yml (строка: 39, столбец: 1, Idx: 1252) - (строка: 39, столбец: 1, Idx: 1252): при сканировании простого ключа не удалось найти ожидаемое ":".
# Create a secret variable
- powershell: |
Write-Host '##vso[task.setvariable variable=sauce.userName;issecret=true]abc'
# Attempt to output the value in various ways
- powershell: |
# Using an input-macro:
Write-Host "This works: $(sauce.userName)"
# Using the env var directly:
Write-Host "This does not work: $env:SAUCE_USERNAME"
# Using the mapped env var:
Write-Host "This works: $env:SAUCE_USERNAME"
env:
SAUCE_USERNAME: $(sauce.userName)
6 ответов
Могут быть и другие способы сделать это, но вот как я смог это сделать:
- Создайте переменные в своем конвейере Azure DevOps и предоставьте этим переменным значения.
- Создайте скрипт Powershell, который вы будете запускать в начале для установки переменных Env. Вот как выглядит мой Шикарный.
- Запустите этот Posh в начале как отдельный шаг в вашем конвейере CI, и это установит переменные среды для виртуальной машины, которая используется для запуска вашего конвейера.
Это еще одна подробная статья, которая может помочь вам в этом.
Я попытался использовать оба следующих синтаксиса, как было предложено в ответах выше, но переменная среды всегда была пустой при попытке использовать ее в задачах ниже по конвейеру (например, во время сборки или во время выполнения тестов).
[Environment]::SetEnvironmentVariable("SAUCE_USERNAME", "$(sauceUserName)", "User")
variables:
sauceUserName: '$(sauceUserName)'
Для меня сработало использование синтаксиса для записи переменных Azure DevOps во встроенной задаче сценария PowerShell:
- task: PowerShell@2
displayName: Add the username as an environment variable so the tests can find it.
inputs:
targetType: 'inline'
script: |
Write-Host "Making the sauceUsername available as an environment variable."
Write-Host "##vso[task.setvariable variable=SAUCE_USERNAME;]$(sauceUserName)"
Затем моя задача сборки смогла найти переменную среды, и я также мог получить к ней доступ в задачах сценария PowerShell ниже по конвейеру с помощью кода вроде:
- task: PowerShell@2
displayName: Display the environment variable value for debugging purposes.
inputs:
targetType: 'inline'
script: |
[string] $username= $Env:SAUCE_USERNAME
Write-Host "The SAUCE_USERNAME environment variable value is '$username'."
Установите переменные конвейера, а затем попробуйте это отображение в вашем файле yaml:
# ASP.NET Core (.NET Framework)
# Build and test ASP.NET Core projects targeting the full .NET Framework.
# Add steps that publish symbols, save build artifacts, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core
pool:
vmImage: 'VS2017-Win2016'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
yourEnvVar: '$(yourPipelineVariable)'
yourOtherEnvVar: '$(yourOtherPipelineVariable)'
Как определено здесь , секретные переменные должны быть установлены явно в разделе переменной env шага/задачи.
Мы часами боролись с этим, думая, что это из-за невозможности установить переменные среды, но в конце концов это не имело к этому никакого отношения.
Вот некоторые из наших заметок о попытке понять это для Azure DevOps:
- Переменные конвейера — это переменные среды, которые вводятся в конвейер на первом этапе процесса. Вы можете убедиться в этом, посмотрев журналы для
Initialize job
задача, в которой перечислены все переменные среды. - Чтобы доказать, что переменные конвейера находятся в системе, вы можете добавить задачу powershell и встроить:
Write-Host "Pipeline Variable: $(FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD)"
Write-Host "Environment Variable: $Env:FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD"
- The
()
вокруг переменной конвейера имеют решающее значение , если вы хотите где-то использовать переменную конвейера, например$(myVar)
Не связанный с вопросом пользователей, но, возможно, полезный для тех, кто пытается загрузить в AppStore с помощью двухфакторной аутентификации (2FA). Это документация , которой мы следовали:
- Мы должны были установить
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD
а такжеFASTLANE_SESSION
чтобы заставить его обойти 2FA. Мы думаем, что первый сеанс позволил нам войти в AppStoreConnect, но для загрузки использовался специальный пароль приложения. Журналы намекают на то, что происходит, хотя вы никогда не видите используемую переменную сеанса.
Для передачи переменных, определенных вне YAML, важно, чтобы вы НЕ определяли переменную в YAML, поскольку переменная в YAML будет иметь приоритет над внешней.
Как только переменная определена, на нее можно ссылаться во встроенном скрипте powershell, используя синтаксис $(имя переменной), однако имя переменной должно быть написано с заглавной буквы .
согласно подсказке devops: чтобы использовать переменную в скрипте, используйте синтаксис переменной среды. Заменять . и пробел с _, сделайте буквы заглавными , а затем используйте синтаксис вашей платформы для ссылки на переменную среды.
Если вам нужно отобразить его с помощью переменной среды (например, секреты), то это правильный синтаксис:
script: |
write-host "env $env:myvariable"
env:
#not sure if case matters here
myvariable: $(myvariable)
полный пример:
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
#log the mapped variable, case doesn't matter
write-host "env $env:myvariable"
#directly access pipeline variable, CASE MATTERS!
write-host "pipeline $(MYVARIABLE)"
#show all environment variables
get-childitem env:
env:
#not sure if case matters here
myvariable: $(myvariable)