В данной заметке я покажу, как запускать DBDeploy из скрипта Gradle.
О чём это вообще?
Возможно, вы уже слышали о версионированной миграции структуры баз данных. Об этом писали на хабре. DBDeploy — один из самых простых и известных инструментов, позволяющий легко установить все последние изменения в базе данных на любом инстансе и любой девелоперской машине. А Gradle — модный ныне инструмент для сборки проекта (как Ant и Maven, только лучше). О нём тоже уже писали.
И в чём вопрос?
Вопрос в том, как запускать DBDeploy из скрипта Gradle? У DBDeploy есть таски для Ant и плагин для Maven, но пока ещё нет плагина для DBdeploy (точнее, он в зачаточном состоянии). Немного потыркавшись, я пришёл к выводу, что самый простой способ — это использовать тот самый Ant таск DBDeploy из скрипта Gradle (здесь описано, как из gradle-скрипта использовать любые Ant-таски). Рассмотрим пример.
Задача ясна, с чего начнём?
Допустим, наш проект имеет следующую структуру. В папке «db» хранятся SQL-скрипты:
- db
- create_changelog_table.sql
- 001_create_customer_table.sql
- 002_create_address_table.sql
- 003_etc...
- build.gradle
Тогда мы можем создать Gradle-скрипт с 3 тасками:
build.gradle
project.ext {
dbDriver = 'com.mysql.jdbc.Driver'
dbUrl = 'jdbc:mysql:///habrahabr'
dbUsername = 'habra'
dbPassword = 'habr'
}
task updateDatabase
task updateDatabase << {
ant.taskdef(name: 'dbdeploy',
classname: 'com.dbdeploy.AntTarget',
classpath: configurations.compile.asPath)
ant.dbdeploy(driver: dbDriver,
url: dbUrl,
userid: dbUsername,
password: dbPassword,
dir: 'db',
dbms: 'mysql',
undooutputfile: 'db/undo_last_change.sql')
}
task createChangelogTable
<b>task createChangelogTable</b> << {
ant.sql(driver: dbDriver,
url: dbUrl,
userid: dbUsername,
password: dbPassword,
encoding: 'UTF-8',
classpath: configurations.compile.asPath) {
fileset(file: 'db/create_changelog_table.sql')
}
}
task undoLastChange
<b>task undoLastChange</b> << {
ant.sql(driver: dbDriver,
url: dbUrl,
userid: dbUsername,
password: dbPassword,
encoding: 'UTF-8',
classpath: configurations.compile.asPath) {
fileset(file: 'db/undo_last_change.sql')
}
}
Как это запускать?
Таким образом у нас появилось 3 таска:
> gradle createChangelogTable
:createChangelogTable BUILD SUCCESSFUL
> gradle updateDatabase
[ant:dbdeploy] dbdeploy 3.0M3 [ant:dbdeploy] Reading change scripts from directory /tmp/habr/gradle-dbdeploy/db... [ant:dbdeploy] Changes currently applied to database: [ant:dbdeploy] 1..61 [ant:dbdeploy] Scripts available: [ant:dbdeploy] 62..62 [ant:dbdeploy] To be applied: [ant:dbdeploy] 62..62 [ant:dbdeploy] Applying #62: 062_migrate_currency_to_eur.sql... [ant:dbdeploy] -> statement 1 of 5... [ant:dbdeploy] -> statement 2 of 5... [ant:dbdeploy] -> statement 3 of 5... [ant:dbdeploy] -> statement 4 of 5... [ant:dbdeploy] -> statement 5 of 5... [ant:dbdeploy] Generating undo scripts... BUILD SUCCESSFUL
> gradle undoLastChange
:undoLastChange BUILD SUCCESSFUL
Теперь вы можете, один раз запустив «gradle createChangelogTable», запускать «gradle updateDatabase» каждый раз хоть после каждого изменения скриптов, а для отмены последних изменений использовать «gradle undoLastChange».
Подведём итоги
Gradle предоставляет очень лаконичный и читабельный синтаксис для билд-скриптов, DBDeploy предлагает простой и надёжный способ ставить изменения в БД. И они прекрасно сработались.
Удачного БДения!
Автор: asolntsev