company_banner

Непрерывная интеграция: CircleCI vs Travis CI vs Jenkins

Original author: Alexander Shaporda
  • Translation


Под катом вы найдете перевод статьи ознакомительного характера, в которой сравниваются три системы непрерывной интеграции: 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 может не подойти.


Ссылки:


  1. Оригинал: Continuous Integration. CircleCI vs Travis CI vs Jenkins.
Southbridge
Обеспечиваем стабильную работу highload-проектов

Comments 21

    +1
    Странно что не рассмотрели Gitlab CI. В некоторых вещах он даже интереснее будет.
      0

      или Concourse — со встроенными и очень толковыми пайплайнами.

        0
        или Concourse — со встроенными и очень толковыми пайплайнами.

        Там довольно проблемно собрать docker образ не через docker, если не ошибаюсь.

          0
          собрать docker образ не через docker

          это как именно?

            0

            С использованием rocker или box, например.

              0

              А разве нельзя форкнуть docker-image-resource и где-то тут вызвать что надо? Concourse как раз удобен тем что ресурсы изолированы и соединяются через четко определенные вводы и выводы.

                0

                Я называю это — довольно проблематично. В gitlab ci, например, это делается несколько проще)

                  0

                  Возможно вы правы (с gitlab ci конкретно у меня опыта вообще нет).


                  В плане concourse — он замечательно вписывается в infrastructure-as-code, благо все настраивается в одном конфиг файле (как, например, у travis). В отличие от Jenkins (хотя там, насколько я знаю, есть подвижки в эту сторону).

        +1
        И Teamcity тоже
          +1
          или Teamcity — тоже неплохая система «из коробки»
          0

          Похоже недостатки дженкинса так притянули, что уши оторвали :)

            0

            Из реального: на настройку необходимо время.


            Gitlab CI более дружелюбный, например, но в том же время, позволяет немного меньше.

              0
              В дженкинсе меня лично жутко раздражает UI. Пробовал Blue Ocean, выглядит неплохо, но постоянные переходы на старый UI там, где недоделано, портит все впечатление.
                0

                Это согласен — UI все-таки там не модный.

                  0
                  Blue Ocean хорошо выглядит и ничего не умеет
                    0
                    С приходом Pipeline DSL и модой на мессенджеры, куда вся нотификация и результаты билдов приходят — UI уже не так критичен
                    0
                    Сорри за некропостинг, только сейчас наткнулся.

                    О недостатках Дженкинса даже не упомянули. Сложность настройки — фигня. У Дженкинса есть архитектурные недостатки, которые вообще блокируют намертво работу этого продукта.

                    1. Например, ограничение количества кода в Jenkinsfile. Слышали о такой проблеме? Вас не спасут даже инклуды через load. Он считает строки кода после всех инклудов. В результате люди вынуждены пилить пайплайны на куски каскадных джоб, что делает весь проект очень сложным — и там начинается пляска с бренчами. Ну или вызывать внешние скрипты, уродуя нативность процесса.

                    2. Плагины system-wide, а не branch-wide. Вам нужно проапгрейдить плагин? Ок, делайте это, если хватит пермишеннов от админа. А когда хватит, молитесь, что не сломали сотни других проектов. В том же CircleCI люди указывают орбы (это аналог плагина) на свой бренч. И только если все тесты прошли, они уже мерджат и не делают проблем другим людям.

                    3. Апдейт параметров для всей джобы с Jenkinsfile. То есть вы создаете свой бренч, хотите новый параметр, запускаеет бренч и упс… вы переписали все параметры на свой лад для всех бренчей в Multibranch job. (я надеюсь у вас хватает квалификации не использовать конвенциональные джобы и однобренченвый пайплайн).

                    Я могу продолжать долго. При всем уважении к Дженкинсу, как к одному из самых удачных продуктов за всю историю ИТ, он имеет огромное количество архитектурных недостатков посерьезнее, чем «сложность конфигурации».
                    0
                    В минусах у Jenkins значится — необходимо время на настройку. А что, первые 2е СI не требуют настройки? Проект чудесным образом сам будет собираться. Или что имелось ввиду?
                      +1

                      Имелось в виду, что в дженкинсе нужно будет потратить больше времени на настройку, чем в других системах. Если говорить проще, тот уже его модульность стала минусом, ибо настраивать модульность реально дольше, чем просто использовать определённые "заготовки" в чём-нибудь монолитном.

                        0
                        Ну не знаю. По-моему очень спорно и субъективно. Сейчас в Jenkins в основном DSL используется для описания джоб. Если имеется ввиду сама настройка Jenkins как такового, то это единоразовая операция, да и что там собственно настраивать то, разве что всякие матрицы проектов и права.
                      0
                      А как же GitLab CI + Docker? И если брать хорошо настроенное тестирование (я использую встроенный в Laravel phpunit + вариативную настройку сред, то CI становится простым и рутинным делом

                      Only users with full accounts can post comments. Log in, please.