Под катом вы найдете перевод статьи ознакомительного характера, в которой сравниваются три системы непрерывной интеграции: 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 (платные аккаунты);
- Github, Bitbucket;
- AWS, Azure, Heroku, Docker, выделенный сервер;
- Jira, HipChat, Slack.
Достоинства CircleCI:
- легкое и быстрое начало работы;
- бесплатная версия для коммерческого использования;
- небольшие и легко читаемые файлы конфигурации в формате YAML;
- отсутствие необходимости в выделенном сервере CircleCI.
Недостатки CircleCI:
- CircleCI в бесплатной версии поддерживает только Ubuntu 12.04 и 14.04. Для использования MacOS придется заплатить;
- несмотря на то что CircleCI может работать с любыми языками программирования, из коробки поддерживаются только Go (Golang), Haskell, Java, PHP, Python, Ruby/Rails, Scala;
- при желании подстроить систему под себя в некоторых случаях могут возникнуть проблемы, и тогда для достижения цели понадобится стороннее программное обеспечение.
Также, несмотря на то что у облачных систем есть несомненные преимущества, нужно быть готовым к тому, что в любой момент необходимая вам функция может быть убрана, и вы ничего с этим поделать не сможете.
Travis CI
Travis CI и CircleCI очень похожи
Обе системы:
- используют файлы конфигурации в формате YAML;
- развернуты в облаке;
- поддерживают Docker для запуска тестов.
Что есть в TravisCI и нет в CircleCI?
- Запуск тестов одновременно под Linux и Mac OS X.
- Поддержка большего количества языков «из коробки»:
Android, C, C#, C++, Clojure, Crystal, D, Dart, Erlang, Elixir, F#, Go, Groovy, Haskell, Haxe, Java, JavaScript (with Node.js), Julia, Objective-C, Perl, Perl6, PHP, Python, R, Ruby, Rust, Scala, Smalltalk, Visual Basic. - Поддержка build matrix.
Build matrix
language: python
python:
- "2.7"
- "3.4"
- "3.5"
env:
- DJANGO='django>=1.8,<1.9'
- DJANGO='django>=1.9,<1.10'
- DJANGO='django>=1.10,<1.11'
- DJANGO='https://github.com/django/django/archive/master.tar.gz'
matrix:
allow_failures:
- env: DJANGO='https://github.com/django/django/archive/master.tar.gz'
Build matrix — это инструмент, который дает возможность выполнять тесты, используя разные версии языков и пакетов. Он обладает богатыми возможностями по настройке. Например, при неудачных сборках в некоторых окружениях система может выдать предупреждение, но сборка целиком не будет считаться неудачной (это удобно при использовании dev-версий пакетов).
TOX
Если вы предпочитаете какую-либо другую CI-платформу, то Build Matrix можно создать с помощью Tox.
[tox]
envlist = py{27,34,35}-django{18,19,110,master}
[testenv]
deps =
py{27,34,35}: -rrequirements/test.txt
django18: Django>=1.8,<1.9
django19: Django>=1.9,<1.10
django110: Django>=1.10,<1.11
djangomaster: https://github.com/django/django/archive/master.tar.gz
commands = ./runtests.py
[testenv:py27-djangomaster]
ignore_outcome = True
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 могут быть практически неограниченно расширены благодаря системе подключения плагинов.
- Предусмотрены различные режимы: Freestyle project, Pipeline, External Job, Multi-configuration project, Folder, GitHub Organization, Multibranch Pipeline.
- 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 может не подойти.
Ссылки:
Комментарии (20)
iborzenkov
18.07.2017 11:24Похоже недостатки дженкинса так притянули, что уши оторвали :)
SirEdvin
18.07.2017 11:28Из реального: на настройку необходимо время.
Gitlab CI более дружелюбный, например, но в том же время, позволяет немного меньше.
ahanoff
18.07.2017 12:09В дженкинсе меня лично жутко раздражает UI. Пробовал Blue Ocean, выглядит неплохо, но постоянные переходы на старый UI там, где недоделано, портит все впечатление.
blimKololei
18.07.2017 22:09С приходом Pipeline DSL и модой на мессенджеры, куда вся нотификация и результаты билдов приходят — UI уже не так критичен
ALexhha
18.07.2017 23:30В минусах у Jenkins значится — необходимо время на настройку. А что, первые 2е СI не требуют настройки? Проект чудесным образом сам будет собираться. Или что имелось ввиду?
bano-notit
19.07.2017 07:08+1Имелось в виду, что в дженкинсе нужно будет потратить больше времени на настройку, чем в других системах. Если говорить проще, тот уже его модульность стала минусом, ибо настраивать модульность реально дольше, чем просто использовать определённые "заготовки" в чём-нибудь монолитном.
ALexhha
19.07.2017 22:58Ну не знаю. По-моему очень спорно и субъективно. Сейчас в Jenkins в основном DSL используется для описания джоб. Если имеется ввиду сама настройка Jenkins как такового, то это единоразовая операция, да и что там собственно настраивать то, разве что всякие матрицы проектов и права.
rikozi
19.07.2017 08:08А как же GitLab CI + Docker? И если брать хорошо настроенное тестирование (я использую встроенный в Laravel phpunit + вариативную настройку сред, то CI становится простым и рутинным делом
alexkuzko
Странно что не рассмотрели Gitlab CI. В некоторых вещах он даже интереснее будет.
farcaller
или Concourse — со встроенными и очень толковыми пайплайнами.
SirEdvin
Там довольно проблемно собрать docker образ не через docker, если не ошибаюсь.
farcaller
это как именно?
SirEdvin
С использованием rocker или box, например.
farcaller
А разве нельзя форкнуть docker-image-resource и где-то тут вызвать что надо? Concourse как раз удобен тем что ресурсы изолированы и соединяются через четко определенные вводы и выводы.
SirEdvin
Я называю это — довольно проблематично. В gitlab ci, например, это делается несколько проще)
farcaller
Возможно вы правы (с gitlab ci конкретно у меня опыта вообще нет).
В плане concourse — он замечательно вписывается в infrastructure-as-code, благо все настраивается в одном конфиг файле (как, например, у travis). В отличие от Jenkins (хотя там, насколько я знаю, есть подвижки в эту сторону).
sutarmin
И Teamcity тоже
koldoon
или Teamcity — тоже неплохая система «из коробки»