Herokuの仕組みを詳細に解説してみる
ここでHerokuへのgit pushで行われていることをもう少し詳細してみます。次の図は、Herokuへのgit pushで行われていることを図示したものです。
Herokuレーンの中に、
- Git repository
- Slug compiler
- Dyno
という箱が置かれていますが、これらはHeroku内部のモジュールです。
Git repository
Git repositoryはオープンソースのgitそのもので、Herokuのgitにコードをpushすると、それをフックしてSlug Compilerがアプリケーションのコンパイルを開始します。
実際にコンパイルを行うのはbuildpackと呼ばれるシェルスクリプトです。 buildpackはRuby用、Java用、Node.js用など言語ごとに用意されており、それらはすべてGitHub上で公開されています。
Slug Compiler
Slug Compilerは、デフォルトでは使用するbuildpackをpushされたファイルから、次のような感じで自動判定します。
- ルートにGemfileがあったらRuby
- ルートにpackage.jsonがあったらNode.js
- ルートにpom.xmlがあったらJava
この自動判定は多くの場合うまく機能しますが、JavaアプリケーションであってもGrunt[2]を併用していたりするとルートにpackage.jsonとpom.xmlの両方があってNode.jsアプリと判定されてしまいます。
[2] GruntはNode.js製のタスクランナーです。JavaScriptの結合やミニファイなど、フロントエンド寄りのタスク処理に多く活用されています。
この場合、heroku config:setコマンドでBUILDPACK_URLを明示的に指定することで、どのbuildpackを使用するかを設定することができます。
$ heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-java.git
BUILDPACK_URLに指定するのは、ダウンロード可能なgitリポジトリのURLです。この仕組みにより、自分でカスタマイズしたオリジナルのbuildpackを使うことも可能となっています。
今回の場合、ルートにpom.xmlがあるので、使用されるのはJavaのbuildpackです。 JavaのbuildpackはJDKやMavenをダウンロードしてJavaアプリケーションのコンパイルを行い、Slugと呼ばれるアプリケーションの実行モジュールの固まりを生成します。 このSlugがDyno上で展開されアプリケーションが実行されるわけです。
Dyno
Dynoは、簡単にいうとアプリケーションを実行するためのコンテナですが、これの詳細な説明はもう少し先の回で行う予定です。
system.properties
ところで、JavaのbuildpackがコンパイルやSlug生成時に使用するJDKのバージョンは何になるでしょうか?
これを指定するのがsystem.propertiesファイルです。 サンプルアプリに含まれているsystem.propertiesを開くと次の1行が記述されています。
java.runtime.version=1.7
これはJDK1.7を使用するための設定です。現状では1.6、1.7、1.8の3つのバージョンが指定できます。 このファイルが存在しない場合は使用されるJDKのバージョンは1.6になります。
ちなみにHerokuが使用するJDKはOpenJDKでマイナーバージョンは指定できません。
system.propertiesはあくまでJavaのbuildpackが使用するファイルなので、RubyやNode.jsなどの他のbuildpackを使用する場合は必要ありません。
Procfile
最後にProcfileについて説明します。
Procfileは、Dynoがアプリケーションを起動する際の起動コマンドを指定するファイルです。 サンプルアプリのProcfileの内容は以下のようになっています。
web: java $JAVA_OPTS -jar target/dependency/webapp-runner-7.0.40.0.jar --port $PORT target/heroku-sample
最初の「web:」はDynoの種別の指定です。Httpリクエストを受け付けるWebアプリケーションの場合は「web」を指定します。
それに続くjavaコマンドがアプリケーションの起動コマンドです。 run.shやrun.batに記載されている内容とほとんど同じですが、コマンド中の「$XXXX」は環境変数で置き換えられます。
Procfileではweb以外のキーで複数の起動コマンドを定義することができますが、当面使用しないので今回は説明を省略します。
Procfileなどいくつかのファイルではファイルの改行コードが「CR+LF」となっていると正しく動作しません。 改行コードがCR+LFでも問題ないファイルもありますが、HerokuのベースOSはUbuntuなので、エディタの設定で改行コードは「LF」に統一しておくことをお勧めします。
次回は、今回デプロイしたアプリケーションにデータベース(Heroku Postgres)にアクセスする機能を追加してみます。