Скорость сборки продукта — важное конкурентное преимущество в разработке программного обеспечения. То, что раньше делалось месяцами, сегодня выполняется за считанные дни без потери качества. Путь к ускорению релизов лежит через автоматизацию и внедрение CI/CD.

В статье разберём, когда и зачем нужен CI/CD, но перед этим, расскажем, как устроена методология и почему эффективнее внедрить её, чем деплоить вручную.

Что такое CI/CD

CI/CD — это одна из DevOps практик, которая позволяет разработчикам чаще и надёжнее развёртывать изменения ПО, свести к минимуму ошибки, повысить темпы сборки и качество разрабатываемого продукта. Представляет собой комбинацию continuous integration и continuous delivery.

CI, или непрерывная интеграция — процесс постоянной разработки ПО с интеграцией в основную ветвь. Автоматически собирает софт, тестирует его и оповещает, если что-то идёт не так.

CD, или непрерывная доставка — процесс постоянной доставки ПО до потребителя. Обеспечивает разработку проекта небольшими частями и гарантирует, что он может быть отдан в релиз в любое время без дополнительных ручных проверок.

Как выглядит цикл CI/CD:

  1. Разработчик пишет код, проводит начальное тестирование, чтобы не было ошибок, и фиксирует изменения в своей рабочей ветке. Затем соединяет модифицированный код с рабочим кодом из основной ветки.

  2. Система, выбранная инструментом CI, замечает, что в коде произошли изменения и запускает автоматическую сборку и автоматическое тестирование программы.

  3. Если автоматическое тестирование прошло успешно, ПО отдаётся для ручного тестирования команде тестировщиков.

  4. После исправления недочётов, обнаруженных во время ручного тестирования, запускается автоматизированная установка ПО на серверах компании.

  5. Осуществляется поддержка новой версии программы и её мониторинг.

  6. Собираются запросы на исправление недочётов и багов, разработчик вносит изменения в код, и процесс повторяется.

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

Как было до CI/CD

Вернёмся на несколько лет назад и вспомним, как деплоили вручную на примере обновления интерфейса сайта.

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

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

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

При этом сам по себе деплой — рутинная задача. Нужно скомпилировать код, перенести все файлы на сервер, выполнить миграции, поправить конфигурации и др. Когда вы делаете все вручную, это отнимает много времени, и всегда можно что-то упустить. В итоге на подготовку кода к релизу уйдут месяцы, что слишком долго в условиях постоянной конкуренции.

Автоматизированный CI/CD-пайплайн позволяет вам доставлять изменения еженедельно, ежедневно или даже ежечасно. Если всё настроено правильно, то вы деплоите приложения на сервер с помощью всего одной команды.

Почему CI/CD — это важно

Существует понятие time to market — это время, которое компания тратит на реализацию и выпуск продукта. Чем ниже time to market, тем быстрее зарабатываются деньги для бизнеса. Если ваш конкурент за день зарелизил новую фичу, а вам на то, чтобы её разработать и внедрить требуется неделя — это плохо, вы теряете деньги, которые могли бы заработать.

Внедрение CI/CD позволяет ускорить time to market. Это полезно для поддержания конкурентоспособности — благодаря частым релизам продуктовые менеджеры и маркетологи могут активнее участвовать в разработке.

Плюс, возможность рано и часто тестировать новые фичи с участием пользователей в преподакшене или продакшн-окружении позволяет проверить, насколько эти фичи решают проблемы пользователей. Возможно, они не соответствуют запросам ЦА, и не стоит тратить месяцы на реализацию такой функциональности.  

Какие проблемы решает CI/CD

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

За счёт автоматизации процесс CI/CD решает ряд важных проблем:

  • Отсеивает некоторый процент ошибок на пути в продакшн. Цена ошибок в коде велика, и часто их причиной становится человеческий фактор. Важным этапом выпуска ПО считается тестирование кода, но, чтобы выполнить его тщательно, нужно много времени. Сценарии ручного тестирования требуют множества повторений и высокой концентрации. Даже самый ответственный тестировщик может невольно отвлечься и повторить те же шаги с небольшим отличием. Центральная часть любого CI/CD-пайплайна — набор автоматизированных тестов. Автоматизация тестирования гарантирует, что тесты выполняются точно, а результаты — будут надёжны.

  • Улучшает качество кода. CI/CD автоматизирует запуск множества проверок: unit-тестирования, интеграционного тестирования и др. Это позволяет разработчикам заниматься программированием и кодом, а не тратить время на разбор инцидентов и поиск их причин.

  • Устраняет разобщённость между разработкой и операционной деятельностью. CI/CD — это единая точка коммуникации контроля разработки и интеграции ПО. Вы можете задействовать в создании продукта самых разных специалистов и добиться прозрачности процесса разработки и сотрудничества команд друг с другом.

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

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

