使用 Liquibase CLI 在 Git 推送时更新 PostgreSQL 数据库
Using Liquibase CLI to update PostgreSQL database on Git push
我正在考虑使用 Liquibase 来管理我的 PostgreSQL table 和函数的更新。我没有集成到 Java 应用程序中,所以我使用它 'standalone',这意味着在 SQL 文件中定义一个变更集并使用 Liquibase CLI 执行它。有没有一种方法可以使事情自动化,以便当我将 changelog.sql 文件签入 Git 时,Liquibase 可以针对我想要的数据库执行它?
如果这不可能,我将简单地手动使用 CLI,这很有效。
Liquibase 本身没有这样的东西。我建议查看 Jenkins 之类的内容来自动执行此过程。
这可以完成,但您需要一个 Maven 构建服务器来执行更新。
我会这样做:
- 使用 Maven 将您的项目配置为伪java 应用程序。您将需要一个 pom 文件。示例如下。
- 设置可以运行 maven 构建的构建服务器。您可以找到可用服务器的列表 here.
- 在 Git 推送上设置一个网络挂钩,告诉构建服务器获取更新的脚本和构建。如果您使用的是 Github,说明 here.
- 将构建服务器配置为 运行 Maven 目标 'liquibase:update'。
示例pom文件(根据需要修改):
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>my-project</artifactId>
<version>1.0</version>
<scm>
<url>https://github.com/{user}/{repository}</url>
<connection>scm:git:https://github.com/{user}/{repository}git</connection>
<developerConnection>scm:git:https://github.com/{user}/{repository}</developerConnection>
<tag>HEAD</tag>
</scm>
<name>My Project</name>
<description>Simlpe pom file to run my liquibase scripts</description>
<properties>
<liquibase-maven-plugin.version>3.5.1</liquibase-maven-plugin.version>
</properties>
<dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>${liquibase-maven-plugin.version}</version>
<configuration>
<propertyFile>liquibase-maven.properties</propertyFile>
</configuration>
</plugin>
</plugins>
</build>
</project>
示例 liquibase-maven.properties 文件:
changeLogFile=changelog.xml
driver=com.mysql.cj.jdbc.Driver
username=user
password=password
verbose=true
dropFirst=false
url=jdbc:mysql://database-server:3306/schema
databaseChangeLogLockTableName=databasechangeloglock
databaseChangeLogTableName=databasechangelog
我希望这会有所帮助,这绝不是让它发挥作用的完整秘诀,但如果你坚持下去,它应该会让你走上正确的道路。
备选
如果你真的想使用 liquibase CLI,你可以编写脚本。例如,设置一个简单的支持 CGI 的 Web 服务器 (Apache) 并编写一个脚本,该脚本将在 运行 liquibase CLI 更新之前从您的 git 存储库中提取数据。然后,您将设置 Git 网络挂钩以发出触发更新脚本的请求。
事实上,既然我写了这个替代方案,那可能是对上述构建服务器的更简单的解决方案。我想这取决于您当前可用的架构以及您最喜欢的架构。第一个解决方案是配置,这个需要写一个小脚本。
这是可行的。我在我的 Jenkins 管道中做了类似的事情。
配置 liquibase
- 确保您已安装 liquibase
- 下载
postgresql-X.X-XXX.jdbc3.jar
文件并将其放入 liquibase 文件夹内的 lib
文件夹中。这使得它在全球范围内可供 liquibase 使用。
运行 当你提交一些东西时
- 打开 git 控制的项目文件夹并导航到文件夹
.git/hooks
。根据您的 git 风格,这里可能已经有一些文件。你可以在网上阅读更多关于它如何工作的信息:https://githooks.com/
- 创建一个空文本文件并将其命名为
post-commit
。
- 添加以下内容(假设您在 windows 上使用 git 或在 linux 上使用 git - 我不确定它是否适用于所有 git 实现)
#!/bin/bash
DB_PORT = 6000
SQL_DB_NAME = "mydbName"
PGSQL_USERNAME = "username"
PGSQL_PASSWORD = "password"
/path/to/liquibase --driver=com.mysql.cj.jdbc.Driver --changeLogFile=../resources/database/db.changelog-1.1.xml --url=\"jdbc:postgresql://127.0.0.1:${DB_PORT}/${SQL_DB_NAME}?autoReconnect=true&useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC\" --username=${PGSQL_USERNAME} --password=${PGSQL_PASSWORD} update
备注
这将 运行 每次您提交。如果你正在使用像 github/bitbucket 这样的远程 git 服务器,考虑 pre-push
而不是 post-commit
这可能需要一些调整。
* 我在这个例子中使用了 xml 文件
* 这是根据我用于 MySQL 的内容改编的,因此 jdbc url 可能需要更改。
潜在改进
检查提交的文件,只有当有 .sql 文件时,运行 liquibase。
我正在考虑使用 Liquibase 来管理我的 PostgreSQL table 和函数的更新。我没有集成到 Java 应用程序中,所以我使用它 'standalone',这意味着在 SQL 文件中定义一个变更集并使用 Liquibase CLI 执行它。有没有一种方法可以使事情自动化,以便当我将 changelog.sql 文件签入 Git 时,Liquibase 可以针对我想要的数据库执行它?
如果这不可能,我将简单地手动使用 CLI,这很有效。
Liquibase 本身没有这样的东西。我建议查看 Jenkins 之类的内容来自动执行此过程。
这可以完成,但您需要一个 Maven 构建服务器来执行更新。
我会这样做:
- 使用 Maven 将您的项目配置为伪java 应用程序。您将需要一个 pom 文件。示例如下。
- 设置可以运行 maven 构建的构建服务器。您可以找到可用服务器的列表 here.
- 在 Git 推送上设置一个网络挂钩,告诉构建服务器获取更新的脚本和构建。如果您使用的是 Github,说明 here.
- 将构建服务器配置为 运行 Maven 目标 'liquibase:update'。
示例pom文件(根据需要修改):
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>my-project</artifactId>
<version>1.0</version>
<scm>
<url>https://github.com/{user}/{repository}</url>
<connection>scm:git:https://github.com/{user}/{repository}git</connection>
<developerConnection>scm:git:https://github.com/{user}/{repository}</developerConnection>
<tag>HEAD</tag>
</scm>
<name>My Project</name>
<description>Simlpe pom file to run my liquibase scripts</description>
<properties>
<liquibase-maven-plugin.version>3.5.1</liquibase-maven-plugin.version>
</properties>
<dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>${liquibase-maven-plugin.version}</version>
<configuration>
<propertyFile>liquibase-maven.properties</propertyFile>
</configuration>
</plugin>
</plugins>
</build>
</project>
示例 liquibase-maven.properties 文件:
changeLogFile=changelog.xml
driver=com.mysql.cj.jdbc.Driver
username=user
password=password
verbose=true
dropFirst=false
url=jdbc:mysql://database-server:3306/schema
databaseChangeLogLockTableName=databasechangeloglock
databaseChangeLogTableName=databasechangelog
我希望这会有所帮助,这绝不是让它发挥作用的完整秘诀,但如果你坚持下去,它应该会让你走上正确的道路。
备选 如果你真的想使用 liquibase CLI,你可以编写脚本。例如,设置一个简单的支持 CGI 的 Web 服务器 (Apache) 并编写一个脚本,该脚本将在 运行 liquibase CLI 更新之前从您的 git 存储库中提取数据。然后,您将设置 Git 网络挂钩以发出触发更新脚本的请求。
事实上,既然我写了这个替代方案,那可能是对上述构建服务器的更简单的解决方案。我想这取决于您当前可用的架构以及您最喜欢的架构。第一个解决方案是配置,这个需要写一个小脚本。
这是可行的。我在我的 Jenkins 管道中做了类似的事情。
配置 liquibase
- 确保您已安装 liquibase
- 下载
postgresql-X.X-XXX.jdbc3.jar
文件并将其放入 liquibase 文件夹内的lib
文件夹中。这使得它在全球范围内可供 liquibase 使用。
运行 当你提交一些东西时
- 打开 git 控制的项目文件夹并导航到文件夹
.git/hooks
。根据您的 git 风格,这里可能已经有一些文件。你可以在网上阅读更多关于它如何工作的信息:https://githooks.com/ - 创建一个空文本文件并将其命名为
post-commit
。 - 添加以下内容(假设您在 windows 上使用 git 或在 linux 上使用 git - 我不确定它是否适用于所有 git 实现)
#!/bin/bash
DB_PORT = 6000
SQL_DB_NAME = "mydbName"
PGSQL_USERNAME = "username"
PGSQL_PASSWORD = "password"
/path/to/liquibase --driver=com.mysql.cj.jdbc.Driver --changeLogFile=../resources/database/db.changelog-1.1.xml --url=\"jdbc:postgresql://127.0.0.1:${DB_PORT}/${SQL_DB_NAME}?autoReconnect=true&useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC\" --username=${PGSQL_USERNAME} --password=${PGSQL_PASSWORD} update
备注
这将 运行 每次您提交。如果你正在使用像 github/bitbucket 这样的远程 git 服务器,考虑 pre-push
而不是 post-commit
这可能需要一些调整。 * 我在这个例子中使用了 xml 文件 * 这是根据我用于 MySQL 的内容改编的,因此 jdbc url 可能需要更改。
潜在改进
检查提交的文件,只有当有 .sql 文件时,运行 liquibase。