Настройка Jenkins CI на Mac OS X для сборки Android- и iOS-приложений Phonegap/Cordova и размещения их в TestFlight/HockeyApp

Разработка мобильных приложений в большинстве случаев является весьма увлекательным занятием, особенно если вам самим нравится то, что вы создаете.Работая с приличным количеством внешних проектов (мы разрабатываем приложения и сайты на заказ), а также с растущим числом своих внутренних приложений, мы задумались о минимизации времени и сил затрачиваемых на подготовку тестовых и релизных сборок приложений.При наличии нескольких разработчиков, тестировщиков и приличного числа проектов, затраты на подготовку сборок становятся весьма существенными.Поэтому чтобы не тратить силы зря и заниматься тем, что действительно важно для ваших сервисов, предлагаем инструкцию по созданию системы автоматической сборки приложений.Описанный далее подход мы используем, в первую очередь, в своих приложениях, с которыми предлагаем вам познакомиться: Together, PhotoSuerte, Routes.Tips.

  1. Во-первых, для сборки приложений для iOS вам понадобится компьютер или ноутбук Mac
    • Если вы используете VPS, то для экономии ресурсов желательно отключить на нем Spotlight (Settings > Spotlight > Privacy > + > Add the entire drive)
    • Требования к машине минимальные — 512 МБ ОЗУ; чем быстрее ЦПУ, тем быстрее будет происходить сборка
    • Можно собирать приложения либо на физическом устройстве Mac, либо на виртуальном хостинге (например, Hostmyapple, Gekkoit, Xcloud)
  2. Установить и настроить Jenkins
    • Установить Java Runtime
    • Включить SSH и подключиться к консоли
    • Скачать последнюю версию Jenkins, используя следующую команду консоли:wget -O jenkins-latest.pkg http://mirrors.jenkins-ci.org/osx/latest
    • Установить Jenkins командой:sudo installer -pkg jenkins-latest.pkg -target /
    • В процессе установки создается пользователь jenkins с домашней директорией /Users/Shared/Jenkins
    • Установить, при необходимости, JRE и Apache Ant
    • Перезагрузить Mac и убедиться, что Jenkins работает и слушает порт 8080.
  3. В Jenkins открыть раздел Manage Jenkins/Manage Plugins и установить следующие плагины:
  4. Установить Xcode через App Store, используя Apple ID
  5. Установить Xcode Command Line Tools:
    • Запустить Xcode
    • Войти в меню Xcode/Preferences/Downloads
    • Нажать Скачать справа от Command Line Tools
  6. Установить Homebrew, используя следующие команды консоли:
    • ruby -e «$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)»
    • brew doctor
    • brew update
  7. Установить nodejs и phonegap/cordova, используя следующие команды консоли:
    • brew install nodejs
    • npm -global install phonegap
    • npm -global install cordova
  8. Установить Android SDK, используя следующие команды консоли:
    • Получить отсюда ссылку на скачивание SDK для версии Mac OS X 64-bit;выполнить команды:
    • cd /Users/Shared/Jenkins/build_stuff
    • wget http://dl.google.com/android/adt/adt-bundle-mac-x86_64-20131030.zip
    • unzip adt-bundle-mac-x86_64-20131030.zip
    • ln -s adt-bundle-mac-x86_64-20131030 adt-bundle
    • Таким образом, Android SDK будет установлен в директории /Users/Shared/Jenkins/build_stuff/adt-bundle/sdk
    • Запустить утилиту /Users/Shared/Jenkins/build_stuff/adt-bundle/sdk/tools/android update sdk —no-ui и установить все версии таргетов

Предположим, что собираемое приложение называется BlahApp.

