背景
产品迭代使用CI/CD升级过程中,需要对不同发布环境的不同产品版本进行数据库迭代升级,我们在中间某次产品迭代时加入了Flyway中间件以实现数据库结构的自动化升级。
需求
由于是迭代过程中加入的Flyway,而不是一开始就使用,所以Flyway的版本表和版本记录数据在已经发布过的环境中是不存在的,而且每个环境的产品版本也不同,数据库结构迭代升级首先需要确定当前产品的版本,再执行相应的升级脚本。所以我们需要在发布环境升级时,在Flyway执行之前先根据数据库现状写入版本表和版本记录数据,才能让Flyway正常执行迭代升级脚本。
Flyway Hooks/Callback
查阅官方文档知道Flyway有个Hooks,官网文档,文档详细描述如下:
Building upon that are the Java-based Callbacks when you need more power or flexibility in a Callback than SQL can offer you.
They can be created by implementing the Callback interface:
public class MyNotifierCallback implementsCallback {//Ensures that this callback handles both events
@Overridepublic booleansupports(Event event, Context context) {return event.equals(Event.AFTER_MIGRATE) ||event.equals(Event.AFTER_MIGRATE_ERROR);
}//Not relevant if we don‘t interact with the database
@Overridepublic booleancanHandleInTransaction(Event event, Context context) {return true;
}//Send a notification when either event happens.
@Overridepublic voidhandle(Event event, Context context) {
String notification= event.equals(Event.AFTER_MIGRATE) ? "Success" : "Failed";//... Notification logic ...
notificationService.send(notification);
}
String getCallbackName() {return "MyNotifier";
}
}
In order to be picked up by Flyway, Java-based Callbacks must i