Установка и использование переменной среды в задачах с несколькими выпусками - PullRequest
0 голосов
/ 08 января 2019

Задача

Как передать значение из конвейера выпуска в тестовую сборку и консольное приложение (.exe)? В этом конкретном случае мне нужно передать персональный токен доступа (PAT), который используется как тестовой сборкой, так и консольным приложением, примерно так:

string token = Environment.GetEnvironmentVariable("appSettings_personalAccessToken");

Я пытался установить переменную окружения в одной конкретной задаче, но я не могу использовать ее в других задачах.

Подробнее

Я настроил конвейер выпуска, который запускает некоторые интеграционные тесты и запускает скрипт powershell, который выполняет консольное приложение:

Release pipeline tasks

Как интеграционные тесты, так и консольное приложение используют токен личного доступа (PAT) для доступа к API-интерфейсу REST Azure DevOps. Я читаю это значение из переменной среды с именем appSettings_personalAccessToken, которая должна быть установлена ​​в конвейере выпуска.

Set token release task

Я пытаюсь установить PAT в первой задаче (задача Powershell - встроенный скрипт), но в других задачах она, кажется, игнорируется, что я делаю неправильно?

Я попытался установить PAT в задаче powershell следующим образом:

Write-Host ##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken

Или вот так:

[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'User')
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'Machine')

Но значение, похоже, игнорируется в других задачах. Что мне здесь не хватает?

РЕДАКТИРОВАТЬ 1

Даже попытка установить жестко запрограммированный PAT в задаче powershell не работает:

Write-Host "##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]MY_TOKEN_VALUE"

Ответы [ 4 ]

0 голосов
/ 09 января 2019

Я опубликую свое решение здесь, надеюсь, оно будет полезно для кого-то еще, кто может иметь такую ​​же проблему. Спасибо @Matt и @Theo за указание в правильном направлении.

Я неправильно понял, как работают переменные выпуска. Я думал, что они будут доступны только на уровне задач, а не для любого приложения или тестовой сборки, выполняемой из конвейера выпуска, поэтому я пытался настроить их с помощью Powershell.

Таким образом, решение очень простое - я удалил задачи powershell, которые пытаются установить переменные окружения, и установил переменную следующим образом:

Release definition variables

0 голосов
/ 08 января 2019

Проблема здесь в том, что Windows не обновляет автоматически переменные среды при создании / изменении или удалении. Это происходит только после перезапуска процесса explorer.exe или если вы установите переменную вручную в
Мой компьютер | Свойства | Расширенный | Переменные среды .

Затем проводник передает сообщение WM_SETTINGCHANGE всем окнам, чтобы проинформировать их об изменении.
Однако даже при выполнении этого вручную процессы, которые уже выполнялись, могут не принять изменения, если они не обрабатывают сообщение об изменении параметра.

Если перезапуск проводника не является проблемой, вы можете попробовать:

[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'User')
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'Machine')
Stop-Process -ProcessName explorer

Процесс explorer.exe должен перезапуститься автоматически. Это контролируется значением реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon AutoRestartShell.

Надеюсь, это поможет.

0 голосов
/ 08 января 2019

Вам не нужно использовать PAT для этого. Используйте $(System.AccessToken). Вы можете предоставить вашей сборке или выпуску доступ к предоставленному системой токену OAuth, а затем обращаться к нему в тех случаях, когда вам нужен токен авторизации.

Обратите внимание, что вам необходимо предоставить доступ к токену OAuth , иначе это не будет работать.

0 голосов
/ 08 января 2019

Когда вы использовали эту команду:

Write-Host ##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken

Вам нужны кавычки вокруг данных:

Write-Host "##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken"

В противном случае PowerShell видит # и комментирует остальную часть строки

...