Переменная Access Secure из модульного теста на конвейере maure Azure - PullRequest
2 голосов
/ 23 октября 2019

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

String key = System.getenv().get("MY_KEY");
String secret = System.getenv().get("MY_SECRET");

Я добавил 2 значения для переменных конвейера из браузера и пометил их как «Сохранить это значение в секрете», чтобы значения были сохранены в качестве секретного.

enter image description here

В конвейер я добавил обязательные переменные и заменил значение настроенными переменными.

variables:
  MY_KEY: $(MY_KEY_VAL)
  MY_SECRET: $(MY_SECRET_VAL)

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

Как это исправить? Я что-то не так делаю в конфигурациях?

ОБНОВЛЕНИЕ

Как упоминал Бен ниже, невозможно установить переменную среды на размещенных агентах. Чтобы запустить все модульные тесты во время конвейера сборки и при этом сохранить ключ и секрет в безопасности, я изменил модульные тесты, чтобы прочитать ключ и секрет из файла в корневом каталоге проекта. Вместо того, чтобы добавить файл, содержащий ключ и секрет, в git repo, он был добавлен как защищенный файл в библиотеку конвейера и получил разрешение на доступ по конвейеру.

В конвейере я смог загрузить защищенный файл, используяЗадача «DownloadSecureFile».

- task: DownloadSecureFile@1
  displayName: Download API secrets
  name: configfile
  inputs:
    secureFile: 'service_api_keys'

Переместил файл в корневой каталог проекта с помощью bash.

- bash: mv $(configfile.secureFilePath) ./

Запустить процесс сборки, который будет читать секреты при выполнении модульного теста.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

System.getenv () читает системные переменные окружения компьютера, на котором выполняется код Java. И переменные, определенные в конвейере, находятся в области действия агента, а не в области компьютера. Возможно, именно поэтому модульный тест не может получить переменные.

Вероятно, прямого пути для этого не существует. Как упоминал Бен Смит, вы можете выполнить рефакторинг своего кода, чтобы получить ключ / секрет из файлов json и добавить задачу Set Json Property для обновления файлов json переменными, которые вы определили в конвейере, перед тем, как задача maven запустит модульный тест. Проверьте здесь для подробного использования этой задачи.

В качестве другого обходного пути, вы можете запустить свой конвейер на собственном агенте Linux и попытаться добавить задачу сценария bash для настройки среды. переменные для вашего агента linux (я протестировал и обнаружил, что заданные переменные окружения не работают для совместно используемого агента). Проверьте здесь , как установить переменную окружения для linux.

Проверьте здесь , чтобы получить инструкции по созданию автономного агента linux.

Надеюсь, вынайдете выше, полезно!

1 голос
/ 23 октября 2019

Вам необходимо подставить значения в ваши файлы Java. Подстановка переменных, описанная выше, например,

variables:
  MY_KEY: $(MY_KEY_VAL)
  MY_SECRET: $(MY_SECRET_VAL)

, заменит только значения в вашем конвейерном YAML-файле.

Вы можете заменить свои переменные в файлах Java, используя " ЗаменитьТокены"задача, например,

- task: replacetokens@3
    inputs:
      targetFiles: "yourJavaFile.java"
      encoding: "auto"
      writeBOM: true
      verbosity: "detailed"
      actionOnMissing: "warn"
      keepToken: false
      tokenPrefix: "#{"
      tokenSuffix: "}#"
    displayName: Perform variable substitution in java file

И в вашем Java-файле вы должны записать переменные, которые должны быть заменены, например,

String key = System.getenv().get("#{MY_KEY}#");
String secret = System.getenv().get("#{MY_SECRET}#");
...