Android build release apk на jenkins, без сохранения моего пароля в текстовом виде

Мне нужно создать версию моего apk, используя работу Jenkins.

Из чтения следующего SO-запроса

Как создать подписанный файл apk с версией Gradle?

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

Ни один из них не будет работать при запуске задания сборки на jenkins. 1) Я не могу получить пользовательский ввод, потому что это может быть запущено посреди ночи (я даже не знаю, как получить пользовательский ввод из линии cmd, даже если пользователь был на их машине). 2) Любой, кто может получить доступ к этой сборке, сможет котировать содержимое этого файла либо через строку cmd, либо из другого задания build.gradle, запущенного на этом сервере jenkins.

Знает ли кто-нибудь, что я могу сохранить мой пароль скрытым, но чтобы работа Дженкинса могла получить к нему доступ?

Спасибо

Ответ 1

Вы можете использовать Mask Password Plugin, который делает именно это. Или же такая же функциональность включена в плагин EnvInject, и рано или поздно все проекты Jenkins получат потребность в плагине EnvInject (что делает много других вещей), поэтому теперь можно начать использовать его.

Безопасное использование пароля на этапе сборки/пост-сборки

  • Установите плагин EnvInject.
  • В Глобальная конфигурация Jenkins найдите раздел Глобальные пароли.
  • Добавьте имя (это будет имя переменной среды) и пароль (будет помечен звездочкой ****).
  • В разделе Конфигурация заданий найдите раздел Сборкa > .
  • Checkmark Ввести пароли в сборку как переменные среды.
  • Затем установите флажок Глобальные пароли.

В любом шаге сборки вы можете теперь использовать $name (как определено ранее), чтобы ссылаться на пароль так же, как если бы вы ввели его в виде обычного текста.

  • Переменная пароля вводится только во время выполнения задания (ввод $name в командной строке сервера сам по себе ничего не даст и, как и все переменные Дженкинса, не является постоянным).
  • Журнал консоли задач покажет **** вместо пароля, если он появится.
  • Вы можете настроить пароли на одно задание, а не глобально, чтобы другие задания не могли его использовать.

Единственная проблема безопасности заключается в том, что если у кого-то есть административные разрешения для настройки вашей работы, они могут написать echo $name > secretpassword.txt на этапе сборки, а затем просмотреть файл в рабочей области. Но вы должны быть осторожны с тем, кому вы назначаете административные права.

Ответ 3

Если ваш экземпляр Jenkins работает на EC2, и вы не хотите постоянно хранить секреты в файловой системе, вы можете поместить пароли хранилища и ключа в Хранилище параметров System Manager, затем запросите их во время сборки. Кроме того, вы можете поместить хранилище ключей в внешнее хранилище, например S3, и сохранять его только локально на время сборки.

Вот пример сборки script (предположим, что секретные параметры называются android-keystore-pass и android-signature-key-pass):

set -o errexit
set -o pipefail

keystore_file=keystore.properties
keystore=wise.jks

aws s3 cp s3://path-to-android/$keystore .

chmod go-rwx $keystore

touch $keystore_file
chmod go-rwx $keystore_file

cat > $keystore_file << EOF
storePassword=`aws ssm get-parameters --names android-keystore-pass --with-decryption | cut -f4`
keyPassword=`aws ssm get-parameters --names android-signature-key-pass --with-decryption | cut -f4`
keyAlias=android
storeFile=$WORKSPACE/$keystore
EOF

Пример сценария сборки Gradle можно найти в этом ответе. Вы можете передать фиктивный элемент keystore.properties в исходный элемент управления, чтобы (не-выпускные) сборки работали на машинах dev.

Существуют также инструменты секретного распространения с открытым исходным кодом, которые не зависят от платформы, например. Vault, но я не пробовал никого из них.