Что такое методология разработки CI/CD

Что такое методология разработки CI/CD

Тирекс
Тирекс Самый зубастый автор
20 августа 2020

О методологии CI/CD дискутируют разработчики, менеджеры проектов и другие IT-специалисты. Как строится работа по проекту в рамках CI/CD? Какие выгоды методология несет DevOps? Подробнее – в материалах статьи.

Изображение записи

CI/CD (Continuous Integration, Continuous Delivery) переводится как «непрерывная интеграция и доставка». Если говорить простым языком, CI/CD — это технология автоматизации тестирования и доставки новых модулей разрабатываемого проекта заинтересованным сторонам: разработчикам, аналитикам, инженерам качества, конечным пользователя и другим.

Принципы CI/CD

Сегрегация ответственности заинтересованных сторон. Участники процесса разработки и потребители готового проекта разделяют между собой ответственность за ту или иную стадию жизненного цикла продукта. Разработчики и дизайнеры проектируют бизнес-логику, а также обеспечивают положительный пользовательский опыт взаимодействия с готовой системой. Инженеры по качеству вводят сквозные функции и приемочные тесты, DevOps-инженеры организуют логистику кода, а пользователи дают обратную связь по результатам использования системы.

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

Короткий цикл обратной связи. В коммерческой разработке скорость реакции на возникновение ошибок или запросов новой функциональности закладывает основу конкурентоспособности будущей системы. Чтобы добавлять в продукт новые функции быстрее конкурентов, необходимо стремиться к автоматизации сборки и тестирования кода. Однако в ситуациях, когда для решения необходимо участие человека, автоматизация может только навредить. Для таких ситуаций рекомендуется сокращать число информационных посредников, обеспечивая короткий цикл обратной связи.

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

Этапы CI/CD

Написание кода. Каждый из разработчиков пишет код своего модуля, проводит ручное тестирование, а затем соединяет результат работы с текущей версией проекта в основной ветке. Для контроля версий используется система Git, либо аналогичные решения. Когда участники команды опубликуют код своих модулей в основной ветке, начнется следующий этап.

Сборка. Система контроля версий запускает автоматическую сборку и тестирование проекта. Триггеры для начала сборки настраиваются командой индивидуально — фиксация изменений в основной ветке проекта, сборка по расписанию, по запросу и т.д. Для автоматизации сборки используется Jenkins либо аналогичный продукт.

Ручное тестирование. Когда CI система успешно проверила работоспособность тестовой версии, код отправляется тестировщикам для ручного обследования. При этом тестовая сборка получает номер кандидата для дальнейшего релиза продукта (например, v.1.0.0-1).

Релиз. По итогам ручного тестирования сборка получает исправления, а итоговый номер версии кандидата повышается (например, после первого исправления версия v.1.0.0-1 становится v.1.0.0-2). После этого выпускается версия кода для клиента (например, v.1.0.0) и начинается следующий этап цикла.

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

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

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

Преимущества CI/CD

Метод CI/CD помогает оперативнее выпускать новые опции продукта (работа с запросами клиентов). Как правило, на это уходят считаные дни или недели. В то же время при классическом подходе к разработке клиентского софта это может занять год.

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

Недостатки CI/CD

Качество продукта повышается за счет параллельного тестирования функциональных блоков будущей системы. Узкие места и критические моменты фиксируются и обрабатываются еще на ранних стадиях цикла.

Тем не менее руководители проектов ошибочно принимают методологию как панацею и стремятся внедрить ее во все свои разработки. При недостатке опыта приводит к усложнению работ по IT-продуктам компании.

Также заслуживает внимания и организация взаимодействия между проектными группами, поскольку CI/CD сильно завязан на человеческий фактор. Инженеры, scrum-специалисты, аналитики, dev-группы и другие функциональные единицы должны работать в единой экосистеме с адекватным руководством и проектным управлением.

Инструменты для CI/CD

Software-разработчики используют различные инструменты для автоматизации тестирования и доставки кода своих проектов конечным пользователям.

GitLab CI. Среда позволяет управлять репозиториями проекта, документировать функциональность и результаты доработок и тестов, а также отслеживать ошибки и работать с CI/CD pipeline.

Docker. Система автоматического развертывания проектов. Поддерживает контейнеризацию и позволяет упаковать проект вместе со всем окружением и зависимостями в контейнер, который можно перенести на Linux-систему.

Travis-CI. Инструмент подключается к репозиториям в GitHub при минимуме настроек. Решение облачное и не требует локальной установки. Кроме того, оно бесплатно для open-source проектов.

Circle-CI. Продукт использует бесшовную интеграцию с GitHub. Предлагается веб-интерфейс для отслеживания версий сборок и ведения задач. Также решение поддерживает отправку оповещений по почте и другим каналам связи.

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

TeamCity. В бесплатном режиме позволяет работать только с тремя агентами сборки. Техническая поддержка предоставляется по подписке.

PHP Censor. CI-сервер для автоматизации сборки PHP-проектов, работающий с репозиториями GitLab, GitHub, Mercurial и другими. Для тестирования используются библиотеки Atoum, PHP Spec, Behat. Проект хорошо документирован, но предполагает самостоятельную настройку и хостинг.

Rex. Предназначен для автоматизации CI-процессов в дата-центрах. Работает на Perl-скриптах.

Open Build Service (OBS). Предназначен для автоматизации CI/CD в разработке дистрибутивов приложений.

Buildbot. CI-система, позволяющая автоматизировать сборку и тестирование приложений. Поддерживает современные VCS и позволяет гибко настраивать сборку за счет Python-компонентов.

СI/CD на практике

На практике внедрение CI/CD в компаниях перекликается с теми этапами, которые мы описали выше.

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

Выбор инструментов CI/CD. Исходя из анализа потребностей, выбирается набор инструментов CI/CD, который лучше всего подходит для проекта. Это могут быть:

  • системы непрерывной интеграции, например, Jenkins или CircleCI;
  • системы управления версиями;
  • инструменты контейнеризации, например, Docker;
  • системы управления конфигурациями — Ansible, Terraform или что-то еще.

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

Тестирование. Особое внимание уделяется настройке автоматизированных тестов, которые будут запускаться на каждом этапе конвейера CI/CD. Как правило, разработчики пишут юнит-тесты и интеграционные тесты, чтобы обеспечить полное покрытие функциональности приложения. Для автоматического тестирования компания может использовать JUnit, Selenium, или PyTest.

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

Здесь команды используют Ansible или Terraform, чтобы обеспечить консистентность окружения и минимизировать риск появления проблем при развертывании.

Если вам нужна помощь в организации СI/CD, воспользуйтесь услугой DevOps as a Service. Наши специалисты помогут организовать непрерывную интеграцию и доставку приложений, а также обеспечат автоматизацию их развертывания.

Советы по СI/CD

Определитесь с технологиями и практиками перед внедрением CI/CD и придерживайтесь этого выбора во время работы в командах. 

Автоматизируйте все, что только возможно. Используйте современные инструменты и скрипты, чтобы минимизировать ручной труд. Помните, что практически все этапы процесса CI/CD можно автоматизировать, начиная со сборки кода и заканчивая деплоем.

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

Создавайте изолированные среды для тестирования. Такие среды могут в точности воспроизводить окружение продакшн. Это позволит проводить тестирование в реалистичных условиях и уменьшит риск возникновения конфликтов из-за различий в окружении.

И главное — постоянно обучайтесь. Мир разработки меняется с каждым днем. В нем появляются новые инструменты и технологии. Важно следить за тенденциями (и не только в области CI/CD) и постоянно улучшать процесс разработки в компании.