Статья основана на 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»
- Устанавливаем плагины 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», нажимаем ОК
- На следующей странице вводим описание (по желанию), указываем путь к рабочей директории 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 выбираем созданный ранее ключ.
- Сохраняем. После этого SSH Slaves plugin попробует подключиться к OS X и закачать на него .jar-файл агента (slave.jar). Если что-то пошло не так — смотрите в логи. Например, SSH Slaves plugin не умеет работать с Fish Shell, поэтому надо ставить Bash по-умолчанию.
- Создаем в Jenkins новый проект свободной конфигурации, назовем его «time-table»
- В настройка проекта ставим галочку «Ограничить количество узлов, которые могут собирать этот проект» и в поле «Label Expression» пишем метку «xcode» (мы указали ее при создании агента). Это нужно для того, что бы сборка этого проекта производилась только на компьютерах с OS X и XCode, а не запускалось на сервере с Jenkins или других агентах.
В пункте «Управление исходным кодом» ставим галочку напротив Git и указываем адрес репозитория «https://github.com/imposibrus/time-table.git». Это тестовый проект с одним экраном и парочкой тестов.
- Добавляем шаг сборки «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 на поддерживаемую, если потребуется.
- Добавляем шаг сборки «Publish JUnit test result report», в «XML файлы с отчетами о тестировании» вводим «test-reports/*.xml».
- Сохраняем и запускаем сборку. В результате Jenkins должен подключиться к OS X, выполнить сборку, прогнать тесты (запустится эмулятор) и сгенерировать отчет о пройденных тестах.