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

Комментарии (20)


  1. alexkuzko
    18.07.2017 09:21
    +1

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


    1. farcaller
      18.07.2017 10:45

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


      1. SirEdvin
        18.07.2017 11:15

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

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


        1. farcaller
          18.07.2017 11:20

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

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


          1. SirEdvin
            18.07.2017 11:27

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


            1. farcaller
              18.07.2017 11:32

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


              1. SirEdvin
                18.07.2017 11:33

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


                1. farcaller
                  18.07.2017 11:46

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


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


    1. sutarmin
      18.07.2017 11:15
      +1

      И Teamcity тоже


    1. koldoon
      18.07.2017 12:00
      +1

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


  1. iborzenkov
    18.07.2017 11:24

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


    1. SirEdvin
      18.07.2017 11:28

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


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


    1. ahanoff
      18.07.2017 12:09

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


      1. iborzenkov
        18.07.2017 12:34

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


      1. varnav
        18.07.2017 13:39

        Blue Ocean хорошо выглядит и ничего не умеет


      1. blimKololei
        18.07.2017 22:09

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


  1. ALexhha
    18.07.2017 23:30

    В минусах у Jenkins значится — необходимо время на настройку. А что, первые 2е СI не требуют настройки? Проект чудесным образом сам будет собираться. Или что имелось ввиду?


    1. bano-notit
      19.07.2017 07:08
      +1

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


      1. ALexhha
        19.07.2017 22:58

        Ну не знаю. По-моему очень спорно и субъективно. Сейчас в Jenkins в основном DSL используется для описания джоб. Если имеется ввиду сама настройка Jenkins как такового, то это единоразовая операция, да и что там собственно настраивать то, разве что всякие матрицы проектов и права.


  1. rikozi
    19.07.2017 08:08

    А как же GitLab CI + Docker? И если брать хорошо настроенное тестирование (я использую встроенный в Laravel phpunit + вариативную настройку сред, то CI становится простым и рутинным делом