Давайте быстро создадим простой конвейер CI / CD

Недавно мы создали высокодоступное приложение, которое показывает тщательно отобранные виды домашней птицы. Он использовал балансировщик нагрузки и AWS Autoscaling Groups. Система использовала Cloud Formation и выстраивала все зависимости и загружала приложения после создания нового экземпляра.

Теперь возникает новая проблема: «как мы можем развернуть новую версию нашего приложения на нескольких экземплярах?». Их количество постоянно меняется в зависимости от получаемого веб-трафика, поэтому развертывание вручную невозможно. Ответом могут быть сервисы под названием Code Deploy и Code Pipeline. Мы создадим образец конфигурации, который будет распространять и устанавливать предоставленную версию нашего программного обеспечения на все экземпляры. Более того, мы создадим на AWS целый конвейер непрерывной доставки, чтобы еще больше автоматизировать этот процесс.

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

Начнем с создания нашего приложения:

sh manage.sh create CF_STACK_NAME EC2_ACCESS_KEY_NAME

На настройку уйдет несколько минут. Мы добавили крошечный скрипт в наш репозиторий под названием buildspec.yml. Мы будем использовать соглашение об именах службы под названием Code Build. Он расскажет сервисам AWS, как создавать и запускать тесты в нашем приложении. Он создаст временный контейнер, который будет использоваться для клонирования исходного кода, установки зависимостей и запуска тестов. Если все пойдет гладко, приступим к развертыванию.

Мы можем создать собственное окружение и установить все пакеты вручную или использовать некоторые из образов, предоставленных AWS. Есть образ Docker для PHP 7.3, который нам отлично подойдет.

Мы начнем с создания проекта Code Build, затем добавим конфигурацию Code Deploy и объединим все это вместе с Code Pipeline. Мы будем использовать AWS CLI и пройдемся по каждому этапу процесса.

Нам нужно указать имя проекта и URL-адрес репозитория git. Мы также будем работать над Ubuntu как операционной системой. Все остальное можно оставить по умолчанию. Вот и все. Теперь мы можем запускать тесты нашего приложения в изолированном контейнере Docker, когда захотим, одним щелчком мыши.

Развертывание будет немного сложнее настроить. Нам нужно создать группу приложений и развертывания.

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

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

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

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

Давайте посмотрим правде в глаза. Это было очень легко, но очень полезно. Мы можем получить решение CI / CD практически в кратчайшие сроки и с очень элементарными навыками. На мой взгляд, это большое преимущество облачных и управляемых решений. У нас могут быть отличные масштабируемые вспомогательные решения без особых усилий и сосредоточиться на нашей основной области.

Полный исходный код доступен здесь:



Ресурсы: