困っている内容
Java(spring boot)
、maven
、flyway
を使用してDBのマイグレーションをする
プロジェクトを作成しようと考えています。
maven
でビルド(javaのwebアプリなのでwar作成)すると、
jUnit
が実行される為、flyway
のマイグレート処理が走ります。
ビルド時には、mavenのprofileで開発環境と本番環境の接続先を
変えているのですが、
開発環境向けにビルドする分にはローカルにDBが存在するので
ビルドは成功するのですが、ローカルマシンで
本番環境向けにビルドする時に以下の点で困っています。
- 本番環境の接続先が無いので接続先エラーとなってしまう
- DBの無い環境ではビルド出来ない
解決案
本番環境用にビルドする時にはmavenの-DskipTests=true
でテストをスキップする。
※ただ、やはりビルド時にはテストをしたいと考えています
質問内容
以下の3つの条件を満たす方法はないでしょうか
- テストをスキップしない
- 本番環境ビルド時にはflywayのマイグレーションおこなわない
- APサーバへデプロイ時にはflywayのマイグレーションがおこなわれる
設定状況
- pom.xml
xml
1 </dependencies> 2 ... 3 <dependency> 4 <groupId>org.flywaydb</groupId> 5 <artifactId>flyway-core</artifactId> 6 </dependency> 7 </dependencies> 8 <profiles> 9 <profile> 10 <id>dev</id> 11 <activation> 12 <activeByDefault>true</activeByDefault> 13 </activation> 14 <properties> 15 <datasource.driverClassName>com.mysql.cj.jdbc.Driver</datasource.driverClassName> 16 <datasource.url>jdbc:mysql://localhost/sample?serverTimezone=JST</datasource.url> 17 <datasource.username>admin</datasource.username> 18 <datasource.password>admin</datasource.password> 19 </properties> 20 21 </profile> 22 23 <profile> 24 <id>release</id> 25 <activation> 26 <activeByDefault>false</activeByDefault> 27 </activation> 28 <properties> 29 <datasource.driverClassName>com.mysql.cj.jdbc.Driver</datasource.driverClassName> 30 <datasource.url>jdbc:mysql://localhost/sample?serverTimezone=JST</datasource.url> 31 <datasource.username>admin</datasource.username> 32 <datasource.password>admin</datasource.password> 33 34 </properties> 35 </profile> 36 </profiles>
- AppConfig.java
Java
1@Configuration 2public class AppConfig { 3 ... 4 @Bean(initMethod = "migrate") 5 Flyway flyway() { 6 return Flyway.configure().dataSource(dataSource()).load(); 7 } 8}
試したこと
プロファイルを使った切り替え
- 本番環境のプロファイルの時だけ、
spring.flyway.enabled
を切り替えてflywayを実行しないと、デプロイ時にもマイグレーションされませんでした Bean
に@Profile("release")
等のプロファイル制御をかけた場合も上記と同じ結果でした
flywayの実行場所を変更する
Bean
に書いてあるからJunit実行時に呼ばれてしまうんだと思い、mainクラスに以下のように書いてみましたが、ビルド時のJunit処理で呼び出されるのに代わりは無い為ダメでした
Java
1 public static void main(String[] args) { 2 SpringApplication.run(App.class, args); 3 } 4 5 @Override 6 protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 7 Flyway flyway = Flyway.configure().dataSource(dataSource).load(); 8 flyway.migrate(); 9 return application.sources(App.class); 10 }
Flyway Maven Plugin
を使ってみる
- Beanに書く代わりに、pom.xmlに以下のようにしてみましたが、解決しませんでした
xml
1 <plugin> 2 <groupId>org.flywaydb</groupId> 3 <artifactId>flyway-maven-plugin</artifactId> 4 <configuration> 5 <url>${datasource.url}</url> 6 <user>${datasource.username}</user> 7 <password>${datasource.password}</password> 8 <enable>false</enable> 9 </configuration> 10 </plugin> 11コード
回答1件
あなたの回答
tips
プレビュー