Среди всех существующих CI/CD-инструментов есть два наиболее популярных — Jenkins и GitLab CI/CD. Хотя они решают схожие задачи, между ними есть отличия, которые важно учитывать. Мы пообщались с Кириллом Борисовым, старшим инженером-программистом VK, чтобы больше узнать о ключевых особенностях инструментов, разобраться в их сильных и слабых сторонах. 

В статье проанализируем возможности Jenkins и GitLab CI/CD через призму личного опыта и расскажем, как подобрать инструмент под требования проекта. Если у вас есть свой взгляд на этот счет, будем рады узнать — делитесь в комментариях.

Jenkins

Jenkins — гибкий инструмент, предназначенный для автоматизации задач в сложных системах и суровых энтерпрайзах с огромным количеством ограничений. Его ключевое преимущество заключается в способности не просто строить CI/CD-процессы, а покрывать весь цикл сборки и доставки. 

Особенности 

Экосистема плагинов. Экосистема плагинов Jenkins выглядит более развитой по сравнению с экосистемами подключаемых модулей других CI/CD-инструментов. В настоящее время существует более 1500 плагинов, направленных на решение широкого спектра задач. 

Плагины упрощают работу, но при бездумном использовании могут вызывать проблемы. Во-первых они потребляют довольно много памяти. Во-вторых, некоторые из них некорректны — это обратная сторона опенсорсного комьюнити, когда написано вроде всё, но не всегда хорошо.

Исходя из своей практики, могу сказать, что около 80% задач можно решить с помощью плагинов. Оставшиеся 20% — посредством «допилов».

Порог входа. Я считаю, что порог входа у Jenkins чуть выше, чем у GitLab CI/CD, потому что GitLab CI/CD — это YAML, который многие знают и любят. Однако однажды разобравшись в Jenkins, вы почувствуете всю силу инструмента и вряд ли захотите использовать что-то ещё. 

Популярность. Очень много проблем, возникающих в работе с Jenkins, достаточно легко гуглятся, потому что они уже возникали у других людей. Это значительно повышает шансы найти решение. Кроме того, существует немало чатов, куда вы всегда можете обратиться за помощью и оперативно получить её. 

Поддержка параллельного вычисления. Jenkins поддерживает распараллеливание DevOps-задач. В рамках одного пайплайна вы можете запускать разное количество параллельных запросов, которые будут осуществляться на разных агентах и не помешают друг другу. Это позволяет ускорить процесс сборки проекта.

Слабые стороны

К слабым сторонам Jenkins обычно относят архитектуру. Проблема в том, что весь код выполняется на мастере, что может приводить к падениям и некоторым другим негативным последствиям. 

Что это значит? Вам придётся приложить больше усилий, чтобы превратить Jenkins в надежный инструмент. Просто поставить его и ожидать, что всё будет работать, не получится.  

В комьюнити Jenkins около 4 лет ведутся разговоры о том, что стоит изменить архитектурное устройство инструмента. Однако пока всё остаётся только на уровне разговоров. 

Gitlab CI/CD

Gitlab CI/CD — инструмент, встроенный в систему контроля версий GitLab. Его любят использовать для автоматизации задач, связанных с выкаткой кода в продакшн или тестовые среды. Из определения можно сделать вывод, что Jenkins — это самостоятельная система, а Gitlab CI/CD является частью чего-то. 

Особенности

Расширения. В дефолтной версии Jenkins имеет ограниченный функционал. «Мясом» и дополнительными возможностями он обрастает за счет расширений. Gitlab CI/CD — готовая система, в которой есть всё для выкатки кода в прод. 

С одной стороны, это удобно, но с другой, накладывает ограничения — вы вынуждены подстраиваться под требования Gitlab CI/CD. Jenkins в этом смысле более гибкий — можно настраивать его так, как удобно. 

Востребованность. У меня нет точной статистики по использованию Gitlab CI/CD, но его популярность бесспорно растёт. Отчасти это связано с тем, что многие полезные фишки, которые были платными, начали перетаскивать в бесплатную комьюнити-версию. Отчасти — с распространенностью YAML

