Разработчики часто используют аббревиатуру CI/CD для обозначения непрерывной интеграции (CI) и непрерывной доставки или развертывания (CD). Разобравшись, чем отличаются эти DevOps-практики, вам будет проще организовать CI/CD-процесс в своей команде и добиться повышения качества и стабильности вашего ПО.
Непрерывная интеграция и непрерывная доставка (или развертывание) — ключевые этапы процесса сборки, тестирования и развертывания ПО. Их основная цель — регулярно доставлять пользователям небольшие обновления, обеспечивая разработчиков обратной связью. Оба процесса основаны на автоматизации, что делает их эффективнее и надежнее.
Прежде чем приступать к созданию CI/CD-процесса, важно понимать, чем отличаются непрерывная доставка, непрерывное развертывание и непрерывная интеграция.
Давайте сначала разберем основные особенности CI и CD и различия между ними.
Непрерывная интеграция (CI) — это метод автоматической проверки изменений в коде, который помогает быстро получать обратную связь. При каждом коммите изменений CI-сервер выполняет сборку и автоматические тесты. Обычно они включают в себя юнит-тесты, интеграционные тесты и другие проверки, например линтинг или статический анализ. Если на любом этапе возникает ошибка, вы получаете уведомление и можете ее исправить. После внесения исправлений процесс начинается заново.
Непрерывная доставка и развертывание (CD) продолжают процесс там, где заканчивается непрерывная интеграция. В обоих случаях артефакт сборки разворачивается в одном или нескольких тестовых окружениях для проведения дальнейшего автоматизированного тестирования: сквозных тестов, тестов интерфейса, производительности и безопасности. Сборка считается готовой к релизу только после успешного прохождения всех этих проверок.
Как и в случае с CI, если на каком-то этапе CD возникает ошибка, процесс останавливается, и разработчики получают информацию для анализа и исправления. Когда готова новая сборка, процесс повторяется с самого начала и проходит все этапы CI, а затем переходит в фазу CD.
Непрерывная доставка и непрерывное развертывание отличаются на последнем этапе — выпуске в продакшен.
При непрерывной доставке выпуск сборки в продакшен требует ручного вмешательства. Сам процесс релиза обычно автоматизирован, но решение о том, когда именно выпускать сборку, принимает человек. В отличие от этого, при непрерывном развертывании сборка автоматически отправляется в продакшен каждый раз, когда успешно завершены все предыдущие этапы процесса.
Выбор между непрерывной доставкой и развертыванием зависит от вашего проекта.
Например, для мобильных приложений или API не всегда целесообразно выпускать обновления при каждом коммите. Лучше делать релизы по графику или когда наберется какой-то объем изменений.
В этом случае лучше использовать непрерывную доставку, которая позволит тестировать изменения перед их выпуском. Кроме того, непрерывная доставка дает возможность вручную подтверждать результаты тестирования перед каждым релизом.
С другой стороны, непрерывное развертывание отлично подходит для веб-приложений и сервисов, где частые обновления — ежедневно или даже каждый час — обычная практика.
Оно позволяет постоянно вносить небольшие изменения и быстро получать обратную связь. Можно также использовать непрерывное развертывание для проведения экспериментов и проверки гипотез с участием реальных пользователей, зная, что в случае необходимости можно быстро изменить направление с новым релизом.
Важно, что в процесс непрерывного развертывания можно интегрировать ручное тестирование.
Вместо выполнения проверок вручную перед каждым релизом можно время от времени развертывать изменения в тестовом окружении и проводить эти тесты раз в неделю или даже реже.
При этом любые изменения, успешно прошедшие все автоматические проверки, по-прежнему будут выпускаться в продакшн. Если при ручном тестировании вы обнаружите ошибку, автоматизированный пайплайн поможет быстро добавить в производственную среду необходимое исправление.
CI/CD — это две больших фазы процесса сборки, тестирования и выпуска ПО.
CI/CD пайплайн — это инструмент, который постепенно повышает вашу уверенность в качестве кода.
Успешно проходя все этапы, вы постепенно добиваетесь того качества кода, которое вас устроит. Если на каком-то этапе возникает ошибка, сборка останавливается, и нужно либо исправить проблему, либо откатить изменения. После этого процесс начинается заново.
CI (непрерывная интеграция) — первая фаза процесса сборки, тестирования и выпуска ПО. Ее задача — проверки и быстрая обратная связь. Оперативные результаты тестов помогают работать более эффективно, снижая необходимость переключаться между задачами. Вам не нужно часами или сутками ждать результатов ручного тестирования: если из-за внесенных изменений в коде возникнут ошибки, вы уже через пару минут получите автоматическое уведомление.
Если сборка с изменениями успешно проходит CI, ее можно безопасно развернуть в тестовом окружении. В этот момент вы можете перейти к выполнению более долгих и ресурсоемких тестов.
Автоматизировав максимум этапов CD, вы дополнительно сократите цикл обратной связи и сделаете рабочий процесс эффективнее. Помимо автоматизации тестов, можно, например, автоматически создавать препродакшн-окружения и развертывать там сборки.
Если вы новичок в CI/CD, не обязательно сразу выбирать между непрерывной интеграцией и непрерывной доставкой или развертыванием. Лучше подумайте, с чего вы хотите начать и как далеко планируете продвинуться.
И CI, и CD состоят из множества этапов, так что вы можете развивать свои процессы постепенно.
Если вы уже автоматизировали часть процессов сборки или релиза или написали автоматизированные тесты, это вполне может стать отправной точкой. Если нет, попробуйте понять, какие этапы процесса сборки, тестирования и релиза отнимают больше всего времени или где в продакшене возникает больше всего ошибок из-за недостаточного тестирования.
Многие команды начинают с непрерывной интеграции, так как она требует меньше согласований с другими отделами, а быстрая обратная связь от автоматизированных тестов помогает улучшить качество кода.
Это также помогает сформировать культуру автоматизированного тестирования, что важно для успешного CI/CD и дальнейшего расширения покрытия кода тестами.
Если вы занимаетесь и разработкой, и координацией релизов, то автоматизация финальной стадии CD (выпуска в продакшн) может сэкономить вам много времени.
CI создает надежную основу для CD, а выбор между непрерывной интеграцией и непрерывным развертыванием зависит от ваших потребностей. Даже если цель — непрерывное развертывание, многие начинают с непрерывной доставки. Когда вы наладите рабочие процессы и будете в них уверены, можно автоматизировать финальный релиз в продакшн.
CI и CD работают лучше всего, если разбивать задачи разработки на мелкие части и регулярно делать коммиты.
Если вы хотите внедрить непрерывное развертывание, нужно подумать, как управлять функциями, которые еще не готовы к релизу, хотя для них уже есть изменения в коде. Для этого можно использовать фич-флаги или настроить такую стратегию работы с ветками, где релизная ветка строго отделена от тех, которые находятся в работе, при этом все равно автоматически выполняется сборка и тестирование всех изменений в коде.
Подведем итоги: