Настройка Liquibase для автоматических миграций БД и CI/CD

Ручные миграции баз данных превращают релиз в лотерею: расхождения схем ловятся уже на проде. Мы настраиваем Liquibase под ключ — разворачиваем автоматические миграции в вашем конвейере сборки и доставки и передаём команде готовый регламент. Выпуск версий ускоряется, а изменения схемы перестают зависеть от одного человека.
Часто задаваемые вопросы

Настройка Liquibase: где ручные миграции ломают релиз

Настройка Liquibase начинается с простого факта: пока схему БД накатывают руками — скриптом по ssh, файлом из задачи, командой в консоли, — расхождение схемы между средой разработки, тестовым контуром и продом появляется незаметно. Правки, внесённые «по-быстрому» прямо на стенде, не попадают в репозиторий, а следующая выкатка накладывает их поверх чужой версии. Ручные миграции БД выглядят управляемыми, пока окружений два и людей трое.

Цена проявляется на релизе: сбой при выкате из-за того, что колонка уже создана или тип не совпал, а приложение ждёт другую схему. Дальше — откат релиза вручную, сверка дампов, поиск забытого изменения по логам и переписке. Окно выкатки растягивается, а уверенности, что следующая миграция пройдёт так же, не появляется.

Liquibase переводит схему в версионируемый артефакт: changelog лежит рядом с кодом, каждая миграция получает идентификатор и контрольную сумму, а порядок применения и факт наката фиксируются в служебной таблице. Повторный запуск не применяет изменение дважды, правка задним числом ловится по контрольной сумме, а окружения сходятся к одной схеме из одного источника — независимо от того, разработка это или прод.

Ниже разбираем, как это закрывается: структура changelog, контексты и метки для разных окружений, откат изменений и встраивание миграций в конвейер выкатки.

Что даёт автоматизация миграций: эффект по этапам доставки

Эффект от автоматизации миграций оценивают не по общему впечатлению, а по измеримым точкам на каждом этапе доставки. Ведём четыре отметки и сверяем их до и после внедрения — так видно, что именно даёт перенос изменений схемы из ручных действий в Liquibase.

Воспроизводимость окружений

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

Время выката изменений

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

Простой при обновлении

Шаги выстраиваются по схеме «расширить — заполнить — сжать»: сначала совместимые объекты, затем перенос данных, затем удаление старого. Приложение работает на обеих версиях схемы одновременно, поэтому простой при обновлении уходит либо сокращается до незаметного пользователю.

Доля ошибок схемы и ушедший класс отказов

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

Сравнение режимов миграций: схема, данные, откат

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

Второй фактор — кто инициирует накат. Пока изменения применяет инженер вручную, порядок держится на договорённостях; в конвейере его фиксирует инструмент вроде Liquibase, и тогда критично, что именно лежит в наборах изменений и как проверяется их целостность.

Режим Когда подходит Ограничения
Только схема Стабильные данные: новые таблицы, индексы, колонки без переноса значений Миграции данных не покрывает — переливку и нормализацию готовят отдельно
Схема вместе с данными Новые колонки с наполнением, разовые переливки, переименования Долгие операции держат блокировки, откат данных работает только внутри транзакции
Подготовленные наборы изменений Повторяемые релизы, несколько окружений, воспроизводимость Нужны ревью и контроль целостности, иначе расхождение применится вслепую
Ручной накат Аварийные правки и разбор инцидента Нет истории и повторяемости, откат целиком ложится на инженера

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

Настройка Liquibase в конвейере сборки и доставки

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

  1. Инвентаризация. Сверяем схемы контуров разработки, предрелизного и боевого, собираем объекты, живущие вне системы миграций, и расхождения, накопленные ручными правками.
  2. Структура changelog. Разбиваем изменения на файлы по релизам, задаём единый формат идентификаторов и подключаем корневой мастер-файл — история правок читается без археологии.
  3. Описание изменений. Каждое изменение оформляется вместе с обратной операцией: применение и откат лежат в одном наборе, поэтому откат релиза не превращается в ручную работу под нагрузкой.
  4. Параметры запуска. Настраиваем контексты и метки по окружениям: служебные изменения не уезжают на боевой контур, а тяжёлые операции идут отдельным потоком.
  5. Проверка миграций. Прогоняем изменения на предрелизном контуре на копии боевых данных — смотрим время выполнения, блокировки, план запросов и стоимость отката.
  6. Журнал применённых версий. Контрольная таблица становится единственным источником правды о состоянии базы: по ней видно, что и когда применилось, и от неё идёт восстановление после сбоя.
  7. Передача регламента. Отдаём команде правила добавления изменений, автоматическую проверку в конвейере и порядок действий при конфликте — миграции перестают быть зоной одного инженера.

