Наверняка все слышали шумиху вокруг проекта travis-ci.org. Я не являюсь исключением и учитывая, что один из его разработчиков, Джош Калдеримис (Josh Kalderimis), выступивший на прошедшей конференции toster.ru, разжег мой интерес еще больше, то я решил окончательно разобраться, что такое travis-ci и с чем его едят. После прочтения вы узнаете как данный сервис может помочь ruby-разработчикам, а также как ему могут помочь они. Располагайтесь поудобнее, начнем...
Непрерывная интеграция
Как оказалось, термин «continuous integration» достаточно старый. Он был введен Мартином Фаулером (Martin Fowler) в 2000-ом году и изложен в статье «Continuous Integration» и по-русски звучит как «непрерывная интеграция». Это часть процесса разработки, в которой разрабатываемый проект собирается/тестируется в различных средах выполнения автоматически и непрерывно. Задумывалась данная методика для наиболее быстрого выявления ошибок/противоречий интеграции проекта, а соотвественно снижения расходов на последующие простои.
Принцип достаточно прост: на отдельной машине работает некая служба, в обязанности которой входит получение исходного кода проекта, его сборка, тестирование, логирование, а также возможность предоставить для анализа данные выполнения перечисленных операций.
Конечно же, бесплатный сыр бывает только в мышеловке и за удобство необходимо платить: выделить отдельный сервер и поддерживать его в рабочем состоянии, обеспечить наличие необходимых программных комплексов, настроить среды выполнения, делать резервные копии данных и т.д. Все это требует немало времени и ресурсов. И вполне логичным кажется возможность делегировать эту ответсвенность на сторонние сервисы. Вот как раз таким и является travis-ci — «хостинг непрерывной интеграции для open source сообщества». Пришло время посмотреть на него поближе.
Техническая сторона
Travis-ci поддерживает множество языков программирования среди которых есть и ruby (что неудивительно, т.к. изначально он разрабатывался для ruby-проектов). Начать пользоваться сервисом очень просто. Нужно всего лишь предпринять несколько шагов, которые подробно описаны в собственном гайде проекта. Я лишь опишу процесс в целом.
Подключаемся
Travis-ci работает с сервисом github.com, поэтому первым делом необходимо выложить туда исходный код своего проекта. За исключением мелких технических настроек (вроде установки хуков в репозитории), весь процесс сводится к описанию различных опций в файле travis.yml. В нем нужно описать на каком языке работает проект, какие версии языка необходимо использовать (можно сразу все), среды окружения (здесь приведен пример такого файла для ruby). Данный файл необходимо разместить в корне github-репозитория.
Если настройка прошла успешно, то travis-ci начинает непрерывно тестировать проект, отображая при этом текущий статус: красный цвет (возникли проблемы при тестировании), желтый (есть предупреждения) и зеленый (все тесты пройдены успешно). Помимо статуса можно увидеть: сообщение об ошибке или предупреждение, если что-то пошло не так; последний коммит и его автора; историю сборок и т.д. В целом интерфейс достаточно информативен и понятен. Помимо этого, travis-ci будет оповещать о проблемах по электронной почте.
Особенности работы сервиса
- В момент, когда файл travis.yml попадает в корень github-репозитория, работа начинается только тогда, когда освободится любой один обработчик (worker) для языка проекта.
- Тестированию подвергаются все активные бранчи проекта, в которых присутствует файл travis.yml.
- Состояние программной среды между сборками не сохраняется. Это значит, что если в процессе тестирования была изменена база данных, созданы какие-либо файлы и т.д., то в последующих сборках эти результаты будут недоступны. Каждая новая сборка начинается с чистого листа.
- Чтобы не наделать ошибок в файле travis.yml существует утилита travis-lint. Она может проверить:
- Нет ли несоответствий формату YAML
- Ключ language указан
- Поддерживает ли travis-ci указанные среды выполнения
- В файле не используются устаревшие функции
- Для максимальной эффективности применяется т.н. матрица сборок. Это означает, что при указании нескольких сред выполнения, переменных окружения и т.д. в одном файле, будет автоматически выстраиваться цепочка всех возможных комбинаций, которые будут использоваться для сборок. Для рассмотренного ниже примера будут выполнены четыре сборки:
#travis.yml
rvm:
- 1.9.3
- rbx-18mode
env:
- FOO=foo BAR=bar
- FOO=bar BAR=foo
Интересные факты
- «Travis» в названии сервиса означает имя мультяшного персонажа — трактора Трэвиса, из детского телешоу «Bob The Builder».
- Чтобы промотивировать общественность помочь проекту в финансовом плане, авторы создали сайт love.travis-ci.org, где можно пожертвовать некоторую сумму на поддержку и в зависимости от размера суммы, авторы в ответ презентуют различные сувениры: стикеры, кружки и прочее. Интересно также, что на этом же сайте описаны некоторые планы на будущее, в том числе и по монетизации.
Заключение
Travis-ci волей — не волей, вызывает к себе интерес. Учитывая еще тот факт, что в данный момент на нем хостятся довольно крупные и известные проекты, спрос на такие услуги есть. Сервис только набирает обороты и хочется пожелать ему обрести большое сообщество пользователей.
Ссылки
- Сайт сервиса
- Документация по сервису
- Профиль на github.com
- Твиттер Джоша Калдеримиса
- Твиттер Свена Фукса
- Статья Мартина Фаулера «Continuous Integration»
Автор: rezwyi