SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Herokuでスタート! はじめてのPaaSアプリケーション開発

仕組みもわかる 初めてのHerokuアプリケーションづくり! Gitでのデプロイもさらりとこなす

Herokuでスタート! はじめてのPaaSアプリケーション開発 第2回


  • X ポスト
  • このエントリーをはてなブックマークに追加

Herokuの仕組みを詳細に解説してみる

 ここでHerokuへのgit pushで行われていることをもう少し詳細してみます。次の図は、Herokuへのgit pushで行われていることを図示したものです。

Herokuへのデプロイ
Herokuへのデプロイ

 

 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以外のキーで複数の起動コマンドを定義することができますが、当面使用しないので今回は説明を省略します。

 

Windows環境での注意

 Procfileなどいくつかのファイルではファイルの改行コードが「CR+LF」となっていると正しく動作しません。 改行コードがCR+LFでも問題ないファイルもありますが、HerokuのベースOSはUbuntuなので、エディタの設定で改行コードは「LF」に統一しておくことをお勧めします。

 

 次回は、今回デプロイしたアプリケーションにデータベース(Heroku Postgres)にアクセスする機能を追加してみます。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Herokuでスタート! はじめてのPaaSアプリケーション開発連載記事一覧

もっと読む

この記事の著者

小西 俊司(コニシ シュンジ)

株式会社Giveryに所属するエンジニア。CODEプロジェクトというエンジニアの成長を促進するプラットフォーム開発のテックリード。Herokuも使った新しいプロダクトを今秋リリース予定。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8187 2014/12/17 20:52

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング