Настройка Jenkins для сборки iOS-проекта

Статья основана на Continuous integration mixing Jenkins, iOS 9 and XCode 7Автоматическая сборка iOS-приложений на разных версиях Xcode с помощью Jenkins и Continuous Integration для мобильных и веб-проектов.

Руководство подразумевает, что Jenkins уже установлен и у вас есть компьютер с OS X на котором установлен XCode, Java и Git.

  • Включите встроенный SSH-сервер на компьютере с OS X. Для этого перейдите в System settings -> Sharing и поставьте галочку «Remote login»
    Screen Shot 2016-05-22 at 23.58.36
  • Устанавливаем плагины Jenkins: «Credentials Plugin» версии 1.28 (это важно!), «Xcode integration», «JUnit Plugin», «Git plugin», «SSH Slaves plugin».
    На момент написания статьи, между плагинами «Credentials Plugin» версии 2.0 и «SSH Slaves plugin» версии 1.11 есть баг при котором нельзя добавлять агентов Jenkins. Поэтому нужно устанавливать «Credentials Plugin» версии именно 1.28.

    Чтобы установить плагин определенной версии, надо пойти на его страницу в Wiki Jenkins, кликнуть на «archive» и найти там ссылку на нужную версию. Скаченный .hpi файл нужно скопировать в папку `%{jenkins_home}/plugins/` и перезапустить Jenkins.

  • Перезапускаем Jenkins
  • Идем в настройки Jenkins -> «Manage Credentials» и добавляем туда SSH-ключ по которому Jenkins будет подключаться к компьютеру с OS X и XCode. Если ключа еще нет, то сгенерируйте его (на сервере Jenkins):
    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • Добавляем публичный ключ в `~/.ssh/authorized_keys` на компьютере с OS X.
  • С помощью этого ключа подключитесь с сервера Jenkins на OS X вручную и проверьте, что все работает (пароль не спрашивается, нет ошибок и т.д.).
  • Создаем рабочую папку Jenkins на компьютере с OS X, например, у меня это `/Users/imposibrus/sandbox/jenkins-home`
  • Идем в Настройки Jenkins -> Управление средами сборки -> Новый узел, вводим название узла и указываем, что это «Permanent (Dumb) Agent», нажимаем ОК
    Screenshot from 2016-05-22 23-24-03
  • На следующей странице вводим описание (по желанию), указываем путь к рабочей директории Jenkins на компьютере с OS X, которую мы создали ранее. Указываем как минимум одну метку «xcode» (можно несколько, через пробел), мы будем использовать ее позже. В пункте «Использование» выбираем «Only build jobs with label expressions matching this node» («Только для связанных проектов»). В «Способ запуска» выбираем «Launch slave agents on Unix machines via SSH», в Host пишем IP-адрес или домен компьютера с OS X, в Credentials выбираем созданный ранее ключ.
    Screenshot from 2016-05-22 23-24-26
  • Сохраняем. После этого SSH Slaves plugin попробует подключиться к OS X и закачать на него .jar-файл агента (slave.jar). Если что-то пошло не так — смотрите в логи. Например, SSH Slaves plugin не умеет работать с Fish Shell, поэтому надо ставить Bash по-умолчанию.
  • Создаем в Jenkins новый проект свободной конфигурации, назовем его «time-table»
  • В настройка проекта ставим галочку «Ограничить количество узлов, которые могут собирать этот проект» и в поле «Label Expression» пишем метку «xcode» (мы указали ее при создании агента). Это нужно для того, что бы сборка этого проекта производилась только на компьютерах с OS X и XCode, а не запускалось на сервере с Jenkins или других агентах.
    Screenshot from 2016-05-22 23-53-59
    В пункте «Управление исходным кодом» ставим галочку напротив Git и указываем адрес репозитория «https://github.com/imposibrus/time-table.git». Это тестовый проект с одним экраном и парочкой тестов.
    Screenshot from 2016-05-22 23-54-21
  • Добавляем шаг сборки «XCode» и в настройках «General build settings» меняем «Configuration» на «Debug». В «Advanced Xcode build options» ставим «Xcode Schema File» равным «TimeTable», а в «Custom xcodebuild arguments» вводим `test -destination ‘platform=iOS Simulator,name=iPhone 5,OS=9.1’`. Проверьте какую версию iOS поддерживает ваш XCode и замените 9.1 на поддерживаемую, если потребуется.
    Screenshot from 2016-05-22 23-54-41 Screenshot from 2016-05-22 23-55-01
  • Добавляем шаг сборки «Publish JUnit test result report», в «XML файлы с отчетами о тестировании» вводим «test-reports/*.xml».
    Screenshot from 2016-05-22 23-55-13
  • Сохраняем и запускаем сборку. В результате Jenkins должен подключиться к OS X, выполнить сборку, прогнать тесты (запустится эмулятор) и сгенерировать отчет о пройденных тестах.