По опыту собеседований в крупные компании могу сказать, что Jenkins не сдаёт позиций — его тоже активно используют. Некоторые организации вообще не ограничиваются чем-то одним. В одной компании команды могут использовать разные инструменты. Какие-то команды используют Gitlab CI/CD, какие-то — Jenkins. Выбор определяется опытом, имеющимися навыками и задачами, которые предстоит решать. 

Средства для отслеживания проблем. GitLab CI/CD позволяет выполнять параллельное тестирование различных веток кода. Результаты испытаний удобно анализировать в интерфейсе системы — вы всегда можете зайти и посмотреть, как прошёл билд. 

Всё опирается на удобство использования одного интерфейса, когда вам не нужно идти во внешние системы. Это выгодно отличает GitLab CI/CD от Jenkins.

Ограничение доступа к репозиториям. В Jenkins вам приходится отдельно разграничивать доступ. В GitLab CI/CD  тем, кто совместно работает над проектом, вы можете назначать права, соответствующие их ролям. Это особенно актуально для корпоративных проектов. 

Слабые стороны

В Jenkins вы можете взять язык программирования Groovy или Java и написать код, тесты и др. В GitLab CI/CD придётся обходиться bash-скриптами. Это, конечно, дело вкуса, но мне такой подход не нравится, так как огромное количество баш-кода тяжело считать.

От чего зависит выбор CI/CD-инструмента

Когда лучше использовать Jenkins, а когда — GitLab CI/CD? Многое зависит от знаний, навыков и опыта человека, который будет поддерживать СI/CD-процесс. На практике это часто оказывается одним из важнейший ориентиров при выборе инструмента. 

Также следует учитывать задачи, которые предстоит решать, и ресурсы, которые компания готова предоставить для их решения. Если речь идёт о небольшом стартапе, где нет дополнительных средств на поддержку, предпочтение стоит отдать GitLab CI/CD. Так вы получите и инструмент для управления CI/CD-процессом, и систему контроля версий прямо из коробки. 

Для нетривиальных задач больше подойдёт Jenkins. В качестве языка для Jenkins Pipeline скрипта был выбран Groovy. Это позволяет вам описывать сложные процессы на языке программирования. Для сравнения в GitLab CI/CD используется либо кастомный Python, либо Bash, который смотрится довольно странно в кейсах, где нужно взаимодействовать сразу с несколькими системами и получать от них ответы.

Личный опыт: почему выбрал Jenkins

Когда я только начинал работать, такого огромного выбора не было. Фактически существовало три варианта: тогда ещё платный TeamCity, только зарождающийся Gitlab CI/CD и Jenkins. Последний считался эталонным инструментом, который использовался во многих компаниях и часто упоминался в тематических статьях. На старте этого было достаточно, чтобы сделать выбор в его пользу. 

По ходу работы я всё больше проникался Jenkins. И, признаюсь честно, до сих пор не понимаю, как те задачи, что мы решали с его помощью, можно было бы выполнить посредством Gitlab CI/CD. Один из примеров — интеграция Wiki, когда мы собирали версии всех зарелизенных компонентов, постили их в git, готовили Jira-отчёты и тому подобное. 

Свой выбор я сделал давно, и, конечно, с тех пор многое изменилось. Gitlab CI/CD сильно преуспел и получил много разных фич. Однако это не отменяет того факта, что Jenkins остаётся отличным инструментом CI/CD и автоматизации в целом. 

Недавно проводил импровизированный опрос, чтобы понять, какой из инструментов востребованнее. Выяснилось, что GitLab CI любят чуть больше, чем Jenkins. При этом Jenkins ценят за универсальность и способность решать сложные задачи. Отсюда простой вывод: когда нужно что-то простое и быстрое — выигрывает GitLab CI. Если же на кону нетривиальный процесс для энтерпрайз — Jenkins. 

От редакции

