Для начала давайте разберемся с терминологией: CI — это сокращение от «continuous integration», т.е. непрерывной интеграции. Непрерывная интеграция предполагает, что все, кто участвует в проекте разработки ПО, регулярно публикуют изменения, внесенные ими в кодовую базу, в центральном репозитории. Обычно в проекте задействовано несколько разработчиков, поэтому очень важно хранить весь код, над которым идет работа, централизованно. В идеале объединение должно выполняться автоматически несколько раз в день. Цель непрерывной интеграции — обеспечить стабильность разработки и выпуска ПО за счет совместной работы, автоматизации и быстрой обратной связи.
Внедрение непрерывной интеграции начинается с регулярной отправки изменений в систему управления версиями / исходным кодом, чтобы все участники проекта работали с одинаковым кодом. Каждый коммит становится триггером для сборки и серии автоматизированных тестов, чтобы проверить поведение кода и убедиться, что изменение ничего не сломало. Непрерывная интеграция полезна и сама по себе, а еще она становится первым шагом к реализации CI/CD-пайплайна.
Приняв четкое определение CI и внедрив эту практику в процесс разработки, команды смогут оптимизировать рабочий процесс и повысить качество своего программного обеспечения.
Основные элементы непрерывной интеграции:
Чтобы все участники проекта работали с одинаковым кодом, они должны использовать один репозиторий и регулярно публиковать свои изменения. Практика показывает, что каждый участник должен отправлять изменения в основную ветку не реже раза в день.
Следующий шаг после отправки изменений — сборка решения и проведение автоматизированных тестов, чтобы проверить поведение кода. Автоматизация этого процесса — неотъемлемая часть непрерывной интеграции. Если сборка и тестирование осуществляются вручную, это отнимает много времени и может вести к ошибкам. В результате ежедневная интеграция изменений теряет смысл. Конкретные инструменты сборки и фреймворки тестирования зависят от рабочего языка программирования.
После настройки скриптов и тестов необходимо контролировать и при необходимости обновлять процесс. Сюда входит добавление автоматизированных тестов при появлении любых новых функций, устранение сбоев и отслеживание производительности.
Если вы добавите сервер непрерывной интеграции, который осуществляет мониторинг репозитория, запускает сборку, выполняет автоматизированные тесты и создает отчеты о результатах, это поможет собрать вместе все фрагменты и сэкономит время на написание собственной логики автоматизации. Кроме того, вы получите дополнительную информацию, например, метрики покрытия кода и историю сборок.
Но, несмотря на важную роль инструментов и процессов, максимальную пользу из непрерывной интеграции удастся извлечь, только если все люди будут на практике следовать ее принципам. Необходимо пересмотреть рабочие процессы команды, включив в них регулярную отправку изменению в основную ветку, добавление автоматизированных тестов для всех новых функций и приоритетное устранение проблем со сборкой, когда что-то идет не так. Чтобы преодолеть организационную разобщенность, нужно не забывать о совместной работе с тестировщиками для приоритетной подготовки и бесперебойного выполнения автоматизированных тестов, а также о сотрудничестве со специалистами, отвечающими за инфраструктуру, — они помогут получить машины для выполнения сборок и тестов.
Непрерывная интеграция дает преимущества не только самим разработчикам, но и компании в целом, но не все ее охотно принимают.
Для многих разработчиков DevOps означает большие изменения в подходе к работе, что требует пересмотра существующих процессов. Чтобы координировать усилия разных команд и добиться подлинного сотрудничества, необходима своевременная коммуникация.
Если вы уже используете Agile-методологию, вам будет легче приспособиться, поскольку вы уже понимаете, насколько важно постоянно получать обратную связь, чтобы создать достойный продукт, и привыкли к самоорганизации команды.
В противном случае вам необходимо осознать масштаб необходимых изменений, обсудить это с коллегами и начать понемногу внедрять описанные принципы, демонстрируя их преимущества по ходу работы. Это поможет подключить остальных к процессу.
При этом внедрению непрерывной интеграции мешают и чисто практические проблемы. Если вы работаете над крупным монолитным приложением, сборка может занимать много времени, а если не хватает тестовых сред, может быть сложно проводить несколько тестов одновременно.
Тщательный контроль процессов непрерывной интеграции и использование метрик для выявления узких мест помогут оценить затраты и преимущества вложений в изменение архитектуры, расширение инфраструктуры и покрытие автоматизированными тестами.
Внедрение непрерывной интеграции позволяет сократить цикл разработки без ущерба для качества кода. Основная задача непрерывной интеграции — снизить возможные риски, связанные с развертыванием ПО, и сократить цикл обратной связи.
Вот основные преимущества непрерывной интеграции:
Непрерывная интеграция, доставка и развертывание позволяют компаниям снизить расходы и существенно сократить цикл доставки программного обеспечения. При правильной реализации они значительно повышают эффективность разработки, тестирования и выпуска ПО. В число лучших практик CI/CD входят:
Выстроить надежный и стабильный CI/CD-пайплайн невозможно без подходящих CI/CD-инструментов. Они помогают согласовать работу разных этапов пайплайна — от начала интеграции до запуска автоматических тестов и развертывания кода в производственную среду. Независимо от того, использует ли ваша команда интегрированный CI/CD-инструмент, поддерживающий все этапы CI/CD-процесса, например TeamCity, или отдельные инструменты для решения разных задач, важно, чтобы инструментарий поддерживал весь комплекс технологий, с которыми работает команда. Кроме того, инструменты должны интегрироваться с другим рабочим ПО и обеспечивать гибкость настройки в независимости от сложности работы.
CI и CD не противоречат друг другу, а представляют собой две части процесса разработки, и, объединив их преимущества, вам будет легче доставлять пользователям ПО, не содержащее ошибок.
Непрерывная интеграция — это процесс слияния изменений кода с основной веткой. В основе непрерывной доставки лежит автоматизация сборки и тестирования, реализованная на этапе непрерывной интеграции. Непрерывное развертывание — последний этап CI/CD-процесса, когда новая версия ПО доставляется пользователям после выполнения всех требований.
Внедрение непрерывной интеграции позволяет ускорить разработку и повысить качество кода. Автоматизация этих шагов помогает работать эффективнее и сосредоточиться на создании функций, которые необходимы пользователям. Однако непрерывная интеграция — лишь первый шаг к реализации CI/CD-пайплайна. За ним следует непрерывная доставка, где принципы DevOps применяются к следующему этапу процесса выпуска ПО.