Непрерывная интеграция (continuous integration, CI) — это практика, при которой код автоматически собирается и тестируется после каждого слияния изменений.
Непрерывная интеграция (CI) — DevOps-практика, которая помогает командам работать эффективнее и выпускать более качественное ПО. При каждом слиянии изменений CI-сервер автоматически собирает и тестирует код, быстро предоставляя обратную связь. Быстрый и надежный цикл обратной связи позволяет чаще выпускать обновления и уменьшает количество багов, попадающих в продакшн.
Чтобы понять, зачем нужна непрерывная интеграция, полезно представить, как выглядит разработка без нее. Допустим, вы работаете с системой контроля версий, например, с Git. У вас и у каждого из ваших коллег есть своя копия репозитория, которую вы используете для локальной разработки, а затем вы загружаете написанный код в общий репозиторий.
Если вы разрабатываете новую функцию, то можете работать над ней несколько дней, прежде чем поделитесь изменениями. За это время ваши коллеги тоже создадут новые функции в своих копиях репозитория. Когда вы закончите, все отправляют изменения в общий репозиторий и начинают объединять их в отдельную ветку, чтобы протестировать, как каждая функция работает в сочетании с остальными.
Из-за того, что изменения делают несколько человек, есть риск, что код не будет собираться. Вы с коллегами потратите много времени на поиск изменений, из-за которых возникли проблемы, чтобы либо окатить эти коммиты и поскорее выпустить более срочные изменения, либо исправить код и устранить проблемы.
Когда код удастся собрать, вы можете обнаружить, что из-за объединения разных изменений возникло множество багов. И снова вам придется анализировать все изменения кода от каждого участника, чтобы найти причины ошибок, исправить их и заново начинать сборку.
Непрерывная интеграция ускоряет этот процесс: сборка и тестирование выполняются автоматически при каждом слиянии изменений с указанной веткой. После автоматизации этих этапов вы сможете выполнять их чаще: вместо сборки и тестирования кода раз в несколько недель можно делать это каждые несколько часов.
Работая с небольшими изменениями, вы будете быстрее находить и устранять ошибки, которые могут возникнуть из-за ваших правок. Вместо просмотра сотен и тысяч строк кода в поисках причины проблемы вам нужно проверить лишь небольшой объем изменений. К тому же, эти изменения свежи в вашей памяти, и не нужно тратить время на переключение между задачами.
CI помогает поддерживать код в рабочем состоянии, проверяя, что программа собирается и работает как нужно после каждого изменения. Это упрощает релизы и позволяет чаще выпускать новые функции и исправления.
Хотя непрерывная интеграция была придумана для решения проблем, возникающих на больших проектах со множеством участников, ее можно использовать в процессе разработки любого ПО. Даже если вы соло-разработчик, короткие циклы разработки с использованием автоматических тестов для оперативной проверки изменений позволяют работать эффективнее и писать более качественный код.
Чтобы CI-пайплайн работал эффективно, необходимо сочетание правильных инструментов, процессов и командных правил. Рассмотрим каждую из этих составляющих.
Для внедрения непрерывной интеграции вся кодовая база должна храниться в системе контроля версий. Это касается всех файлов исходного кода, библиотек, файлов конфигурации и скриптов. Если вы используете систему контроля версий, гораздо проще организовать работу нескольких разработчиков параллельно и дать им возможность делиться друг с другом изменениями в коде. Серверы CI интегрируются с системами контроля версий для сборки и тестирования изменений.
Чтобы все участники проекта работали с одинаковым кодом, они должны использовать один репозиторий и часто публиковать свои изменения. Практика показывает, что каждый участник должен отправлять изменения в CI-ветку общего репозитория не реже раза в день, а можно и чаще. В то же время нужно поддерживать синхронизацию локальной копии с общим репозиторием, чтобы снизить риск конфликтов слияния при каждом коммите.
Следующий шаг после слияния изменений — сборка решения и проведение автоматизированных проверок: линтинга, юнит-тестирования и статического анализа. Сборка и/или тестирование вручную занимает много времени, при этом велика возможность ошибок, так что ежедневно интегрировать изменения будет неудобно. Именно поэтому так важна автоматизация. Инструменты сборки и фреймворки автоматического тестирования доступны для всех основных языков программирования, а с помощью CI-сервера можно автоматически запускать процесс и управлять всеми шагами.
Чтобы непрерывная интеграция приносила максимум пользы, каждый участник проекта должен быстро реагировать на ошибки при сборке или тестировании. Это гарантирует, что все участвуют в создании надежной базы, не пытаясь добавить новые функции к неработающему коду. На первый взгляд кажется, что вы требуете от участников команды прерывать работу, чтобы исправлять ошибки, найденные при тестировании. Однако автоматический CI-пайплайн выдает результат за считаные минуты, так что любые проблемы легко устранить, пока вы еще четко помните, в чем суть внесенных изменений.
После автоматизации сборки и тестов нужно обеспечить поддержку CI-пайплайна: добавлять юнит-тесты по мере появления нового кода и поддерживать скорость циклов обратной связи.
Если вы добавите <>сервер непрерывной интеграции, который осуществляет мониторинг репозитория, запускает сборку, выполняет автоматизированные тесты и создает отчет о результатах, это поможет собрать вместе все фрагменты и сэкономит время на написание собственной логики автоматизации. Кроме того, правильно настроенный CI-сервер может давать дополнительную информацию, например, метрики покрытия кода и историю сборок.
Разобравшись в том, какие преимущества дает непрерывная интеграция, вам будет проще убедить других членов команды попробовать новый подход к работе, а всех заинтересованных лиц — поддержать новые процессы.
Вот что дает CI как отдельным разработчикам, так и командам в целом:
Непрерывная интеграция удобна и бизнесу в целом:
Подробнее о преимуществах непрерывной интеграции, доставки и развертывания читайте в нашем руководстве «12 преимуществ CI/CD».
Непрерывная интеграция дает преимущества и самим разработчикам, и компании в целом, но не все ее охотно принимают.
Для многих команд разработки DevOps означает большие изменения в подходе к работе, что требует пересмотра существующих процессов. Чтобы координировать усилия разных команд и добиться подлинного сотрудничества, необходима своевременная коммуникация.
Если вы уже используете Agile-методологию, вам будет легче приспособиться, поскольку вы уже понимаете, насколько важно постоянно получать обратную связь, и привыкли к самоорганизации команды.
В противном случае вам необходимо осознать масштаб необходимых изменений при внедрении CI, обсудить это с коллегами и начать понемногу использовать описанные принципы, демонстрируя их преимущества по ходу работы.
При этом внедрению непрерывной интеграции мешают и чисто практические проблемы. Время сборки может быть большим, если вы работаете над крупным монолитным приложением, а запускать тесты параллельно бывает сложно, если не хватает ресурсов для тестовых сред.
Визуализация процессов непрерывной интеграции и использование метрик для выявления узких мест помогут оценить затраты и преимущества вложений в изменение архитектуры, расширение инфраструктуры и покрытие автоматизированными тестами.
Настройка CI-пайплайна может показаться очень трудозатратной. О многом нужно подумать, множество вещей автоматизировать. К счастью, этот процесс легко разбить на небольшие этапы, и каждый из них даст новые преимущества.
Вот с чего можно начать:
Подробнее о настройке CI и CD читайте в нашем руководстве по лучшим практикам CI/CD.
Внедрение непрерывной интеграции позволяет ускорить разработку и повысить качество кода. Автоматизация этих шагов помогает работать эффективнее и сосредоточиться на создании функций, которые необходимы пользователям. Однако непрерывная интеграция — лишь первый шаг к реализации CI/CD-пайплайна. За ним следует непрерывная доставка, где принципы DevOps применяются к следующему этапу процесса выпуска ПО.
TeamCity — гибкая CI/CD-платформа, которую можно настроить в соответствии со своими нуждами. Она поддерживает все популярные системы контроля версий, включая Git, Perforce, Mercurial и Subversion, а также инструменты сборки и тестирования для основных языков программирования. Большой выбор триггеров CI-пайплайна позволяет запускать процесс сборки и тестирования после каждого коммита в выбранную ветку, выполнять определенный набор проверок для веток функций, планировать сборку на ночное время, а также предоставить членам команды право выполнять проверки в рамках CI локально.
Чтобы вы как можно скорее получали обратную связь, TeamCity может выполнять тесты и другие задачи параллельно. Интеграция со Slack и IDE позволяет получать обратную связь, где бы вы ни работали, а подробные отчеты о тестировании помогают быстро найти причину сбоя. Кроме того, TeamCity предлагает много метрик, чтобы вы могли оптимизировать CI-пайплайн и оценить покрытие кода юнит-тестами.
Если вы захотите расширить автоматизацию и добавить к CI-пайплайну непрерывную доставку или развертывание, в TeamCity есть все необходимые инструменты для управления средами и автоматизации развертывания.