Эволюция разработки. Continuous Integration, Continuous Delivery

Старая модель разработки ПО

Это еще до появления CI/CD и т.п.

Один такой процесс называют итерацией.

Главные недостатки:

  • Ручная интеграция
  • Поздние обнаружения проблем
  • Проблемы слияния кода
  • Длительные циклы обратной связи
  • Длинные итерации медленный вывод бизнеса на рынок

Continuous Integration

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

Основные принципы достижения непрерывной интеграции
  • Единый центральный репозиторий
  • Запуск сборки после пуша
  • Автоматизация сборки
  • Скорость сборки
  • Компиляция и автоматические тесты
  • Исправления кода в приоритетном порядке
  • Совместная работа
  • Уведомления в месседжеры
Главные плюсы CI
  • Ускоряет процесс производства ПО
  • Избавляет от человеческих ошибок
  • Позволяет распараллелить процессы
  • Проверка на дефекты происходит на несколько шагов раньше
  • Удешевляет исправление дефектов

Единый центральный репозиторий

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

Для достижения же CI все разрабы должны юзать один общий репозиторий в течении всей итерации.

Так снимается ответственность за слияние кода и его интеграцию с команды сборки и интеграции (Build & Integration Team), и эта ответственность распространяется среди всех разрабов.
В целом так проще, ибо интеграциями будут заниматься разрабы, которые лучше всех знают свой код им проще, чем отдельной команде, которой придется сначала разбираться, что делать, а уже потом делать.
Команда сборки и интеграции не нужна больше - вместо нее будет Build & Integration Server:

Сервер сборки и интеграции

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

Каждый раз, когда разработчик проверяет какой-либо код, он должен быть скомпилирован на сервере сборки и интеграции, а весь процесс сборки должен запускаться автоматически, когда любой разработчик делает какую-либо фиксацию (коммит).
Таким образом, процесс сборки будет централизован и автоматизирован, происходя на выделенном сервере сборки:

Все разрабы должны иметь доступ результатам сборки, чтобы быть в состоянии проверить правильность сборки их кода. После каждого билда результаты (артефакты) будут автоматически размещаться на сборочном сервере и все члены команды будут иметь доступ к этим артефактам. А при ошибке во время сборки разраб (сделавший коммит, который и вызвал ошибку) сразу получит уведомление (по почте/в slack и т.п.).

Автоматические тесты

Кроме компиляции кода, сборка должна иметь и автоматизированные тесты, которые будут работать с последней версией кода.

Тесты могут быть комбинацией:

  • автоматических модульных тестов (Automated Unit testing)
    чтобы проверить, дает ли код ожидаемые результаты

  • автоматических интеграционных тестов (Automated Integration testing)
    для проверки правильной работы интеграции

  • автоматических функциональных тестов (Automated Functional testing)
    для проверки работы функциональности, необходимой бизнесу

  • автотестов пользовательского интерфейса (Automated UI testing)
    чтобы проверить, отвечает ли, например, интерфейс веб-приложения должным образом

Для UI тестов укапованный код нужно запустить во временной локальной среде.

Скорость сборки

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

Здесь уже пропадает нужда в команде тестировщиков и получается такая схема:

Минусы старого подхода и плюсы CI

Старая подход разработкиContinuous Integration
Проблемы проявляются поздноПроблемы быстро находятся и исправляются
Работа разработчиков блокируется дефектамиДефекты исправляются сразу, нет задержек
Длинный цикл обратной связиАвтотесты. Короткий цикл обратной связи

Pipeline

При внедрении CI реализуется концепция конвейера сборки и интеграции - Integration Build Pipeline:

Все шаги в этом конвейере могут выполняться паралельно.


Continuous Delivery

CI - это лишь половина жизненного цикла разработки ПО, вторая половина - эксплуатация.

Старая модель эксплуатации (operation)


Operations Team в этой модели получает инструкции по деплою в тестовую среду от разрабов; если QA Team подтверждает работоспособность развернутого ПО в тестовой среде, сертифицирует выпуск ПО и сообщает первой команде (Ops), чтобы те подготовили производственную среду (Prod) и задеплоили релиз согласно инструкции.

Минусы такого подхода
  • Правильность инструкций не гарантирована
    Ответственность за это лежит на разрабах, которые могут, к примеру, очевидные для себя вещи не указать в инструкции к деплою.
  • Разница в инструкциях для разных сред
  • Человеческий фактор
    Речь идет о ручном деплое
  • Простои (downtimes)

Continuous Delivery

Непрерывная доставка (CD) - практика разработки ПО, при которой ПО может быть запущено в производство (prod) в любое время; ибо необходимо всегда иметь возможность задеплоить в production-среду
Важным условием для CD является CI.

Конвейер выпуска (Release Pipeline):

В CD pipeline всё еще остался ручной этап - тестирование ПО в тестовой среде командой QA. Но это не нарушает концепцию CD, ибо, по-прежнему, ПО может быть задеплоено в prod в любое время, хоть и вручную (ибо деплой в прод еще согласовать нужно, например).

Конвейер сборки/интеграции и конвейер выпуска:

Плюсы CD / Какие проблемы решает CD
  • Автоматизированные сценарии, которые тоже можно тестировать
  • Скрипты выполняют необходимые шаги для окружения
  • Снижение влияния человеческого фактора
  • Быстрый выпуск продукта на рынок

Continuous Deployment

Continuous Deployment (непрерывное развертывание) - практика разработки ПО, в которой код постоянно и непрерывно автоматически деплоится в прод. Достигается засчет автоматических приемных тестов вместо QA Team.
В этом случае нет этапа с ручным одобрением - всё выполняется автоматически: от коммита до деплоя в прод (хоть и, в этом случае, к коммитам и слияниям в релиз ветку обычно имеют доступ не все разрабы).

Компания должна быть готова к такому подходу (если стоит задача применить такой подход в компании): должны быть настроены внутренние процессы, чтобы можно было уверенно сказать, что код, пришедший от разраба, достаточно покрыт тестами и прошел тщательное code review.
К слову, такие компании как Meta, Netflix, Twitter деплоятся в прод каждые 30 минут, то есть примерно 50 раз в день.

Просто оставлю это здесь…

400


devopsCD