Если вы хотите расширить стек технологий и систематизировать знания, приглашаем пройти курс Devops Upgrade. На третьем этапе этого курса вы на практике познакомитесь с Kubernetes и CI/CD.

А также приглашаем в телеграм-чат о курсе, где можно задавать вопросы и обсуждать технологии с единомышленниками.

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


  1. dyadyaSerezha
    30.12.2022 05:21

    Работал с Jenkins и TeamCity (версии 5-7-летней давности). Наверное, Jenkins был чуть более гибким и функциональным.


  1. DeoxyribonucleicAcid
    30.12.2022 13:01

    Как же одна из главных особенностей по запуску и работе с пайпами? В дженкинсе проще сделать кучу разных сценариев, настроить чек-боксы, выбор переменных из списка, в дженкинсе пайп и репозиторий не связаны, в дженкинсе отличная ролевая модель. Аналогично можно расписать и про гитлаб. Нет ни слова про нагрузку, сколько тянет тот или иной инструмент. Берёте в сравнение гитлаб, но даже не указываете какой именно (есть бесплатная и несколько платных версий). Слабый анализ, коллеги.


  1. seasadm
    30.12.2022 14:58
    +2

    Статья ни о чем.

    По большому счету, что должна делать CI/CD система? Она должна определить наступление какого-то события, запустить действие, соответствующее этому событию, понять успешно ли оно завершилось, сохранить логи выполнения действия и, возможно, какой-то артефакт.

    Событием может быть комит в гит, ручное действие, внешний триггер, завершение другого пайплайна, и обе эти системы +/- с этим справляются.

    Но! Gitlab это opinionated система. Тоесть у неё есть своё мнение как хорошо и правильно делать CI/CD. На гитлаб довольно не просто сделать плохо. Гитлаб это пайплайны как код, который лежит фактически совместно с вашим репозиторием и является его частью.

    Jenkins же это одна большая головная боль. Большинство инсталляций дженкинса превращаются со временем в помойку, где намешаны какие-то горе-плагины, кривые дженкинсфайлы и куски говнокода на груви (на котором наговнокодить почему-то легче чем на том же баше).

    Я не знаю, каких возможностей гитлаб не хватает любителям дженкинса. Скорее всего это от того что они либо не разобрались в гитлаб, либо хотят странного.

    Ну например это заявление в статье: гитлпб поддерживает только баш. В гитлаб ты можешь задать свой экзекутор - от пауэршелл до кастомного бинаря. Но я не понимаю людей, которые пишут гигантские портянки на баше или груви в CI/CD. 10 строк кода на джоб - всё что нужно в 99% при правильно спроектированном процессе CI/CD. Ну максимум 20. Если вы не можете убраться в этот предел, возможно написание пайплайнов не для вас?


    1. seasadm
      30.12.2022 15:36

      Ну в смысле в статье стоило бы сравнить важные фичи этих систем. Какие источники действий и триггеры они могут обслуживать, возможности по построению и управлению пайплайнами, возможности организации интерфейса для работы с пользователями/управления пайплайнами, ролевую модель доступа, интеграцию с внешними системами (от sonarqube до jira и kubernetes). В этой же статье, сравнивается скорее ваш опыт работы с этими системами. И поскольку с гитлаб он кажется не велик, тут идёт очевидный перекос...


  1. dexec
    30.12.2022 21:21

    Как человек долгое время проработавший с Gitlab, характеризую Jenkins как любовь и ненависть в одном флаконе (огромное кол-во времени тратится на решение всевозможных проблем с плагинами, groovy кодом и т.д).
    "В Jenkins вы можете взять язык программирования Groovy или Java и написать код, тесты и др. " - не могли бы вы уточнить как и для чего можно выбрать Java? Насколько я знаю в Jenkins есть возможность использовать любые Java библиотеки, но работать все равно придется с Groovy. Также с недавнего времени стал доступен выбор Kotlin, но его функциональность также весьма ограничена.


  1. oller
    31.12.2022 13:13

    Не знаю как в дженкинс, но Gitlab CI/CD при работе с несколькими кластерами, вам нужно заплатить за ee версию