Под катом вы найдете перевод статьи ознакомительного характера, в которой сравниваются три системы непрерывной интеграции: CircleCI, Travis CI и Jenkins.
Определение и назначение CI
Непрерывная интеграция (CI, Continuous Integration) — это практика разработки программного обеспечения, при которой изменения кода с высокой частотой интегрируются в общий репозиторий и проверяются с помощью автоматической сборки.
Непрерывная интеграция нацелена на ускорение и облегчение процесса выявления проблем, возникающих в процессе разработки программного обеспечения. При регулярной интеграции изменений единовременный объем проверок уменьшается. В результате на отладку тратится меньше времени, которое можно перераспределить на добавление новых функций. Также возможно добавить проверку стиля кода, цикломатической сложности (чем ниже сложность, тем легче тестировать) и другие виды контроля. Это упрощает рецензирование кода (code review), экономит время и улучшает качество кода.
Как это работает
Разработчики проверяют код локально на своих компьютерах.
Затем изменения отправляются в общий репозиторий.
Репозиторий отправляет запрос (webhook) системе CI.
CI-сервер запускает задание (тесты, покрытие, проверку синтаксиса и т. д.).
CI-сервер сохраняет артефакты и выпускает релиз для тестирования.
В случае возникновения ошибок сборки или тестирования CI-сервер оповещает команду.
Команда исправляет проблему.
CircleCI vs Travis CI vs Jenkins
Надеюсь, теперь процесс непрерывной интеграции в общих чертах нам понятен, и мы можем перейти к сравнению нескольких популярных в настоящее время CI-платформ, у каждой из которых есть свои преимущества и недостатки. Давайте начнем с CircleCI.
CircleCI
Функции:
CircleCI — это облачная система, для которой не нужно настраивать отдельный сервер и которую не придется администрировать. Однако существует и локальная версия, которую вы можете развернуть в частном облаке.
Даже для коммерческого использования существует бесплатная версия.
С помощью REST API можно получить доступ к проектам, сборкам и артефактам. Результатом сборки является артефакт или группа артефактов. Артефактом могут быть скомпилированное приложение или исполняемые файлы (например, APK для Android) или метаданные (например, информация об удачно завершившемся тестировании).
CircleCI кэширует сторонние зависимости, что позволяет избежать постоянной установки необходимых окружений.
Существует возможность подключения к контейнеру по SSH. Это может потребоваться, если возникнут какие-то проблемы.
CircleCI — полностью готовое решение, требующее минимальной настройки.
CircleCI совместима с:
Python, Node.js, Ruby, Java, Go и т. д.;
Ubuntu (12.04, 14.04), Mac OS X (платные аккаунты);
бесплатная версия для коммерческого использования;
небольшие и легко читаемые файлы конфигурации в формате YAML;
отсутствие необходимости в выделенном сервере CircleCI.
Недостатки CircleCI:
CircleCI в бесплатной версии поддерживает только Ubuntu 12.04 и 14.04. Для использования MacOS придется заплатить;
несмотря на то что CircleCI может работать с любыми языками программирования, из коробки поддерживаются только Go (Golang), Haskell, Java, PHP, Python, Ruby/Rails, Scala;
при желании подстроить систему под себя в некоторых случаях могут возникнуть проблемы, и тогда для достижения цели понадобится стороннее программное обеспечение.
Также, несмотря на то что у облачных систем есть несомненные преимущества, нужно быть готовым к тому, что в любой момент необходимая вам функция может быть убрана, и вы ничего с этим поделать не сможете.
Build matrix — это инструмент, который дает возможность выполнять тесты, используя разные версии языков и пакетов. Он обладает богатыми возможностями по настройке. Например, при неудачных сборках в некоторых окружениях система может выдать предупреждение, но сборка целиком не будет считаться неудачной (это удобно при использовании dev-версий пакетов).
TOX
Если вы предпочитаете какую-либо другую CI-платформу, то Build Matrix можно создать с помощью Tox.
Tox — это универсальный консольный инструмент по управлению пакетами и их тестированию в virtualenv. Его можно установить с помощью pip install tox или easy_install tox.
Достоинства Travis CI:
build matrix «из коробки»;
быстрый старт;
небольшие и легко читаемые файлы конфигурации в формате YAML;
бесплатная версия для opensource-проектов;
отсутствие необходимости в выделенном сервере.
Недостатки Travis CI:
по сравнению с CircleCI цены выше, нет бесплатной версии для коммерческого использования;
ограниченные возможности по настройке (для некоторых вещей может потребоваться сторонний софт).
Jenkins
Возможности:
Jenkins — это автономное приложение на Java, которое может работать под Windows, Mac OS X и другими unix-подобными операционными системами.
В Update Center можно найти сотни плагинов, поэтому Jenkins интегрируется практически с любым инструментом, относящимся к непрерывной интеграции и непрерывной поставке (continuous delivery).
Возможности Jenkins могут быть практически неограниченно расширены благодаря системе подключения плагинов.
Jenkins Pipeline — это набор плагинов, поддерживающих создание и интеграцию в Jenkins цепочек непрерывной поставки. Pipeline предоставляет расширяемый набор инструментов по моделированию цепочек поставки типа "as code" различной степени сложности с помощью Pipeline DSL.
Позволяет запускать сборки с различными условиями.
Jenkins может работать с Libvirt, Kubernetes, Docker и др.
Используя REST API, можно контролировать количество получаемых данных, получать/обновлять config.xml, удалять задания (job), получать все сборки, получать/обновлять описание задания, выполнять сборку, включать/отключать задания.
Достоинства Jenkins:
цена (он бесплатен);
возможности по настройке;
система плагинов;
полный контроль над системой.
Недостатки Jenkins:
требуется выделенный сервер (или несколько серверов), что влечет за собой дополнительные расходы на сам сервер, DevOps и т. д.;
на настройку необходимо время.
Заключение
Какую систему CI выбрать? Это зависит от ваших потребностей и планируемого способа использования этого инструмента.
CircleCI хорошо подходит для небольших проектов, где основная задача — запустить непрерывную интеграцию как можно быстрее.
Travis CI рекомендуется в первую очередь для open-source проектов, которые необходимо тестировать в различных окружениях.
Jenkins я бы посоветовал для больших проектов, при работе над которыми потребуется серьезная настройка системы (в случае Jenkins выполняется с помощью плагинов). В Jenkins можно изменить практически что угодно, но на это потребуется время. Если вы хотите побыстрее запустить CI-цепочку, Jenkins может не подойти.