-
Notifications
You must be signed in to change notification settings - Fork 9
Play
このチュートリアルはHerokuにデプロイされる、Play! 1.x Frameworkについて扱っていきます。
- 基本的なJavaの知識、インストール済みのJVM
-
Play Framework version 1.2.3 かそれ以降のインストール(
play
コマンドを叩いて確認をしてみてください。) - アプリケーションはOpenJDKのversion6で動かす必要があります。
-
- Herokuのユーザアカウント。こちらから簡単に無料で取得できます。
ローカルの開発環境でHeroku Toolbeltをインストールします。これは、Herokuのコマンドラインクライアント、Foreman、そしてGitのバージョン管理システムへのアクセスを確かなものにしてくれます。
一度インストールが完了したら、コマンドシェルからheroku
コマンドを使えるようになります。 アカウント作成時に使用したEメールとパスワードを使ってログインをします :
:::term
$ heroku login
Enter your Heroku credentials.
Email: [email protected]
Password:
Could not find an existing public key.
Would you like to generate one? [Yn]
Generating new SSH public key.
Uploading ssh public key /Users/adam/.ssh/id_rsa.pub
後でコードをプッシュするのにssh
キーが必要になるので、既存のssh
キーをアップロードするか、新しい物を作成するために、プロンプトでエンターを押してください。
どんなPlay!アプリケーションでもHerokuでは実行させることができます。もし、まだ持っていないのであれば、以下のようにして基本的なPlay!アプリケーションを作成することができます :
$ play new helloworld
~ _ _
~ _ __ | | __ _ _ _| |
~ | '_ \| |/ _' | || |_|
~ | __/|_|\____|\__ (_)
~ |_| |__/
~
~ play! 1.2.4, http://www.playframework.org
~
~ The new application will be created in /Users/jjoergensen/dev/tmp/helloworld
~ What is the application name? [helloworld]
~
~ OK, the application is created.
~ Start it with : play run helloworld
~ Have fun!
~
これで、シンプルなコントローラクラスであるApplication.java
と一緒に、helloworldと呼ばれるプロジェクトが作成されました。
package controllers;
import play.*;
import play.mvc.*;
import java.util.*;
import models.*;
public class Application extends Controller {
public static void index() {
render();
}
}
Playの依存ファイル群はconf/dependencies.yml
の中で宣言します。最初の依存ファイルはフレームワークそのものです。アプリケーションの生成時は、どのフレームワークのバージョンに依存してもいいように、- play
と書かれます。以下の様に、オプションでフレームワークのバージョンを含めたほう(- play 1.2.4
)がベストプラクティスと言えるでしょう。これはまたHerokuに、あなたがデフォルトの物の代わりに、どのバージョンのフレームワークを使いたいのかを知らせてくれる方法にもなります。
dependencies.yml
を以下のように編集してください。1.2.4
は、あなたが使っているフレームワークのバージョンに置き換えてください :
# Application dependencies
require:
- play 1.2.4
ビルド用の生成物がバージョン管理に含まれてしまうのを防ぐために、以下のファイルを作成します :
:::term
bin/
data/
db/
dist/
logs/
test-result/
lib/
tmp/
modules/
ただplay run
とターミナルに打ち込み、アプリケーションを開始させます。
あなたのアプリケーションのルートディレクトリにあるテキストファイルでProcfileを、Web Dynoを開始させるために何のコマンドを実行するべきかを明示的に宣言するために使います。この場合、特定のポートを聞くように、play run
を実行します。
これは今まで扱ってきたサンプルアプリケーションのProcfile
です :
:::term
web: play run --http.port=$PORT $PLAY_OPTS
これは、1個のweb
プロセスタイプと実行する必要のあるコマンドを宣言しています。ここでは"web"と付けることが重要です。これは、デプロイ時にこのプロセスタイプがHerokuのHTTPルーティングのスタックに積まれ、Webトラフィックを受信する事を宣言しています。
PLAY_OPTS
変数は別の環境へ変更するオプションとして使われます。
デフォルトでは、アプリケーションにOpenJDK 1.6がインストールされます。しかし、system.properties
ファイル内にjava.runtime.version=1.7
と指定することで新しいバージョンのJDKを使う事ができます。
ここにsystem.properties
がどのような見た目なのかを示します :
:::term
java.runtime.version=1.7
同様に、それぞれJava6, 7, または8(ラムダ構文)に対して1.6, 1.7, 1.8(1.8はベータ)を指定する事ができます。
私たちは今、アプリケーションの3つの構成物を持っています。dependencies.yml
の中の依存ファイル、Procfile
の中のプロセスタイプ、そしてapp/controllers/Application.java
の中にある私たちのアプリケーションのソースです。Gitに追加してみましょう :
:::term
$ git init
$ git add .
$ git commit -m "init"
(Heorkuの)アプリケーションを作ります :
:::term
$ heroku create
Creating afternoon-frost-273... done, stack is cedar
http://afternoon-frost-273.herokuapp.com/ | [email protected]:afternoon-frost-273.git
Git remote heroku added
コードをデプロイします :
:::term
$ git push heroku master
Counting objects: 33, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (24/24), done.
Writing objects: 100% (33/33), 36.17 KiB, done.
Total 33 (delta 3), reused 0 (delta 0)
-----> Heroku receiving push
-----> play app detected
-----> Installing Play!..... done
-----> Building Play! application...
~ _ _
~ _ __ | | __ _ _ _| |
~ | '_ \| |/ _' | || |_|
~ | __/|_|\____|\__ (_)
~ |_| |__/
~
~ play! 1.2.x-bfb715e, http://www.playframework.org
~
1.2.x-bfb715e
Resolving dependencies: .play/play dependencies ./ --forceCopy --sync --silent -Duser.home=/tmp/build_19mcxvj20b6cu 2>&1
~ Resolving dependencies using /tmp/build_19mcxvj20b6cu/conf/dependencies.yml,
~
~
~ No dependencies to install
~
~ Done!
~
Precompiling: .play/play precompile ./ --silent 2>&1
Listening for transport dt_socket at address: 8000
22:50:04,601 INFO ~ Starting /tmp/build_19mcxvj20b6cu
22:50:05,265 INFO ~ Precompiling ...
22:50:08,635 INFO ~ Done.
-----> Built 1 Play! configuration(s).
-----> Discovering process types
Procfile declares types -> web
-----> Compiled slug size is 26.2MB
-----> Launching... done, v5
http://afternoon-frost-273.herokuapp.com deployed to Heroku
あなたはHerokuへのコードのデプロイが完了し、Procfile
を使ってプロセスタイプの指定が済んでいる状態です。これで、Herokuに対してプロセスタイプを実行するように指示をだすことができます。Herokuはこれをするために、Dynoの中の関連するコマンドを走らせます。DynoとはHerokuの構成物の基本単位である軽量コンテナのことです。
web
プロセスタイプの実行中のDynoがあることを確かめてみましょう :
:::term
$ heroku ps:scale web=1
アプリケーションのDynoの状態を確認することができます。heroku ps
コマンドは実行中のあなたのアプリケーションのDynoの一覧を表示します :
:::term
$ heroku ps
=== web: `play run --http.port=$PORT $PLAY_O..`
web.1: up for 5s
ここでは、1個のDynoが実行中です。
heroku open
を使うとブラウザからアプリケーションへ訪問することができます。
:::term
$ heroku open
Opening afternoon-frost-273... done
Herokuで表示されるwebページはローカルでビルドしたものと若干異なることに注意してください。これは、HerokuがPlayをデフォルトでプロダクションモードで実行するために起こります。$PLAY_OPTS
環境変数を使ってローカルビルドでのモードを設定する事ができます。同様に、PLAY_OPTS
の設定変数を変更することで、Herokuで使用されるモードを変更することができます。
実行中のWeb Dynoが1個のしかない場合、Dynoは非アクティブ状態から1時間経つとスリープに入ろうとします。これは復帰時の最初のリクエストの数秒間の遅延を引き起こします。後続のリクエストは通常通り動きます。
これを避けるために、Web Dynoを1個以上に拡張することができます。例えば以下のようにします :
:::term
$ heroku ps:scale web=2
それぞれのアプリケーションごとに、Herokuは750時間のDyno無料利用時間を提供しています。2個のDynoでアプリを実行しつづけると、この月次の無料範囲を超えてしまうので、拡張したものを戻してみましょう :
:::term
$ heroku ps:scale web=1
Herokuは、ログをあなたのアプリケーションの構成物を実行しているすべてのDynoの出力から集められた時系列にならんだイベントの出力として扱います。HerokuのLogplexはこれらの全てのイベントのための単体のチャンネルを提供します。
あなたの実行中のアプリケーションに関する情報を、logging commandsの一つである heroku logs
を使ってみてみましょう :
:::term
$ heroku logs
2011-08-20T22:50:14+00:00 heroku[web.1]: State changed from created to starting
2011-08-20T22:50:14+00:00 heroku[slugc]: Slug compilation finished
2011-08-20T22:50:16+00:00 heroku[web.1]: Starting process with command `play run --http.port=10800 --%prod -DusePrecompiled=true`
2011-08-20T22:50:16+00:00 app[web.1]: 22:50:16,953 INFO ~ Starting /app
2011-08-20T22:50:17+00:00 app[web.1]: 22:50:17,011 INFO ~ Precompiling ...
2011-08-20T22:50:21+00:00 app[web.1]: 22:50:21,448 WARN ~ Defaults messsages file missing
2011-08-20T22:50:21+00:00 app[web.1]: 22:50:21,481 INFO ~ Application 'helloworld' is now started !
2011-08-20T22:50:21+00:00 app[web.1]: 22:50:21,538 INFO ~ Listening for HTTP on port 10800 ...
2011-08-20T22:50:22+00:00 heroku[web.1]: State changed from starting to up
- Herokuでデータベースを利用したPlay!アプリケーションの構築を読んで、アプリケーションを拡張してみましょう
- HerokuのPlayサポートで技術的な内容を確認してみましょう
- Play!フレームワークのドキュメントとチュートリアルを見てみましょう
- アプリケーションを書いたり、構成したり、デプロイしたり、実行する時に直面するだろう概念について、技術的な大枠を知りたい場合はHerokuの仕組みを読むといいでしょう。