Разработка · инфраструктура

DevOps: сборка, деплой, контейнеры

Выкатка новой версии перестаёт быть событием: сборка и тесты идут сами, деплой делается кнопкой, откат занимает минуту.

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

Второй признак - фраза "у меня локально работает". Версии библиотек на машине разработчика, на тестовом стенде и на бою разошлись, и никто не знает, где именно. Ошибка воспроизводится только у одного человека, и на её поиск уходит день.

Всё это лечится не героизмом, а конвейером. Каждое изменение собирается автоматически, прогоняется тестами и попадает на стенд одинаковым способом. Человек нажимает кнопку, а не вспоминает последовательность действий.

Мерило зрелости простое: сколько минут занимает откат неудачного релиза и знает ли порядок действий кто-то кроме одного человека.

Что настраиваем

  • Сборка на каждое изменение: код собирается автоматически, сломанная ветка видна сразу, а не в день релиза.
  • Автотесты в конвейере: не проходят - изменения не уезжают дальше.
  • Контейнеры: одинаковое окружение на машине разработчика, на стенде и на бою.
  • Отдельные окружения: разработка, стенд для проверки, боевой контур. Данные и доступы разведены.
  • Деплой по кнопке с журналом: видно, кто и что выкатил, и когда.
  • Откат на предыдущую версию за минуту, без ручной пересборки.
  • Хранение секретов отдельно от кода: пароли и ключи не лежат в репозитории.
  • Мониторинг и логи в одном месте: после выкатки понятно, стало хуже или нет.

Как заходим в проект

  1. Смотрим, как выкатывается сейчасПросим показать релиз как есть, руками. За полчаса становится видно всё: где ручные шаги, где секреты в открытом виде, где отката нет вовсе.
  2. Собираем в контейнерыПриложение и его зависимости упаковываются так, что запускаются одинаково везде. Обычно на этом шаге всплывают неявные настройки, о которых знал только сервер.
  3. Строим конвейерСборка, тесты, публикация образа, деплой на стенд. Сначала на тестовом контуре - боевой не трогаем, пока конвейер не отработает несколько раз подряд.
  4. Разводим окруженияСтенд перестаёт ходить в боевую базу, боевые ключи исчезают с машин разработчиков, права раздаются по ролям.
  5. Подключаем боевой деплой и откатВыкатка кнопкой, откат кнопкой, журнал изменений. Первые релизы проводим вместе с вашей командой.
  6. ПередаёмДокументация, разбор конвейера с разработчиками, порядок действий при сбое сборки. Дальше команда живёт с этим сама.
Кому это не нужно и что придётся содержать

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

Конвейер - тоже система, и у неё есть стоимость содержания: сервер под сборки, место под образы, время на обновление конфигураций при смене стека. Обычно это несколько часов в месяц.

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

  1. Сборка и тесты идут на каждое изменение, а не перед релизом.
  2. Одинаковое окружение везде - фраза "у меня работает" теряет смысл.
  3. Откат становится минутным действием, а не ночной операцией.
  4. Конвейер остаётся вашим: он описан кодом и работает без нас.

Три уровня зрелости

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

Сборка и тесты

Первый шаг для команды, которая всё делает руками.

от 60 000 ₽

Разово, одна-две недели на один сервис.

  • Автоматическая сборка на каждое изменение
  • Запуск существующих тестов в конвейере
  • Упаковка в контейнер
  • Публикация образов в реестр
  • Инструкция для команды

Подойдёт одному сервису и небольшой команде. Деплой на бой остаётся ручным.

Чаще всего берут

Полный цикл

Для команды, которая выкатывает регулярно и хочет перестать этого бояться.

от 180 000 ₽

Разово, три-пять недель. Зависит от числа сервисов.

  • Всё из варианта "Сборка и тесты"
  • Окружения: разработка, стенд, бой
  • Деплой по кнопке и откат за минуту
  • Хранение секретов отдельно от кода
  • Мониторинг и сбор логов
  • Первые релизы вместе с вашей командой

Основной вариант для продуктовой команды от трёх разработчиков. Избыточен, если релиз бывает раз в квартал.

Инфраструктура кодом

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

от 400 000 ₽

Разово, от полутора месяцев. Дальше - сопровождение по договору.

  • Всё из варианта "Полный цикл"
  • Оркестрация контейнеров и масштабирование
  • Инфраструктура, описанная конфигурацией
  • Развёртывание нового окружения с нуля за часы
  • Оповещения и дежурство по критичным сервисам
  • Обучение команды сопровождению

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

Частые вопросы

У нас нет тестов. Смысл в конвейере есть?
Есть, но частичный. Автоматическая сборка и одинаковые окружения снимают целый класс проблем и без тестов. При этом деплой по кнопке без проверок только ускоряет доставку ошибок, поэтому мы обычно предлагаем начать с небольшого набора проверок на самые дорогие сценарии.
Придётся переписывать приложение?
Как правило, нет. Упаковка в контейнер требует навести порядок в настройках и зависимостях, но код остаётся. Переписывать приходится там, где приложение жёстко завязано на конкретную машину: пишет файлы рядом с собой, хранит состояние в памяти процесса, ждёт ручной правки конфигурации на сервере.
Сколько будет стоить содержание конвейера?
Сервер под сборки и хранилище образов - обычно недорого, счёт идёт от нескольких тысяч рублей в месяц. Больше стоит внимание: пара часов в месяц на обновление конфигураций и разбор упавших сборок. Если такого времени в команде нет, берём сопровождение на себя.
Кому принадлежит результат?
Вам. Конвейер описан файлами в вашем репозитории, инфраструктура - конфигурацией, доступы - вашими учётными записями. Ничего, что работает только пока мы рядом, мы не оставляем. Это принципиально: привязка к подрядчику в инфраструктуре стоит дороже, чем сама инфраструктура.
Можно ли сделать это без остановки разработки?
Да, конвейер строится параллельно. Команда продолжает выкатывать привычным способом, пока новый путь не отработает несколько релизов на стенде. Переключаемся, когда откат проверен, и старый способ ещё некоторое время остаётся как запасной.

Из того же направления. Полный список с ценами - в каталоге услуг.