Vagrant + Chef で Java Web アプリケーション開発環境を作る
とあるプロジェクトのために 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 のリポジトリ。
myapp
├── app
│ ├── build.gradle
│ └── src
└── server
├── Vagrantfile
├── cookbooks
├── site-cookbooks
└── tomcat-webapps
開発をはじめるときはまずこれを git clone する。
vagrant up
chef-solo を使ってサーバを構成します。run_list はこんな感じ。
chef.run_list = [
"yum::epel",
"init",
"recipe[java]",
"ruby",
"god",
"nginx",
"postgresql",
"app",
"tomcat",
"development"
]
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 の起動速度を改善する)
- 実は vagrant up だけでは god を起動することができかった。再起動 (vagrant halt; vagrant up) すれば OK でした