Настройка непрерывной интеграции в TeamCity для Xamarin.iOS

Значение непрерывной интеграции (Continuous Integration) в разработке программного обеспечения в настоящее время является по-настоящему важным. Существует масса продуктов для применения этого подхода на практике: Hudson/Jenkins, Bamboo и многие другие. По разным, не столь существенным для нижеизложенного, причинам нами был выбран продукт TeamCity на примере которого будет продемонстрирован запуск непрерывной интеграции для мобильных проектов под  Xamarin.iOS.

С некоторыми изменениями и доработками приведенный способ может быть применен и в других системах. TeamCity «из коробки» умеет  поддерживать компиляцию C# проектов под Mono, однако с Monotouch (Xamarin.iOS) не все просто с самого начала — заставить TeamCity собрать мобильное приложение для iPhone можно только из командной строки c помощью mdtool. Такой рецепт можно найти, например, на stackoverflow. Проект нормально собирается в TeamCity, и в некотором смысле непрерывная интеграция настроена. Уже можно отслеживать как изменения в хранилище (в нашем случае Mercurial, хотя здесь это не принципиально) отражаются на успешности сборки проекта. TeamCity сообщает удалось  или не удалось собрать проект.

Основные сложности возникают при настройке автоматизированного тестирования Xamarin.iOS-проекта, когда требуется чтобы после успешной сборки TeamCity запустил набор тестов и проанализировал результат их выполнения. Дело в том, что тесты будут выполняться или в эмуляторе устройства, или непосредственно на устройстве, что и определяет трудности которые необходимо разрешить. На сайте Xamarin предлагают использовать для этого TestFlight, но мы пойдем другим путем.

Необходимые составляющие

  1. Компьютер с OS X на котором установлен: 1.1. Xamarin.iOS со всеми зависимостями. 1.2.  TeamCity Build Agent. 1.3. Mercurial и/или SourceTree
  2. Сервер с установленным  TeamCity и подключенным агентом (см 1.2).
  3. Тестовый проект в хранилище. https://bitbucket.org/apalkoff/nunitliteteamcity

Первый шаг — добавление проекта в TeamCity

A) Создаем новый Build Configuration и добавляем в качестве VCS Root хранилище на Bitbucket — все стандартно.

B) Добавляем к Build Configuration первый Build Step — Command Line.

После этого можно попробовать запустить сборку в TeamCity и удостовериться, что проект собирается.

Второй шаг — подготовка проекта к тестированию

При тестирование проектов с Xamarin.Ios применяется не стандартный NUnit, а модифицированная версия NUnitLite. На сайте Xamarin привидена подробная инструкция по настройке тестирования. Поскольку тесты выполняются прямо на устройстве, то тестовый проект представляет собой специальное приложение, которое запускает необходимые тесты.

Каким же образом можно забрать результаты тестирования из устройства/эмулятора в TeamCity? Ключевой момент состоит в использовании Touch.Server, который умеет обмениваться информацией с программой, запускающей тесты.

Проще всего скопировать хранилище Touch.Server c GitHub’а на локальную машину, сбилдить Touch.Server.exe и добавить его к нашему хранилищу, например, в папочку 3rdparty. В этом случае появится возможность настроить TeamCity на запуск этой программки в качестве одного из Build Step’ов. Подробное описание Touch.Server можно найти в блоге spouliot.

В нашем случае запуск Touch.Server будем осуществлять таким образом:

mono --debug 3rdparty/Touch.Server.exe --launchsim
Tests/bin/iPhoneSimulator/Debug/Tests.app -autoexit -logfile=TestProject.xml

При запуске на локальной машине получим в TestProject.xml вот что:

Это уже неплохой результат из которого можно понимать пройдены тесты или нет. Однако хотелось бы получать результаты тестирования в стандартном xml-формате.

С) Необходимо внести изменения в код

После ребилда повторим запуск Touch.Server.exe:

Теперь совсем все хорошо, кроме двух первых строк, которые портят красивый xml. Не будем обращать на них внимание — их можно будет легко убрать с помощью утилиты sed.

Третий шаг — тестирование в TeamCity

D) Добавляем к Build Configuration второй Build Step, тоже Command Line.

Теперь после билда (в папочке проекта, в файле TestProject.xml) будут находиться результаты тестирования. Осталось только объяснить TeamCity, что надо на них посмотреть.

E) Добавляем к Build Configuration в раздел Build Features XML-обработчик:

Все готово к тому, чтобы увидеть результаты тестирования непосредственно в TeamCity.