Чтение заблокированных переменных Azure DevOps из приложения .Net Core

#.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.

Все работает нормально, когда мои переменные не заблокированы, они успешно извлекаются, и тесты выполняются нормально.

Переменные Azure DevOps Однако, когда я блокирую секретные, их значение становится пустым, поэтому мои тесты не выполняются.

Переменные 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. Это то же самое. Вам также необходимо сопоставить их. В приведенной выше ссылке есть вкладка, которая относится к классическим конвейерам. Я также редактирую свой ответ.