使用Liquibase进行数据库版本管理、持续集成

我们一般使用Git进行源码版本管理,但是数据库同样需要管理,在一个多人的团队里面,经常是某个人改了数据库比如增加字段,这个字段没有默认值的话,导致其他使用该数据库的程序崩溃。或者是修改了数据库却没有做相应的记录,过了一段时间后,生产环境的数据库也需要做相应的修改,但是却已经记不清修改了哪个表哪些字段。直接粗暴的用一些工具来比较两个数据库结构虽然可行,但是感觉很繁琐,并且在修改的比较多了以后,要让两边的数据库结构变得一样还是有点麻烦。Laravel框架也有Database Migration 的概念,但我们的项目中并不只有PHP,还用到其他各种编程语言和框架,因此,使用Liquibase进行数据库版本管理、持续集成比较符合我们的要求。

我们在Gitlab上新建一个叫db-migration的项目,这个项目下面有如下文件:

changelog.xml文件原始内容如下:

<databaseChangeLog
xmlns=”http://www.liquibase.org/xml/ns/dbchangelog”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:ext=”http://www.liquibase.org/xml/ns/dbchangelog-ext”
xsi:schemaLocation=”http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org  /xml/ns/dbchangelog/dbchangelog-3.1.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd”>

</databaseChangeLog>

比如我现在想添加一张表,名为“db_migration_test_table”,其中有两个字段,分别为id和name,类型分别为int和varchar(50),其中id为主键,则可以通过将changelog.xml文件改为如下内容:

<databaseChangeLog
xmlns=”http://www.liquibase.org/xml/ns/dbchangelog”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:ext=”http://www.liquibase.org/xml/ns/dbchangelog-ext”
xsi:schemaLocation=”http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org /xml/ns/dbchangelog/dbchangelog-3.1.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd”>

<changeSet id=”1″  author=”shun”>

— <createTable tableName=”db_migration_test_table”>
—- <column name=”id” type=”int”>
——- <constraints primaryKey=”true” nullable=”false”/>
—- </column>
—- <column name=”name” type=”varchar(50)”>
——- <constraints nullable=”false”/>
—- </column>
— </createTable>

</changeSet>

</databaseChangeLog>

然后执行命令行:

java -jar liquibase.jar –defaultsFile=liquibase.properties –changeLogFile=changelog.xml update

成功执行后数据库将进行相应的更新。

liquibase.properties文件包含了建立数据库连接需要的信息,内容示例如下:

driver: com.mysql.jdbc.Driver
classpath: /root/liquibase/lib/mysql-connector-java-5.1.30.jar
url: jdbc:mysql://localhost/mytestdb
username: root
password: my_db_password

我们在Jenkins上建立一个自动部署项目,当db-migration项目有push event也就是changelog.xml或者liquibase.properties有更新时,自动触发Jenkins项目执行,Jenkins项目先下载db-migration项目master分支,然后到相应目录执行“java -jar liquibase.jar –defaultsFile=liquibase.properties –changeLogFile=changelog.xml update”来达到自动更新数据库的效果,之后所有的开发人员对数据库的更改只需要编辑db-migration项目的changelog.xml文件,而不需要直接修改数据库,这样数据库的更改就完全记录在changelog.xml文件中了,一目了然。

欢迎关注微信视频号: