Когда разработка мобильных приложений в компании переходит на промышленный уровень, неизменно встает вопрос об автоматической сборке.
Непрерывная интеграция — это неотъемлемая часть процесса.
Результатом этого процесса являются сборки для тестирования на устройствах компании для ОТА-рассылки клиентам и удаленным тестировщикам.
При публикации под учетной записью вашей компании или под учетной записью клиента вам приходится иметь дело с большим количеством профилей и сертификатов, ключей, свойств и настроек.
Не всегда удобно заменять конкретную клавишу на устройстве.
Поэтому в нашей компании придумали решение, автоматизирующее этот процесс.
В этой статье будет описана автоматизация распространения артефактов на все устройства, используемые для сборки.
Итак, эта статья о том, как реализовать копирование сертификатов и профилей для сборок и свойств iOS, а также ключей для сборок Android на все подчиненные устройства Jenkins в рамках Continuous Integration. Такая автоматизация экономит время и помогает избежать ошибок.
Статья будет интересна разработчикам мобильных приложений и тем, кто администрирует Jenkins.
Идти!
Проблема
Несколько лет назад, когда мы впервые настроили Jenkins (сервер непрерывной интеграции), у нас была только одна машина (Mac Mini), на которой выполнялись все сборки.Со временем Дженкинс переехал на виртуальную машину, а миник превратился в слейв (вспомогательный узел Дженкинса, используемый для сборки проектов).
Проекты iOS можно собирать только на Mac OS, тогда как Android можно собирать везде, поэтому проекты iOS собирались на подчиненном устройстве, а проекты Android — на главном (где установлен сам Jenkins).
Все, что нужно для сборки проектов, было установлено и разложено на двух машинах вручную, и все было ок! О том, как настроить Jenkins, мы говорили в одной из предыдущих статей — «Автоматическая сборка приложений iOS на разных версиях Xcode с использованием Jenkins» .
Количество проектов росло, и мы подключили сначала по одному коллектору для iOS и Android-проектов, а позже и больше.
Для сборки приложений на только что подключенных слейвах у вас должны быть установлены инструменты, SDK, а для каждого проекта — ключи и файлы, которыми подписывается приложение.
Мы решили оптимизировать настройку слейвов Jenkins, а именно автоматически копировать и устанавливать необходимые файлы для подписи приложений iOS и Android.
Начнем с iOS
Есть несколько подчиненных устройств Jenkins для создания проектов iOS. Все слейвы помечены метками, позволяющими определить установленную на них версию Xcode. Для распределения нагрузки все сборки маркируются и могут выполняться на любом подчиненном устройстве с соответствующим Xcode. Для создания приложения iOS вам необходимо иметь:- Xcode
- Сертификат разработчика/дистрибутива + закрытый ключ
- Профиль обеспечения
Чтобы поставить сертификат с ключом на удаленную машину, нужно:
- экспортируйте сертификат с ключом на машину, на которой они установлены
- скопируйте файл .
p12 на удаленный компьютер
- перейдите на удаленный компьютер и откройте файл .
p12, введите пароль для установки сертификата и ключ в связке ключей,
- После установки сертификата и ключа откройте информацию о ключе и во вкладке «Контроль доступа» выберите «Разрешить всем приложениям доступ к этому элементу»
Чтобы установить профили, просто скопируйте их в нужный каталог: ~/Library/MobileDevice/Provisioning\ Profiles/ В этом случае желательно удалить старый профиль, т.к.
при сборке Xcode может использовать старый профиль вместо обновленного.
Обычно, чтобы обновить список профилей, достаточно зайти в настройки Xcode и, выбрав нужную учетную запись, нажать кнопку «Обновить».
Xcode сам заменит старые профили на новые, если они редактировались на портале.
Но делать это на нескольких машинах, по общему мнению, неэффективно и вообще скучно.
Вы можете настроить синхронизацию папок, например, с помощью rsync, и обновлять профили вручную только на одной машине.
Мы выбрали немного другой подход, поскольку доступ к редактированию и созданию сертификатов и профилей имеют несколько человек, и каждый может работать как на виртуальной машине, так и на своей машине: мы создали Git-репозиторий для сертификатов, ключей и профилей.
Осталось сделать немного — после обновления запустить в Git скрипт, который распределит файлы по узлам Jenkins и установит сертификаты и ключи.
Первой мыслью было написать git-хук, но у git-машины нет доступа к узлам Jenkins. Но у Дженкинса оно есть.
А Дженкинс прекрасно выполняет задания, которые запускаются при возникновении push в Git — для этого в проект в Git добавляется веб-хук.
В результате мы сделали:
- репозиторий git, в котором папки профилей и сертификатов содержат *.
mobileprovision и *.
p12.
- задание в Jenkins, которое берет файлы из Git и выполняет скрипт:
#!/bin/bash slaves=( "192.168.2.10" "192.168.2.20" "192.168.2.30" ) for i in "${slaves[@]}" do ssh jenkins@"$i" rm -f "~/Library/MobileDevice/Provisioning\ Profiles/*" scp ${WORKSPACE}/profiles/* "jenkins@$i:/Users/jenkins/Library/MobileDevice/Provisioning\ Profiles/" ssh jenkins@"$i" mkdir -p "~/pp_cc" scp ${WORKSPACE}/certificates/* "jenkins@$i:/Users/jenkins/pp_cc/" ssh jenkins@"$i" 'security unlock-keychain -p jenkins /Users/jenkins/Library/Keychains/login.keychain; cd /Users/jenkins/pp_cc/; for a in *; do security import $a -k /Users/jenkins/Library/Keychains/login.keychain -P xxxXXXxxx -A; done' done
xxxXXXXxxx — пароль для p12. Да, мы используем один и тот же пароль для всех сертификатов, которые помещаем в Git.
И то же волшебство для Android
Ситуация с Android-проектами в целом аналогичная.Только вместо профилей и сертификатов для подписи сборок используются файлы хранилища ключей.
Чтобы использовать файл хранилища ключей, вам необходимо знать пароль и псевдоним.
Для сборок Android-приложений мы используем Gradle и в файле настроек gradle.properties указываем следующую информацию: releaseStoreFile=/home/jenkins/gradle_keys/customer/project_name.keystore
releaseStorePassword=project_pass
releaseKeyAlias=project_alias
releaseKeyPassword=project_pass
В простой ситуации вы можете поместить файл хранилища ключей на компьютер сборки и загрузить его в git .
properties проекта.
Трудности начинаются, когда разработчики и сборщики работают на разных операционных системах: сложно разместить ключи на всех машинах по одному и тому же пути.
Наше решение для сборок Android:
- git-репозиторий для хранилища ключей и свойств
- Сборка Jenkins, выполняющая скрипт:
# slaves cp -r keys keys_for_ubuntu cd keys_for_ubuntu PATHREPL='\/home\/jenkins\/gradle_keys' find .
-name "*\.
properties" | while read line; do sed -i -e 's/'PATH_TO_KEYS'/'"$PATHREPL"'/g' "$line"; done slaves=( "192.168.2.10" "192.168.2.20" "192.168.2.30" ) for i in "${slaves[@]}" do
-
Тринадцать Вещей, Которые Предвидел Лем
19 Oct, 24 -
Осторожно: Ваш Iphone Тоже Празднует
19 Oct, 24 -
Комментарии В Блогах Разрушают Интернет.
19 Oct, 24 -
Хабр Трафик
19 Oct, 24