Непрерывная интеграция (continuous integration) — практика разработки, позволяющая добиться большей уверенности в стабильности и корректности работы любого проекта. Проекты с открытым кодом — не исключение.
Примерно два месяца назад, в апреле 2013 года комапания Sauce labs объявила о поддержке iOS / Mac для CI-сервера Travis. Сам сервис существует уже довольно давно, и пользуется довольно большой популярностью в open-source community благодаря поддержке большого количества языков и удобству использования. Cервис бесплатен для любого пользователя github и открытых репозиториев. На Хабре уже имеется пост о сервисе и его настройки для тестирования Ruby-проектов, поэтому в этой статье я хотел бы рассказать о более специфической стороне сервиса — настройке автоматической сборке билдов iOS проектов на Travis-CI. Основным фокусом этой статьи будет связка CocoaPods + Cedar + Travis CI, однако я постараюсь рассказать немного и о других связанных с темой вещах.
Итак, начнем.
Имеем проект на github, который не имеет никакого отношения к данной статье, однако хочет иметь отношение к Travis CI. На проекте используются CocoaPods, все тесты написаны с помощью фреймворка Cedar.
Шаг первый. Подключение github-репозитория
Заходим на сайт сервиса, логинимся с помощью github аккаунта. Заходим в настройки профиля, и включаем репозиторий, на котором мы хотим гонять билды и тесты.
Шаг второй. Настройка конфигурационного файла
Большая часть настройки осуществляется в файле .travis.yml, который необходимо положить в корневую папку вашего репозитория. В процессе может пригодиться travis-lint, руби гем, позволяющий валидировать этот файл на корректность.
Первым делом необходимо задать язык программирования, для которого будет осуществляться билд.
language: objective-c
Следующий шаг — настройка всех необходимых гемов, и зависимостей для проекта. Имеются следующие шаги работы воркера Travis:
- before_install
- before_script
- script
- after_success / after_failure
- after_script
Успешность любой из этих команд(кроме after_success/after_failure и after/acript) определяется возвращаемым значением. Стандартный линуксовый код 0 означает, что билд прошел успешно. Все остальное считается фейлом. Для настройки необходимых зависимостей используем шаг before_install.
В частности, для запуска тестов на симуляторе мы будем использовать гем ios_sim. Удобно, что Travis имеет предустановленный Homebrew, так что установка гема имеет следующий вид
before_install:
- brew install ios_sim
Забежим немного вперед. Недостаточно просто запустить билд на симуляторе, важно еще и получить результаты Cedar — тестов. В этом нам поможет гем ios_ci, позволяющий сбилдить проект, запустить его на симуляторе, и получить результаты тестирования. Ставим гем:
- gem install ios_ci
Следующий шаг настройки опционален, и связан с конкретной структурой папок выбранного проекта. Файл проекта XCode находится не в корневой директории репозитория, а в директории Example. Поэтому изменяем текущую директорию на директорию с проектом:
- cd Example
Последним шагом настройки должна была быть установка CocoaPods, однако Travis делает это автоматически, если находит в директории Podfile, так что настройка завершена, можно переходить к сборке.
Шаг третий. Билд проекта и запуск тестов
Переходим к скрипту, который будет непосредственно гонять наши тесты. Нужно понимать, что это не обязательно должен быть седаровский скрипт, или команда make. На самом деле, единственное требование, которое Travis CI выдвигает к шагу script — он должен вернуть значение. 0 — успех, все остальное — фейл. Соответственно можно собирать проект так, как вам это необходимо, и можно использовать любой тестовый фреймворк, включая встроенный OCUnit.
Одним из требований гема ios_ci является то, что для корректной работы ему нужно передать корневую директорию проекта с исходниками. Для этой цели мы будем использовать одну из переменных окружения Travis — $TRAVIS_BUILD_DIR, в которой содержится корневая папка репозитория (все доступные переменные окружения можно посмотреть здесь).
Команда для сборки проекта и прогона тестов будет выглядеть достаточно лаконично
script:
ios_ci cedar --source-root $TRAVIS_BUILD_DIR/Example --workspace DTTableViewManager.xcworkspace --scheme CedarUnitTests --build-path Build/Products
Таким образом, полный файл .travis.yml будет выглядеть следующим образом:
language: objective-c
before_install:
- gem install ios_ci
- brew install ios-sim
- cd Example
script: ios_ci cedar --source-root $TRAVIS_BUILD_DIR/Example --workspace DTTableViewManager.xcworkspace --scheme CedarUnitTests --build-path Build/Products
Шаг четвертый. Профит
Все, что осталось сделать, это сделать коммит в одну из веток, и запушить изменения на github. Travis-CI автоматически запланирует билд, и через минуту-две начнет собирать проект. Если все пройдет успешно — статус станет зеленым, если нет — красным. Одновременно на почту отправится сообщение об успешности или неудаче сборки.
Дополнительные плюшки Travis-CI
1. Возможность выбрать ветки репозитория, для которых будет запускаться билд.
branches:
only:
- master
- develop
Таким образом, Travis будет собирать билды только для коммитов, сделанных в эти две ветки. Аналогичным образом можно добавлять ветки в черный список:
branches:
except:
- legacy
- experimental
2. Возможность автоматического запуска билдов для пулл реквестов. Более того, статус билда будет отображаться прямо в пулл реквесте на страничке github.
3. Бейджик!
Бейджик представляет из себя ничто иное, как ссылку следующего вида
https://travis-ci.org/[YOUR_GITHUB_USERNAME]/[YOUR_PROJECT_NAME].png?branch=master,staging,production
Данная статья показывает лишь необходимый минимум для настройки билдов на Travis-CI. Возможности данного сервиса намного больше, например известный фреймворк RestKit использует Travis не только для сборки билдов и тестов, но также и для генерации документации с помощью appledoc.
Спасибо за внимание, и удачных open-source проектов!
Ссылки
1. Не имеющий отношения к данной статье, но хороший фреймворк
2. Travis-CI
3. Хабростатья про Ruby — тестирование на Travis-CI
4. Документация по сервису Travis-CI
5. CI — гем для тестирования iOS приложений
6. Travis-lint
Автор: DenHeadless