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 の起動速度を改善する)
    • (2013/8/10 追記) 遅いというと語弊があるかも。だいたい 10 〜 15 秒かかります。SpringMVC を使ったクラス数 50 くらいのアプリケーションです。
    • (2013/8/15 追記) コメントでご指摘いただいたとおり共有フォルダに NFS を使うことで 6 秒くらいになりました
  • 実は vagrant up だけでは god を起動することができかった。再起動 (vagrant halt; vagrant up) すれば OK でした