Spring Bootをアップグレードするとflywayもメジャーアップデートされる
Spring Boot 1.x EOL Aug 1st 2019 とあるように、Spring Boot 1.x のEOLは2019/8 なので、2.xにアップグレードする必要がある。
Spring Boot 2.0 Migration Guide · spring-projects/spring-boot Wiki · GitHub をみていたところ、Flywayを使っている場合、テーブル構造が変わるので一旦flyway 4.2.0 + Spring Boot 1.5.xの構成にするようにとあった。「じゃぁ」と始める前に、今どうなっているかをちゃんと確認しておこう。方法は2つある。いずれにせよ事前調査は重要だ。
flywayのversionをログで確認
ログを見れば起動時にflywayのVersionも表示されている。だけど、長い間動かしてきて、かつ、定期的にログを退避していると、起動時のログを見つけるのが大変だったりする。
flywayのテーブル構造でversion確認
変わるというテーブル構造を直接確認する。ログにある起動時のメッセージだと、見落とす可能性も0ではない。が、動いているプログラムが使っているテーブルの構造であれば、確実だ。
対象は、schema_versionテーブル。3.xのtable定義(構造)を見てみる。
mysql> desc schema_version;
+----------------+---------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------+------+-----+-------------------+-------+
| version_rank | int(11) | NO | MUL | NULL | |
| installed_rank | int(11) | NO | MUL | NULL | |
| version | varchar(50) | NO | PRI | NULL | |
| description | varchar(200) | NO | | NULL | |
| type | varchar(20) | NO | | NULL | |
| script | varchar(1000) | NO | | NULL | |
| checksum | int(11) | YES | | NULL | |
| installed_by | varchar(100) | NO | | NULL | |
| installed_on | timestamp | NO | | CURRENT_TIMESTAMP | |
| execution_time | int(11) | NO | | NULL | |
| success | tinyint(1) | NO | MUL | NULL | |
+----------------+---------------+------+-----+-------------------+-------+
11 rows in set (0.00 sec)
mysql>
4.2.0以降の定義は、
mysql> desc schema_version;
+----------------+---------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------+------+-----+-------------------+-------+
| installed_rank | int(11) | NO | PRI | NULL | |
| version | varchar(50) | YES | | NULL | |
| description | varchar(200) | NO | | NULL | |
| type | varchar(20) | NO | | NULL | |
| script | varchar(1000) | NO | | NULL | |
| checksum | int(11) | YES | | NULL | |
| installed_by | varchar(100) | NO | | NULL | |
| installed_on | timestamp | NO | | CURRENT_TIMESTAMP | |
| execution_time | int(11) | NO | | NULL | |
| success | tinyint(1) | NO | MUL | NULL | |
+----------------+---------------+------+-----+-------------------+-------+
10 rows in set (0.00 sec)
mysql>
version_rankというカラムがあるかないかで判断してよさそうだ。
もう1つの注意は4.2.0からのアップグレード方法
migration guideには書いていないのだが、flywayの管理テーブルが変わる。[Spring Boot] Flyway 3系で作ったテーブルを Flyway 5系にアップデートする方法 | DevelopersIO で触れられているのだが、flyway 5.xではdefaultの管理テーブルは変更されていて、なければschema_versionテーブルを使うという動きになっている。
だから気にすることはないといえばないのだが、flyway 6.xでは、この、なければschema_versionテーブルを使うという動きがなくなる。
flyway.table=schema_version
と設定しておくと、管理テーブルとしてschema_versionテーブルを使うようになるので、Spring Boot 2.xにするタイミングで設定しておくのが安全だ。
アップグレードは旬の作業
みんながアップグレードしているときは、話題にもなるし、質問に答えてくれる人も多い。が、いつまでもアップグレードを先送りにしていると、みんな忘れてしまう(あるいは、なかったことにしてしまう)し、アップグレードのためのライブラリーやツールがなくなってしまうこともある。タイミングを逃さずに行わなければならない作業の1つだろう。