Перевод материала подготовлен в рамках курса Экспресс-курс по управлению миграциями (DBVC).
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://personeltest.ru/away/www.liquibase.org/xml/ns/dbchangelog"xmlns:xsi="http://personeltest.ru/away/www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://personeltest.ru/away/www.liquibase.org/xml/ns/dbchangeloghttp://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-tableCREATE 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)