Решая перечисленные проблемы, CI/CD нормализует работу и коммуникацию бизнеса с IT — исчезают противоречия в духе: «Кто кому должен и кто плохо работает». Построение CI/CD-пайплайна делает процесс разработки и выпуска ПО более компактным и эффективным. Пока компьютеры выполняют рутину, разработчики могут сосредоточиться на решении бизнес-задач и проведении экспериментов.

Когда нужен CI/CD

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

При этом есть два случая, когда польза CI/CD спорна:

  • Когда нет потребности в автоматизации. Если это небольшая компания или стартап, где деплоем занимаются два человека, им пока не нужен CI/CD. Стоит подождать, пока проект вырастет до точки, где ему понадобится автоматизация, а внедрение CI/CD принесет больше плюсов, чем минусов.   

  • Когда в компании присутствуют архаические методы. Например, в некоторых государственных компаниях используется софт, которому уже больше 10-15 лет и который уже находится в какой-то итерации. В такой ситуации проблематично настроить автоматическую доставку, и разработчику проще вручную вносить изменения на продакшн сервера.

За исключением описанных случаев все больше компаний понимают необходимость процесса автоматизации, и роль CI/CD возрастает.  

Вместо заключения

Подведем итоги и ответим, зачем все-таки нужен CI/CD:

  1. Чтобы получать ожидаемый результат от деплоя. Если вы один раз описали инфраструктуру или какой-то процесс в виде кода, то каждый раз, когда будут выполняться процессы автоматического развёртывания, они будут одинаковыми. Так исключается ситуация, когда вчера вы деплоили одним способом, а сегодня кто-то что-то поправил, и все работает не так, и вам нужно искать причину почему.

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

  3. Чтобы ускорить срок вывода продукта на рынок. Задача CI/CD-пайплайна — быстро и часто доставлять пользователям работающее ПО.

Разобраться в принципах CI/CD, научиться самостоятельно создавать сложные пайплайны и понять, как ускорить цикл разработки с минимальными рисками вам поможет видеокурс «CI/CD на примере Gitlab CI».

Все занятия проходят в Личном кабинете Слёрма — вы самостоятельно выбираете, когда смотреть их. После каждой темы идет практическое задание — его вы выполняете на стендах платформы.

Курс рассчитан на тех, кто уже работал Git и Docker, хорошо разбирается Linux. Подойдет DevOps-инженерам, разработчикам компаний, где нет выделенного DevOps, и системным администраторам.

 

 

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


  1. amarao
    01.02.2022 16:19
    +17

    Вы обещали разобрать вопрос, а вместо этого прошлись по чрезмерно упрощённым верхам. Основная сложность в CI/CD не в настройке пайплайна/workflow (это может написать любая обезъяна, владеющая yaml'ом), а разграничении продакшен/стейджинг. Вся боль - там. Мы хотим воспроизводимый пайплайн при работе с flaky внешним провайдером. У нас приложение с тяжёлыми сайд-эффектами, но мы хотим быстрый пайплайн. У нас секрет для интеграции с платёжной системой, но мы хотим, чтобы стейджинг не мог хулиганить, но при этом хотим проверить, что код работает правильно. У нас приложение обсыпается и мы хотим иметь логи от приложения после завершения пайплайна, но мы не хотим видеть логи от приложения от соседнего пайплайна. Мы хотим получать ответ от CI-сервера за 15 минут, но полный цикл деплоя занимает 2 часа. Бюджет CI - 10 баксов на прогон (верхняя граница), а ТолстаяБаза жрёт 8 баксов только на запуск. И т.д.


    1. geniyoctober
      03.02.2022 05:07

      Спасибо за ценный комментарий, мы забрали поднятые проблемы в список потенциальных тем по CI/CD. Для DevOps-инженеров, которые уже настраивают CI/CD в ней действительно нет нового. В этом материале план и был пройтись по основам.

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


    1. Ingvar666
      03.02.2022 12:59

      плюс стопитсот, разложил по полочкам


  1. jobber_man
    02.02.2022 00:20
    +2

    Цена ошибок в коде велика, и часто их причиной становится человеческий фактор.

    Часто?! Скажите, а сколько раз за свою жизнь вы встречали ошибки в коде по другим причинам? Ну, не знаю, например, из-за сбоя железа или стихийных бедствий?


    1. 19serg
      03.02.2022 12:47

      Пример простой - неверные требования.


      1. jobber_man
        03.02.2022 23:36

        Если программа решает задачу, но не ту, то ошибка скорее всего не в коде. И CI или CD тут не всегда поможет. Да и опять же, не боги ведь требования пишут.


  1. commanderxo
    02.02.2022 03:25

    На КПДВ показана гидроэлектростанция на Вальхензе в Альпах, вода, естественно, течёт сверху вниз. Получается последовательность Deploy->Test->Build. Странно это как-то.