Непрерывная интеграция, доставка и развертывание

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

Непрерывная интеграция, доставка и развертывание

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

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

Основные различия между CI и CD

Давайте сначала разберем основные особенности CI и CD и различия между ними.

Непрерывная интеграция (CI)

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

Непрерывная доставка и непрерывное развертывание (CD)

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

Как и в случае с CI, если на каком-то этапе CD возникает ошибка, процесс останавливается, и разработчики получают информацию для анализа и исправления. Когда готова новая сборка, процесс повторяется с самого начала и проходит все этапы CI, а затем переходит в фазу CD.

Доставка и развертывание: в чем разница?

Непрерывная доставка и непрерывное развертывание отличаются на последнем этапе — выпуске в продакшен.

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

Как выбрать между доставкой и развертыванием

Выбор между непрерывной доставкой и развертыванием зависит от вашего проекта.

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

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

С другой стороны, непрерывное развертывание отлично подходит для веб-приложений и сервисов, где частые обновления — ежедневно или даже каждый час — обычная практика.

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

Важно, что в процесс непрерывного развертывания можно интегрировать ручное тестирование.

Вместо выполнения проверок вручную перед каждым релизом можно время от времени развертывать изменения в тестовом окружении и проводить эти тесты раз в неделю или даже реже.

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

различия между непрерывной интеграцией, доставкой и развертыванием

Как непрерывная интеграция, доставка и развертывание работают вместе

CI/CD — это две больших фазы процесса сборки, тестирования и выпуска ПО.

CI/CD пайплайн — это инструмент, который постепенно повышает вашу уверенность в качестве кода.

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

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

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

Автоматизировав максимум этапов CD, вы дополнительно сократите цикл обратной связи и сделаете рабочий процесс эффективнее. Помимо автоматизации тестов, можно, например, автоматически создавать препродакшн-окружения и развертывать там сборки.

Переход от CI к CD

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

И CI, и CD состоят из множества этапов, так что вы можете развивать свои процессы постепенно.

С чего начать

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

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

Это также помогает сформировать культуру автоматизированного тестирования, что важно для успешного CI/CD и дальнейшего расширения покрытия кода тестами.

Если вы занимаетесь и разработкой, и координацией релизов, то автоматизация финальной стадии CD (выпуска в продакшн) может сэкономить вам много времени.

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

Как улучшить процесс

CI и CD работают лучше всего, если разбивать задачи разработки на мелкие части и регулярно делать коммиты.

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

Выводы

Подведем итоги:

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