Сборка Android-приложения

  1. Создать в Jenkins задачу BlahApp-Android-build
  2. Взять у разработчиков файлы ant.properties и BlahAppCertificate.keystroke, последний положить в /Users/Shared/Jenkins/build_stuff/keystrokes
  3. Настроить выгрузку кода проекта Git-плагином из репозитория в workspace
    • Чтобы собирать приложение автоматически после пушей в Git, можно использовать любой из способов, описанных на странице Jenkins wiki
  4. Добавить шаг сборки Invoke Ant с параметрами:
    • Targets: release (или как укажут разработчики, прописан в build.xml)
    • Build file: platforms/android/build.xml
    • Properties: эти параметры обычно находятся в файлах local.properties и ant.properties, тут они подставляются, как параметры командной строки при запуске Ant:
      • sdk.dir=/Users/Shared/Jenkins/build_stuff/adt-bundle/sdk
      • key.store=/Users/Shared/Jenkins/build_stuff/keystores/BlahAppCertificate.keystore
      • key.alias=BlahApp
      • key.store.password=********
      • key.alias.password=********
  5. После этого можно проверять сборку и согласовывать с разработчиком различные параметры, версии SDK и прочее, если сборка не отрабатывает
  6. Доставка файлов собранного приложения
    • Архивирование файлов, шаг Post-build action/Archive the artifact с параметрами:
      • Files to archive: platforms/android/bin/*.apk
    • Доставка по FTP, шаг Post-build action/Send build artifacts over FTP с параметрами:
      • Создать предварительно FTP-аккаунт в глобальных настройках Jenkins
      • FTP Server Name: выбрать нужный аккаунт
      • Source files: platforms/android/bin/*.apk
      • Remove prefix: platforms/android/bin/
      • Remote directory: BlahApp/Android/${BUILD_ID}_${BUILD_NUMBER}
    • Доставка по SSH, шаг Post-build action/Send build artifacts over SSH с параметрами:
      • создать предварительно SSH-аккаунт в глобальных настройках Jenkins
      • SSH Server Name: выбрать нужный аккаунт
      • Source files: platforms/android/bin/*.apk
      • Remove prefix: platforms/android/bin/
      • Remote directory: BlahApp/Android/${BUILD_ID}_${BUILD_NUMBER}
  7. Доставка в TestFlight
    • Создать действующий аккаунт в Testflight
    • Получить API token
    • Получить Team token
    • Создать Token Pair из обоих токенов в настройках Jenkins в разделе Test Flight
    • Добавить шаг Post-build action/Upload to Testflight, с параметрами:
      • Token Pair: выбрать созданный выше
      • IPA/APK Files: platforms/android/bin/*.apk
      • dSYM File: оставить пустым
      • Включить параметр: Append changelog to build notes
  8. Доставка по электронной почте, шаг Post-build action/Editable Email Notification с параметрами:
    • Attachments: platforms/android/bin/*.apk
    • Attach Build Log: Compress and Attach Build Log

Сборка iOS приложения

  1. Настроить сертификаты и профили
    • Получить у разработчиков сертификаты для подписи приложения и профиль
    • В утилите Keychain Access создать xcode.keychain и задать пароль для его открытия
    • Сложить в него сертификаты и снять для всех сертификатов ограничения по доступу приложений (см. в вики)
    • В настройках Jenkins в секцию Xcode Builder добавить в список keychain’ов xcode.keychain, указав путь к файлу и пароль
    • Файл профиля положить в директорию /Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles
  2. Создать в Jenkins задачу BlahApp-build-iOS
  3. Настроить выгрузку кода проекта Git-плагином из репозитория в workspace.
  4. 4. Чтобы собирать приложение автоматически после пушей в Git, можно использовать любой из представленных в вики способов:
  5. Для того чтобы скачать вручную субмодули, надо:
    • включить параметр для Git-плагина Disable submodules processing
    • добавить первый шаг сборки Execute shell с кодом «git submodule update —init —recursive»
  6. Добавить шаг сборки Xcode с параметрами:
    • Включить Clean before build
    • Configuration: Release
    • Включить: Pack application and build .ipa
    • Code Signing Identity: имя подписанта, на чье имя выписан сертификат, например: iPhone Distribution: DENIVIP Media OOO (SQ12345678)
    • Embedded Profile: путь к файлу профиля подписанта, например, /Users/Shared/Jenkins/build_stuff/profiles/4FF5AFF9-DD63-4881-9B69-941D166F1C37.mobileprovision
    • Включить Unlock keychain и выбрать файл из п. 1
    • Xcode Schema File: взять у разработчиков
    • Xcode Project Directory: platforms/ios
    • Build Output Directory: built-project
  7. Доставка файлов собранного приложения
    • Архивирование файлов, шаг Post-build action/Archive the artifact с параметрами:
      • Files to archive: built-project/*.ipa,built-project/*.zip
    • Доставка по FTP, шаг Post-build action/Send build artifacts over FTP с параметрами:
      • создать предварительно FTP-аккаунт в глобальных настройках Jenkins
      • FTP Server Name: выбрать нужный аккаунт
      • Source files: built-project/*.ipa
      • Remove prefix: built-project/
      • Remote directory: BlahApp/iOS/${BUILD_ID}_${BUILD_NUMBER}
    • Доставка по SSH, шаг Post-build action/Send build artifacts over SSH с параметрами:
      • создать предварительно SSH-аккаунт в глобальных настройках Jenkins
      • SSH Server Name: выбрать нужный аккаунт
      • Source files: built-project/*.ipa
      • Remove prefix: built-project/
      • Remote directory: BlahApp/iOS/${BUILD_ID}_${BUILD_NUMBER}
    • Доставка в TestFlight
      • Создать действующий аккаунт в Testflight
      • Получить API token
      • Получить Team token
      • Создать Token Pair из обоих токенов в настройках Jenkins в разделе Test Flight
      • Добавить шаг Post-build action/Upload to Testflight, с параметрами:
        • Token Pair: выбрать созданный выше
        • IPA/APK Files: built-project/*.ipa
        • dSYM File: оставить пустым
        • Включить параметр: Append changelog to build notes
      • Token Pair: выбрать созданный выше
      • IPA/APK Files: built-project/*.ipa
      • dSYM File: оставить пустым
      • Включить параметр: Append changelog to build notes
  8. Доставка в HockeyApp
    • Создать действующий аккаунт в HockeyApp
    • Получить API token и Public ID/App ID
    • Добавить шаг Post-build action/Upload to HockeyApp, с параметрами:
    • API Token: выбрать созданный выше
    • Public ID/App ID: выбрать созданный выше
    • App file: built-project/*.ipa
    • Symbols: built-project/*-dsym.zip
  9. Доставка по электронной почте, шаг Post-build action/Editable Email Notification с параметрами:
    • Attachments: built-project/*.ipa
    • Attach Build Log: Compress and Attach Build Log