Что такое непрерывная интеграция (CI)?

Для начала давайте разберемся с терминологией: CI — это сокращение от «continuous integration», т.е. непрерывной интеграции. Непрерывная интеграция предполагает, что все, кто участвует в проекте разработки ПО, регулярно публикуют изменения, внесенные ими в кодовую базу, в центральном репозитории. Обычно в проекте задействовано несколько разработчиков, поэтому очень важно хранить весь код, над которым идет работа, централизованно. В идеале объединение должно выполняться автоматически несколько раз в день. Цель непрерывной интеграции — обеспечить стабильность разработки и выпуска ПО за счет совместной работы, автоматизации и быстрой обратной связи.

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

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

непрерывная интеграция

Практическое использование непрерывной интеграции

Основные элементы непрерывной интеграции:

  • источник или система контроля версий с единой кодовой базой, включая файлы исходного кода, библиотеки, файлы конфигурации и скрипты;
  • автоматизированные билд-скрипты;
  • автоматизированные тесты;
  • инфраструктура для выполнения сборки и тестов.

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

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

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

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

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

Проблемы непрерывной интеграции

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

Для многих разработчиков DevOps означает большие изменения в подходе к работе, что требует пересмотра существующих процессов. Чтобы координировать усилия разных команд и добиться подлинного сотрудничества, необходима своевременная коммуникация.

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

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

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

Тщательный контроль процессов непрерывной интеграции и использование метрик для выявления узких мест помогут оценить затраты и преимущества вложений в изменение архитектуры, расширение инфраструктуры и покрытие автоматизированными тестами.

Преимущества непрерывной интеграции

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

Вот основные преимущества непрерывной интеграции:

  • Минимум риска при развертывании. Благодаря непрерывному объединению изменений по мере написания кода любые возможные ошибки удается обнаружить на ранних этапах работы.
  • Повышение качества. Автоматизация значительной части ручных тестов позволяет разработчикам сосредоточиться на тестировании более высокого уровня.
  • Снижение расходов. Внедряя непрерывную интеграцию с последующей доставкой ПО пользователям небольшими пакетами, а также автоматизируя значительную часть работы, компании могут значительно снизить расходы на доставку ПО.

Лучшие практики CI/CD

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

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

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

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

CI и CD

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

Непрерывная интеграция — это процесс слияния изменений кода с основной веткой. В основе непрерывной доставки лежит автоматизация сборки и тестирования, реализованная на этапе непрерывной интеграции. Непрерывное развертывание — последний этап CI/CD-процесса, когда новая версия ПО доставляется пользователям после выполнения всех требований.

Подробнее об особенностях CI и CD

Подводя итоги

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