GitHub Workflow中Liquibase检测变更集差异的方法及替代方案咨询
关于Liquibase检测PR与现有Changelog变更集差异的方法
一、你用的unexpected-changesets命令不对
liquibase unexpected-changesets的作用是对比数据库里已经执行过的变更集(存在DATABASECHANGELOG表中)和本地当前的changelog文件,找出那些数据库有但本地文件没记录的变更——说白了是查“有没有人偷偷改了数据库没更changelog”。而你要的是对比主分支(现有)和PR分支的changelog文件本身的差异,这俩完全不是一回事,所以这个命令满足不了你的需求。
二、靠谱的替代方法
1. 直接用Git对比文件差异
既然changelog是文件,在GitHub Workflow里直接用Git命令就能搞定:
- 先把主分支和PR分支都拉下来,然后执行:
这个命令会列出两个分支下changelog目录里所有文件的改动,新增、删除、修改的变更集一目了然。git diff main -- path/to/your/changelog-folder/ - 如果只想看变更集的ID、作者这类关键信息,可以加个过滤:
git diff main -- path/to/changelog.xml | grep -E 'id="|author="'
2. 用diff-changelog间接对比(适合验证结构变化)
liquibase diff-changelog本来是对比两个数据库的结构差异生成changelog,你可以绕个弯用它来对比两个changelog的执行效果:
- 用Docker启动两个临时数据库(比如H2、MySQL,轻量就行)
- 把主分支的changelog执行到第一个数据库,PR分支的执行到第二个
- 然后用
diff-changelog对比这两个数据库,生成的差异就是两个changelog带来的结构变化,间接反映了变更集的差异 - 举个Workflow步骤的例子:
- name: 启动临时数据库 run: | docker run -d --name db-main -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mysql:8.0 docker run -d --name db-pr -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 mysql:8.0 # 等待数据库启动完成 sleep 30 - name: 执行主分支changelog到db-main run: liquibase --changeLogFile=main/changelog.xml --url=jdbc:mysql://localhost:3306/test --username=root --password=root update - name: 执行PR分支changelog到db-pr run: liquibase --changeLogFile=pr/changelog.xml --url=jdbc:mysql://localhost:3307/test --username=root --password=root update - name: 生成差异changelog run: liquibase diff-changelog --url=jdbc:mysql://localhost:3306/test --username=root --password=root --referenceUrl=jdbc:mysql://localhost:3307/test --referenceUsername=root --referencePassword=root --outputFile=diff-result.xml
3. 用list-changesets导出列表再对比
- 分别给主分支和PR分支的changelog生成变更集列表文件:
liquibase --changeLogFile=main/changelog.xml list-changesets > main-changes.txt liquibase --changeLogFile=pr/changelog.xml list-changesets > pr-changes.txt - 然后用
diff命令对比这两个文本文件:
这样能直接看到两个分支的变更集有哪些新增、删除或者信息修改(比如ID变了、作者改了)。diff main-changes.txt pr-changes.txt
三、GitHub Workflow里的建议
- 如果只是要快速看PR改了哪些变更集,优先用Git diff,简单快,不需要额外搞数据库
- 如果要验证变更集执行后数据库结构的变化,再用临时数据库+diff-changelog的方式,确保变更没问题
- 把这些步骤加到PR的CI里,自动检查变更集的问题(比如有没有重复的ID、是不是符合团队规范)
内容的提问来源于stack exchange,提问作者Govinda
相关产品推荐
相关产品推荐

