Deployment
Deployment (от англ. deployment — развёртывание, размещение) — это процесс доставки, установки, настройки и активации программного обеспечения (ПО) на целевых вычислительных системах (серверах, рабочих станциях, мобильных устройствах, встраиваемых системах) с целью перевода его в состояние промышленной эксплуатации. В более широком смысле термин охватывает всю совокупность операций, связанных с подготовкой окружения, управлением версиями, конфигурированием и мониторингом развёрнутого приложения.
История
До начала 2000-х годов развёртывание ПО было преимущественно ручным процессом. Администраторы вручную копировали файлы на серверы, настраивали параметры в конфигурационных файлах и перезапускали службы. Такой подход был медленным, подверженным ошибкам («человеческий фактор») и не масштабировался для сложных распределённых систем.
С развитием интернет-сервисов и облачных вычислений возникла необходимость в автоматизации. Появились инструменты управления конфигурациями (Puppet, Chef, Ansible, SaltStack), которые позволяли описывать желаемое состояние системы в виде кода (Infrastructure as Code, IaC). Параллельно развивались контейнерные технологии (Docker, Kubernetes), которые упростили упаковку приложений и их перенос между средами.
В 2010-х годах сформировалась практика непрерывного развёртывания (Continuous Deployment, CD), при которой каждое изменение кода, прошедшее автоматические тесты, немедленно выкатывается в production. Это стало частью DevOps-культуры.
Цели и задачи
Основные цели deployment:
- Доставка новой функциональности пользователям с минимальной задержкой.
- Обеспечение стабильности — развёрнутая система должна работать без сбоев и потерь данных.
- Воспроизводимость — процесс развёртывания должен давать одинаковый результат на разных средах (разработка, тестирование, production).
- Безопасность — защита от несанкционированного доступа и утечек данных в процессе развёртывания.
- Откат (rollback) — возможность быстро вернуться к предыдущей рабочей версии в случае ошибки.
Классификация видов deployment
По способу доставки
- Ручной deployment — все операции выполняются человеком через консоль или интерфейс управления. Применяется для небольших проектов или в экстренных ситуациях.
- Автоматизированный deployment — процесс запускается по команде (например, нажатием кнопки в CI/CD-системе), но отдельные шаги могут требовать подтверждения.
- Непрерывный deployment (Continuous Deployment) — каждое изменение кода, прошедшее все стадии автоматической проверки, автоматически выкатывается в production без участия человека.
По стратегии выкатки
- Blue-Green deployment — одновременно поддерживаются две идентичные среды (blue — текущая, green — новая). Трафик мгновенно переключается с blue на green после проверки. Позволяет быстро откатиться.
- Canary deployment — новая версия постепенно выкатывается на небольшую часть пользователей (например, 5%), затем, при отсутствии проблем, распространяется на всех. Минимизирует влияние потенциальных ошибок.
- Rolling deployment — обновление выполняется поэтапно, заменяя старые экземпляры новыми без остановки всего сервиса. Часто используется в Kubernetes.
- A/B deployment — две версии работают параллельно, но трафик распределяется по определённым критериям (география, тип устройства, случайная выборка) для сравнения поведения.
- Recreate — все старые экземпляры останавливаются, затем запускаются новые. Простой сервиса неизбежен, но процесс прост и предсказуем.
По типу окружения
- Development — среда разработчика, часто нестабильная, с включённым отладочным режимом.
- Staging — среда, максимально приближенная к production, используется для финального тестирования.
- Production — среда, в которой приложение работает с реальными пользователями и данными.
- Disaster Recovery — резервная среда, активируемая при отказе основной.
Процесс deployment
Типовой пайплайн (конвейер) развёртывания включает следующие этапы:
- Сборка (build) — компиляция исходного кода, создание исполняемого артефакта (бинарного файла, Docker-образа, пакета).
- Тестирование — автоматические юнит-тесты, интеграционные тесты, тесты безопасности.
- Упаковка — формирование релизного пакета (архив, контейнер, Helm-чарт).
- Развёртывание на staging — проверка в окружении, аналогичном production.
- Приёмочные испытания — smoke-тесты, нагрузочное тестирование, проверка совместимости.
- Развёртывание на production — выполняется по выбранной стратегии (blue-green, canary и т.д.).
- Мониторинг и валидация — отслеживание метрик (ошибки, время отклика, загрузка CPU), алертинг, логирование.
- Откат при необходимости — автоматический или ручной возврат к предыдущей стабильной версии.
Инструменты
Системы управления конфигурациями
- Ansible (Red Hat) — агентный, использует YAML-плейбуки, работает по SSH.
- Puppet — использует декларативный язык, требует агента на целевых узлах.
- Chef — основан на Ruby, использует «рецепты» и «кукбуки».
- SaltStack — гибридный подход, поддерживает как push, так и pull.
Контейнеризация и оркестрация
- Docker — упаковка приложения и его зависимостей в контейнер.
- Kubernetes — оркестратор контейнеров, управляет развёртыванием, масштабированием, сетевым взаимодействием.
- Docker Compose — для локального развёртывания многоконтейнерных приложений.
CI/CD-системы
- Jenkins — старейшая и наиболее распространённая система с открытым исходным кодом.
- GitLab CI/CD — встроенная в GitLab платформа.
- GitHub Actions — встроенная в GitHub система.
- CircleCI, Travis CI, TeamCity — коммерческие и open-source решения.
Инструменты для управления версиями и артефактами
- Git — система контроля версий.
- Nexus, Artifactory — репозитории для хранения артефактов (jar, Docker-образы, npm-пакеты).
Проблемы и риски
- Downtime — простой сервиса во время развёртывания, особенно при стратегии recreate.
- Несовместимость — новая версия может не работать с текущей версией базы данных или другими микросервисами.
- Конфигурационные ошибки — неверные параметры окружения (переменные, ключи API, URL).
- Утечка данных — при неправильной настройке доступа или логов.
- Человеческий фактор — случайное удаление важных данных, неверная команда.
- Сложность отката — если новая версия изменила схему базы данных, откат может быть затруднён.
Практики и методологии
- Infrastructure as Code (IaC) — описание инфраструктуры (серверы, сети, балансировщики) в виде кода, который хранится в Git и проходит ревью.
- Immutable infrastructure — серверы не обновляются, а заменяются новыми образами. Это исключает дрейф конфигураций.
- Feature flags — включение/выключение функциональности без переразвёртывания, что позволяет тестировать новые возможности на ограниченной аудитории.
- Chaos engineering — преднамеренное внесение сбоев для проверки устойчивости системы к отказам во время развёртывания.
Применение в различных отраслях
- Веб-сервисы — развёртывание фронтенда и бэкенда на облачных платформах (AWS, Azure, Яндекс.Облако).
- Мобильные приложения — публикация в магазинах приложений (App Store, Google Play) через сторы, часто с поэтапным rollout (staged rollout).
- Встраиваемые системы — прошивка устройств (IoT, автомобили, медицинское оборудование) через OTA (over-the-air) обновления.
- Корпоративное ПО — развёртывание ERP-систем, CRM, баз данных на внутренних серверах компании.
Источники
- Humble, J., Farley, D. «Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation» (2010).
- Kim, G., Humble, J., Debois, P., Willis, J. «The DevOps Handbook» (2016).
- Документация Kubernetes (kubernetes.io/docs/concepts/workloads/controllers/deployment/).
- Документация Ansible (docs.ansible.com).
- Статья «Deployment strategies» на MartinFowler.com (2014).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →