Перевод материала подготовлен в рамках курса «Экспресс-курс по управлению миграциями (DBVC)».
![](https://habrastorage.org/getpro/habr/upload_files/3d5/353/628/3d5353628fd7784a90668460f917a5e2.png)
Liquibase — это инструмент управления изменениями в базе данных. С его помощью вы можете отслеживать изменения в базе данных, сделанные с помощью SQL (или XML) скриптов. Эти скрипты могут быть добавлены в системы контроля версий, такие как git.
В данной статье мы рассмотрим, как автоматизировать развертывание баз данных с помощью Liquibase. Автоматизация может быть выполнена с помощью
1. Пайплайн Jenkins
2. Shell-скриптов
Я не буду говорить ни об одном из этих двух способов, поскольку это не является темой данной статьи — только для того, чтобы все было просто и понятно.
Существует два способа записи наборов изменений в Liquibase, т.е. XML и SQL. Я выбрал SQL, чтобы избежать записи соответствующих изменений XML для каждого выполняемого нами обновления SQL. Таким образом, тот же SQL-файл, который мы пишем для разработки, используется для развертывания Liquibase.
Обратите внимание, что я протестировал эти шаги только для базы данных Postgre, однако те же шаги можно повторить для любой базы данных. Также убедитесь, что на вашем компьютере настроен Liquibase .
Выполните приведенные ниже шаги:
Создать файл changelog (журнал изменений)
Создать XML-файл с именем liquibase-changelog.xml (имя может быть любым!) со следующим содержимым:
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<include file="<path to changeset SQL file>/<changeset file name>.sql>" relativeToChangelogFile="true"/>
...more <include> tags goes here...
</databaseChangeLog>
Обратите внимание на тег include
в приведенном выше XML. Каждый файл SQL changeset (набор изменений), который должен отслеживаться Liquibase, должен быть зарегистрирован в этом файле changelog (журнал изменений).
Создание наборов изменений (changeset) SQL
Добавьте файлы SQL changeset в выбранное вами место. Синтаксис SQL, который работает с Liquibase, следующий:
--liquibase formatted sql
--changeset <author name>:<a unique identifier for the SQL changeset>
<SQL statements go here>
<SQL statements go here>
--rollback <rollback SQL statements>
--rollback <rollback SQL statements>
Рассмотрим пример:
--liquibase formatted sql
--changeset xameeramir:create-test-table
CREATE TABLE IF NOT EXISTS testTable(
columnName1 VARCHAR (355)
);
--rollback DROP TABLE
--rollback testTable
Обратите внимание, что файл SQL changeset отличается от файла XML changelog.
Регистрация SQL changeset в XML-файле changelog
Включите файл SQL changeset в файл changelog, который мы создали ранее, со следующими тегами XML:
<include file=”<path to SQL changeset file>/<changeset file name>.sql” relativeToChangelogFile="true" />
Добавьте столько SQL changesets и зарегистрируйте их в файле changelog, сколько вам нужно.
Триггер в Liquibase для обновления базы данных
Просто выполните приведенную ниже команду:
liquibase --changeLogFile=<path to changelog file>/<liquibase changelog file name>.xml --username=<database username> --password=<database password> --classpath=<path to the liquibase installation>/postgresql-42.2.5.jar --url=jdbc:postgresql://<database url>/<database name> update
Classpath (путь к классам) - это драйвер JDBC, который мы настроили в предыдущей публикации. Postgresql-42.2.5.jar - это JDBC-драйвер, предназначенный для Postgres, и его можно будет заменить на базу данных по вашему выбору без каких-либо специальных преобразований на этих этапах.
Приведенная выше команда может быть использована в shell-скриптах или в пайплайне CI/CD для запуска обновлений базы данных.
Автоматизация CI/CD
После того, как вышеуказанная конфигурация установлена - автоматизация может быть выполнена либо на клиенте с помощью shell-скриптов, либо на сервере с помощью shell-скриптов или имплементации CI/CD.
Предположим, что имплементация CI/CD, которая запускает развертывание Liquibase, означает выполнение команды триггер (trigger) Liquibase, приведенной выше, при каждом git push в ветку DEVELOP (или любую другую).
Первым предварительным условием будет наличие файла liquibase-changelog.xml. Допустим, мы сохраним его на уровне ~/ с операторами include, указывающими на папку, в которой находятся changeset SQL. Следующий рабочий процесс позволит автоматизировать развертывание базы данных с помощью пайплайна CI/CD:
Поместите файл SQL changeset в репозиторий функций.
Отправьте запрос на исправление для ветки DEVELOP
После достоверной проверки и согласования объедините ветку feature с веткой DEVELOP.
Имплементация CI/CD, настроенная на сервере DEVELOP, запустит Liquibase для обновления базы данных.
Liquibase автоматически будет выполнять только новые файлы (любые уже выполненные файлы не будут запущены повторно).
Автоматизация с помощью shell-скриптов
В shell-скриптах будет записана одна и та же команда триггер Liquibase. Как только shell-скрипты будут выполнены, содержащие их changeset (наборы изменений) Liquibase будут выполнены автоматически.
Вы можете задаться вопросом, как shell-скрипты узнают, когда выполнять команду? Ответ прост:
Shell-скрипты могут выполняться на триггерах cron.
Shell-скрипты могут быть выполнены при некоторых системных событиях.
Выбор за вами!
Узнать подробнее об экспресс-курсе по управлению миграциями (DBVC)