とあるプロジェクトのために Vagrant + Chef で Java Web アプリケーションの開発環境を作った。
実現すること
git clone -> vagrant up -> gradle war により、ゲスト OS でアプリケーションが動く状態にします。
- vagrant up 時に chef-solo によりサーバを構成する
- gradle war で Tomcat にデプロイする (以後同じ方法で再デプロイ)
- アプリケーション起動時に FlywayDB でマイグレーションする
プロジェクトの構成
git リポジトリの構成は以下の通り。
app は Java の Web アプリケーションプロジェクト。server は Vagrantfile と chef のリポジトリ。
開発をはじめるときはまずこれを git clone
する。
vagrant up
chef-solo を使ってサーバを構成します。run_list はこんな感じ。
gradle war
war を作成したら Tomcat にデプロイされるように、Tomcat の webapp ディレクトリを Vagrant で共有する。
Vagrantfile
config.vm.synced_folder "tomcat-webapps", "/usr/local/tomcat/webapps"
そこに war ファイルを出力するように build.gradle を設定。
war {
destinationDir = file("../server/tomcat-webapps")
baseName = "myapp"
}
FlywayDB
起動時にマイグレーションするようにしておく。普通ですね。
実行!
git clone <url-to-myapp>
cd myapp/server
vagrant up
cd ../app
gradle war
これでデプロイ完了。以後、コードを更新したら gradle war で再デプロイされる。
まとめ
- Tomcat の webapps を Vagrant の共有フォルダにすることで簡単にデプロイできた
- Tomcat のデプロイが遅い。なんとかならないかなぁ。(Jetty の場合はこれでだいぶ改善した [Jetty の起動速度を改善する]({% post_url 2013-04-13-jetty-startup-slow-workaround %}))
- (2013/8/10 追記) 遅いというと語弊があるかも。だいたい 10 〜 15 秒かかります。SpringMVC を使ったクラス数 50 くらいのアプリケーションです。
- (2013/8/15 追記) コメントでご指摘いただいたとおり共有フォルダに NFS を使うことで 6 秒くらいになりました
- 実は vagrant up だけでは god を起動することができかった。再起動 (vagrant halt; vagrant up) すれば OK でした