#.net-core #azure-devops #azure-pipelines #nunit
#.net-core #azure-devops #azure-конвейеры #nunit
Вопрос:
У меня есть конвейер выпуска в Azure DevOps, одним из шагов является запуск теста, разработанного с использованием Nunit.
YAML задачи:
steps:
- task: DotNetCoreCLI@2
displayName: 'Run Tests'
inputs:
command: custom
projects: '**/a/Tests.dll'
custom: vstest
arguments: '--logger:"trx;LogFileName=test.trx" '
В моих тестах я извлекаю несколько параметров из переменных среды, используя:
private static IConfiguration InitConfiguration()
{
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables()
.Build();
return config;
}
Я также сохраняю значения своих переменных среды в группах переменных Azure DevOps.
Все работает нормально, когда мои переменные не заблокированы, они успешно извлекаются, и тесты выполняются нормально.
Однако, когда я блокирую секретные, их значение становится пустым, поэтому мои тесты не выполняются.
Что я должен изменить, чтобы заблокированные переменные правильно считывались из моего приложения.
Ответ №1:
По умолчанию переменные отображаются в переменные среды, но когда вы их заблокировали, вы фактически делаете их секретными. И чтобы иметь секретные карты в качестве среды, вы должны отобразить их явно. Взгляните на это
variables:
GLOBAL_MYSECRET: $(mySecret) # this will not work because the secret variable needs to be mapped as env
GLOBAL_MY_MAPPED_ENV_VAR: $(nonSecretVariable) # this works because it's not a secret.
steps:
- powershell: |
Write-Host "Using an input-macro works: $(mySecret)"
Write-Host "Using the env var directly does not work: $env:MYSECRET"
Write-Host "Using a global secret var mapped in the pipeline does not work either: $env:GLOBAL_MYSECRET"
Write-Host "Using a global non-secret var mapped in the pipeline works: $env:GLOBAL_MY_MAPPED_ENV_VAR"
Write-Host "Using the mapped env var for this task works and is recommended: $env:MY_MAPPED_ENV_VAR"
env:
MY_MAPPED_ENV_VAR: $(mySecret) # the recommended way to map to an env variable
- bash: |
echo "Using an input-macro works: $(mySecret)"
echo "Using the env var directly does not work: $MYSECRET"
echo "Using a global secret var mapped in the pipeline does not work either: $GLOBAL_MYSECRET"
echo "Using a global non-secret var mapped in the pipeline works: $GLOBAL_MY_MAPPED_ENV_VAR"
echo "Using the mapped env var for this task works and is recommended: $MY_MAPPED_ENV_VAR"
env:
MY_MAPPED_ENV_VAR: $(mySecret) # the recommended way to map to an env variable
Итак, если вы хотите, чтобы секрет был доступен в одной задаче, вам нужно добавить что-то вроде этого:
env:
MY_MAPPED_ENV_VAR: $(mySecret)
И вам нужно сделать это для каждого секрета отдельно.
С классикой то же самое. Вам нужно сопоставить их здесь:
Комментарии:
1. Спасибо за ответ, а как насчет задач, отличных от YAML?
2. Это то же самое. Вам также необходимо сопоставить их. В приведенной выше ссылке есть вкладка, которая относится к классическим конвейерам. Я также редактирую свой ответ.