Что нужно знать о непрерывной интеграции

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

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

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

Разработка без CI

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

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

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

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

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

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

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

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

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

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

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

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

Использование системы контроля версий

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

Регулярные коммиты изменений

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

Автоматизированная сборка и тестирование

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

Быстрое устранение сбоев

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

Поддержка пайплайна

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

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

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

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

Вот что дает CI как отдельным разработчикам, так и командам в целом:

  • Меньше проблем при слиянии изменений: как только вы переходите к коротким циклам работы, число конфликтов слияния сокращается. Ключевую роль здесь играет регулярная синхронизация локального репозитория с изменениями, которые внесли другие разработчики.
  • Более эффективный рабочий процесс: благодаря быстрой обратной связи по результатам автоматической сборки и тестирования вы уже через несколько минут после коммита узнаете об ошибках в коде. Если сборка и тестирование выполнятся вручную, вы можете обнаружить ошибку только через несколько дней или даже недель.
  • Удобство сопровождения кодовой базы: если вы обеспечили покрытие кода автоматическими тестами, это не только гарантирует оптимальную работу CI-пайплайна, но и упрощает понимание и сопровождение кодовой базы.
  • Удобство коммуникации и совместной работы: короткие циклы и регулярные коммиты изменений помогают также видеть, что делают другие. Это дает возможность чаще обсуждать проекты новых функций с коллегами, показывать ход работы менеджерам продуктов и специалистам по удобству использования и при необходимости вносить коррективы.

Непрерывная интеграция удобна и бизнесу в целом:

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

Подробнее о преимуществах непрерывной интеграции, доставки и развертывания читайте в нашем руководстве «12 преимуществ CI/CD».

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

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

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

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

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

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

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

С чего начать внедрение непрерывной интеграции

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

Вот с чего можно начать:

  1. Начните разбивать работу на короткие циклы: если ваш код хранится в системе контроля версий, можно сократить циклы работы и чаще коммитить изменения, тем самым уменьшив число конфликтов слияния. Упростить переход к коротким циклом можно, разбив задачи разработки, связанные с очередью задач.
  2. Договоритесь о стратегии работы с ветками: нужно определить, для каких веток будет запускаться CI-пайплайн и как будут выпускаться изменения. Самые распространенные варианты: магистральная разработка и GitFlow (особенно для ПО с четко определенными версиями).
  3. Добавляйте юнит-тесты по мере написания кода: неважно, есть ли у вас уже юнит-тесты или нет, они должны стать обязательной частью работы команды, чтобы покрытие кода постоянно расширялось. Хоть какие-то автоматизированные тесты всегда лучше, чем никаких. Чтобы начать использовать CI, достаточно небольшого числа автоматических тестов.
  4. Внедряйте автоматизацию постепенно: не нужно писать скрипты сразу для всех этапов CI-пайплайна, лучше сосредоточьтесь на том, что отнимает больше всего времени или дает самую ценную обратную связь. Когда это будет сделано, можно использовать CI-сервер, чтобы соединить готовые этапы в автоматизированный CI-пайплайн.

Подробнее о настройке CI и CD читайте в нашем руководстве по лучшим практикам CI/CD.

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

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

Чем поможет TeamCity

TeamCity — гибкая CI/CD-платформа, которую можно настроить в соответствии со своими нуждами. Она поддерживает все популярные системы контроля версий, включая Git, Perforce, Mercurial и Subversion, а также инструменты сборки и тестирования для основных языков программирования. Большой выбор триггеров CI-пайплайна позволяет запускать процесс сборки и тестирования после каждого коммита в выбранную ветку, выполнять определенный набор проверок для веток функций, планировать сборку на ночное время, а также предоставить членам команды право выполнять проверки в рамках CI локально.

Чтобы вы как можно скорее получали обратную связь, TeamCity может выполнять тесты и другие задачи параллельно. Интеграция со Slack и IDE позволяет получать обратную связь, где бы вы ни работали, а подробные отчеты о тестировании помогают быстро найти причину сбоя. Кроме того, TeamCity предлагает много метрик, чтобы вы могли оптимизировать CI-пайплайн и оценить покрытие кода юнит-тестами.

Если вы захотите расширить автоматизацию и добавить к CI-пайплайну непрерывную доставку или развертывание, в TeamCity есть все необходимые инструменты для управления средами и автоматизации развертывания.