Безопасно подписываем Android сборки из Jenkins

Перевод https://www.detroitlabs.com/blog/2017/05/24/securely-signing-jenkins-android-builds/


68mqglrxar4xqrcywcl78yras5s.png


Безопасная подпись Android сборок в Jenkins CI (Continuous Integration, далее просто CI) это общая проблема. Мы попробовали несколько вариантов за всё время разработки и каждый из них выглядел немного грязновато… кроме одного.


Сначала, небольшое вступление: CI это очень значимый инструмент для команды разработки. Когда он используется правильно и часто, он может значительно уменьшить время тратящееся на отладку и разрешение конфликтов. Проблемы видны всей команде и могут быть быстро решены, результаты сборки помогают определить корень проблемы, а тестирование помогает предотвратить появление регрессионных ошибок. CI также автоматизирует доставку ваших сборок, так что тестировщики или клиенты мгновенно получают последние результаты работы.


Итак, наши варианты:


Включить подписывающий сертификат для сборки, непосредственно в сам репозиторий: Плохо!


Только если вы не используете закрытый репозиторий, вы на самом деле открываете свой сертификат всему миру. Даже если вы используете закрытый репозиторий, вы размещаете сертификат на машине каждого разработчика, что сильно увеличивает шансы что сертификат утечёт.


Загрузить подписывающий сертификат в файловую систему Jenkins и ссылаться на него из Gradle: Неплохо…


Это неплохо потому что это позволяет нам использовать минимальное количество мест и может быть защищено теми же средствами, что регулируют доступ к Jenkins. Один нюанс, это то что вы всё ещё должны будете сохранять свой пароль и имя ключа где-то в файловой системе. Поиск способа сделать это безопасно может быть сложным. Данное решение также может оказаться не самым простым в использовании, если у вас есть несколько проектов и несколько сборок и каждой из них нужен сертификат.


Использование плагина для подписи Android приложений (Android Signing Plugin): Отлично!


Это замечательное, чистое решение для хранения и подписи приложений на вашем Jenkins. Плагин использует стандартное хранилище Jenkins для работы с вашими сертификатами. Что ограничивает число разработчиков которым нужно знать пароли, помогает безопасно хранить сертификаты, и позволяет всем сборкам легко получать доступ к сертификату.


Как настроить и использовать Jenkins Android Signing Plugin:


Первое, что вам нужно это убедиться что в вашем Jenkins установлен Credentials Plugin.
Это легко можно проверить взглянув на левую панель в вашем Jenkins. Если вы видите «Credentials» секцию, как показано ниже, то он установлен.
Если у вас нет секции «Credentials», вам нужно не забыть установить Credentials Plugin, это можно сделать одновременно с установкой Android Signing Plugin.


Установка плагина происходит в несколько не сложных шагов:


  1. Выбирете «Manage Jenkins» секцию как показано ниже.
    bjr4bicy_9brw38scnec2mof43m.png


  2. Выберете «Manage Plugins.»
    kl2yryxs3grtx_vlp2skpkztm_g.png


  3. Вы должны будете увидеть доступные обновления для текущих плагинов. В верху экрана выберете вкладку «Available».
    gcfgql3vuhxmq6xh3hyym_5dsai.png


  4. Теперь вы можете использовать поиск в правом верхнем углу для того, чтобы найти «Credentials Plugin» (Если он не установлен) и «Android Signing Plugin». Поставьте галочки на левой стороне для каждого плагина, затем нажмите «Download now and install after restart» внизу экрана.
    rdpgybhbawnksulh9uobnt7aopq.png


Отлично!
Теперь, когда всё установлено, вы можете добавить как минимум один сертификат для подписи приложений. Детальные инструкции по использованию «Credentials Plugin» не являются темой этой статьи, но могут быть легко найдены в интернете. Вам нужно добавить один новый сертификат, как показано ниже.
g8-kym6i4ucb4gik6vrvec7yumo.png


Как видно, плагин поддерживает только PKCS12 сертификаты. К сожалению, последняя версия Android Studio выдаёт JKS сертификаты, которые оказываются несовместимы с плагином.
Хорошо, что мы имеем удобную утилиту для командной строки «keytool», которая может превратить наш «JKS» в «PKCS12».


keytool -importkeystore -srckeystore {REPLACE_WITH_JKS_FILE} -srcstoretype JKS -deststoretype PKCS12 -destkeystore ConvertedCertificate.p12


Как только у вас будет «PKCS12» файл, вы можете загрузить его. Убедитесь, что ввели пароль, до того как загрузили сертификат, иначе Jenkins не сможет загрузить файл. Теперь вы готовы использовать этот сертификат для любых Android сборок.


Единственно требование к исходному коду, это то что вам нужно оставить «signingConfig» пустым для «buildType», который будет использоваться при сборке Jenkins’ом. Тогда будет создаваться неподписанный APK, который может быть подписан плагином. Имейте в виду, стандартный debug билд подписывается автоматически сгенерированным сертификатом.


Теперь всё готово для подписи приложений, вам нужно добавить шаг «Sign Android APKs» в вашу сборку. Ниже простой пример, сначала мы запускаем Gradle команду для сборки неподписанного релизного билда. После этого, на следующем шаге мы можем подписать билд. Вы должны выбрать сертификат, который вы хотели бы использовать из хранилища сертификатов, указать алиас ключа и путь к неподписанному APK.
pplprp99y9vzobi7jeav3u1vdp0.png


Это всё! У вас теперь есть подписанный билд, готовый к распространению сразу же после сборки.


К слову у Google есть своё хранилище сертификатов, которое частично решает проблему с безопасным хранением ключа.

© Habrahabr.ru