Что остаётся в репозитории: файлы, схемы, регламенты

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

  • Файлы изменений — упорядоченные описания миграций с обратными операциями и разделением на логические наборы; видно, какое изменение к какой задаче относится и как его снять.
  • Схема окружений — какие контуры существуют, чем отличаются по правам и данным, где применяется автоматически при сборке, а где — только вручную с подтверждением.
  • Регламент выката — последовательность шагов, окно применения, ответственный за запуск, порядок при несовместимом изменении и правила остановки.
  • Политики доступа к базе — отдельная учётная запись для миграций с минимально нужными правами, роли для чтения и записи, запрет ручных правок структуры в обход репозитория.
  • Порядок применения на разных контурах — от тестового стенда до рабочего, с проверкой на копии данных и синхронизацией номеров изменений.
  • Инструкции для дежурной смены — что смотреть в журнале, как диагностировать зависшую миграцию, как откатиться и кого подключать.
  • Передача документации — описание модели данных, карта изменений, ответственные и порядок эскалации; приёмка идёт по чек-листу, а не по памяти.

Кейс: миграции под автоматическим контролем

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

Изменения перевели в Liquibase: каждый шаг описан отдельным набором в репозитории, рядом с кодом, и применяется автоматически при выкате. Состояние схемы теперь определяется списком применённых наборов, а не памятью конкретного инженера, — на любой стенд попадает ровно то, что уже прошло разработку.

Метрики до и после

Подготовка структуры базы перед релизом: было 40–60 минут ручной работы с привязкой к одному человеку, стало 6–8 минут автоматического прогона. Обращений, связанных со схемой, за квартал: семь до перевода и одно после — и то поймали на предпродакшн-стенде, а не на рабочем контуре.

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

Что делать, если база уже развёрнута и есть расхождения?

Развёрнутая база вводится в управляемый режим не с первой миграции, а с зафиксированной точки отсчёта. Первый шаг — инвентаризация изменений: снимаем фактическую схему (DDL-дамп или системный каталог), сравниваем её с тем, что описывает changelog, и раскладываем расхождения на три группы — применённые вручную, отсутствующие, разошедшиеся по типу или длине полей. Пока эта картина не собрана, любая миграция — лотерея с данными.

Дальше — baseline: Liquibase командой changelog-sync помечает существующие changeSet как выполненные, не запуская их, а тег на текущем состоянии схемы становится точкой отката. После этого база приведена к целевому состоянию по версии changelog, и все дальнейшие изменения проходят только через миграции — руками в прод больше никто не ходит.

Безопасный переход строится на предварительном просмотре: сначала прогон на копии с реальным объёмом данных, затем update-sql — увидеть, что именно уйдёт в базу, и только потом применение. Каждый changeSet идёт в своей транзакции там, где это поддерживает СУБД, блокировка на журнал миграций не даёт двум релизам стартовать параллельно, а изменения с тяжёлыми блокировками выносятся в согласованное окно.

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

Технические сомнения перед внедрением миграций

Часть сомнений закрывает сама механика миграций — журнал применённых changeSet и сверка по контрольным суммам. Остальное обеспечивает регламент и то, как организован changelog. Отвечаем на вопросы, которые чаще всего поднимают на этапе оценки.

Разработчики правят базу мимо миграций — это сломает процесс?

Изменение, не внесённое в changelog, журнал не видит: при следующем прогоне сверка контрольной суммы покажет расхождение, и миграция остановится. Поэтому прямой доступ к стендам закрываем, а срочные правки оформляем отдельным changeSet — он попадает в историю и воспроизводится на остальных контурах.

Несколько команд мигрируют схему одновременно — будет конфликт?

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

Как откатывать неудачную миграцию?

Для changeSet с парным rollback откат выполняется одной командой. Для необратимых операций — удаления или переименования колонки — заранее готовим компенсирующую миграцию и проверяем её на копии рабочей базы.

Кто и как запускает изменения на рабочем контуре?

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

Схемы на стендах разошлись — что делать?

Единый источник — changelog, а различия контуров описываем контекстами и метками: на стенде применяется подмножество миграций, и схема приводится к нужной версии без ручных скриптов.

Обсудим задачу: что нужно для старта миграций

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

Что нужно от вас на входе:

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

Дальше порядок такой: обсуждаем задачу и текущий процесс, оцениваем объём — число баз, размер baseline, сложность конфликтующих правок. По итогам оценки готовим план перевода изменений под Liquibase: с какой среды начинаем, как синхронизируем уже применённые скрипты, как выглядит откат на каждом шаге. План согласуем вместе со сроками и точкой невозврата — моментом, после которого правки схемы идут только через миграции.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1141