Herokuにデプロイする
Herokuアプリケーションの作成
ローカルでアプリケーションが動作することが確認できたら、次はいよいよHerokuにデプロイしてみます。 ローカルで起動中のサーバをCTRL+Cキーで終了して、コマンドラインからheroku createコマンドを実行します。
heroku createコマンドの基本書式は以下のとおりです。
heroku create [APPNAME]
[APPNAME]の部分は任意のアプリケーション名です。英子文字、数字、ハイフンの組み合わせで任意の名前を付けることができます。 ただし、この名前は 世界中のHerokuアプリケーション間でユニーク である必要があります。 筆者はこのアプリケーションを「codezine-sample」という名前でHerokuにデプロイしましたが、同じ名前は使うことができません。 皆さんが試す場合には、アプリケーション名を「codezine-sample-shunjikonishi」のようにさらにサフィックスを付けるなどして、ユニークにしてください。
あるいは、アプリケーション名を省略して実行することもできます。この場合、Herokuが適当な名前を自動生成してくれます。
$ heroku create codezine-sample Creating codezine-sample... done, stack is cedar http://codezine-sample.herokuapp.com/ | git@heroku.com:codezine-sample.git Git remote heroku added
慣れてくるとheroku createの実行結果の出力にはほとんど注意を払わなくなると思いますが、初回なのでこの実行結果を読み解いてみます。 この出力には以下の情報が含まれています。
- 「codezine-sample」というアプリケーションが作成され、そのstackは「cedar」であること
- 「http://codezine-sample.herokuapp.com/」というURLが用意されたこと
- 「git@heroku.com:codezine-sample.git」というgitリポジトリが用意されたこと
- ローカルのgit remoteに「heroku」という参照名が追加されたこと
stackについては後述のコラム「stackとは」を参照してください。
git remoteにherokuという名前が追加されたとのことなので、まずはそれを確認してみましょう。
$ git remote -v heroku git@heroku.com:codezine-sample.git (fetch) heroku git@heroku.com:codezine-sample.git (push) upstream https://github.com/shunjikonishi/codezine-sample.git (fetch) upstream https://github.com/shunjikonishi/codezine-sample.git (push)
先にはupstreamだけだったリモートリポジトリにherokuのリポジトリが追加されていることがわかります。
次にhttpで用意されたURLにアクセスしてみます。Webブラウザで「http://<YOUR APPNAME>.herokuapp.com/」に直接アクセスするか、またはコマンドラインで、
heroku open
と実行することで、そのURLをデフォルトブラウザで開くことができます。
ただし、現時点ではまだアプリケーションコードをHerokuにアップしていないので、次の図のようにWelcomeメッセージが表示されるだけのはずです。
デプロイ
アプリケーションのデプロイで使用するのはgit pushコマンドです。
$ git push heroku master Initializing repository, done. Counting objects: 22, done. Delta compression using up to 4 threads. Compressing objects: 100% (14/14), done. Writing objects: 100% (22/22), 4.17 KiB | 0 bytes/s, done. Total 22 (delta 1), reused 0 (delta 0) -----> Java app detected -----> Installing OpenJDK 1.7... done -----> Installing Maven 3.0.3... done -----> executing /app/tmp/cache/.maven/bin/mvn -B -Duser.home=/tmp/build_a0344968-2d9e-458b-b597-f98d463b5b6d -Dmaven.repo.local=/app/tmp/cache/.m2/repository -DskipTests=true clean install [INFO] Scanning for projects... ...(中略)... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 8.443s [INFO] Finished at: Mon Sep 22 09:13:20 UTC 2014 [INFO] Final Memory: 19M/514M [INFO] ------------------------------------------------------------------------ -----> Discovering process types Procfile declares types -> web -----> Compressing... done, 72.9MB -----> Launching... done, v6 http://codezine-sample.herokuapp.com/ deployed to Heroku To git@heroku.com:codezine-sample.git * [new branch] master -> master
先にgit remoteでherokuというリポジトリが登録されていることを確認しましたが、このリポジトリのmasterブランチにアプリケーションコードをpushすることで、それがコンパイルされHerokuアプリケーションとしてリリースされるわけです。
ブラウザに戻って再度「http://<YOUR APPNAME>.herokuapp.com/」にアクセスしてみてください。今度はローカルで実行した時と同様にHello worldが表示されます。
当たり前ですが、このURLは世界中のどこからでもWebブラウザさえあればアクセスすることができます。 つまり、あなたの作ったアプリケーションが世界中に公開/発信されたということです。
サーバなどのハードウェアは一切購入していませんし、それどころかHeroku社に対しても1円もお金を支払ってはいません。 数年前には考えられなかったことですが、HerokuなどのPaaSの台頭によって、このように費用ゼロからアプリケーションを公開できることになったことは、エンジニアにとっては大きな恩恵です。
stackとは、Herokuアプリケーションが実行される土台となるコンテナのことです。 現在はUbuntu 10.04をベースとする「cedar」がデフォルトで使用されており、β版としてUbuntu 14.04をベースとする「cedar-14」も提供されています。 過去には「bamboo」というDebianベースのstackもありましたが、時代の流れとともに廃棄されました。
Ubuntu 10.04のサポート期間は2015年4月で終了します。そのため、時間の問題でcedar-14がデフォルトとなり、cedarも非推奨(新規作成時に選択不能)になると思われます。ただし、cedarが新規作成時に選択不可になったとしても、それ以前にcedarで作成したアプリケーションは以降もcedar上で動作し、自動的にcedar-14に切り替わることはありません(もちろん手動で切り替えることはできます)。
実際のところは、C言語で作成したlibファイルを自力でHerokuに組み込むような場合を除き、stackの違いはそれほど大きな意味を持ちませんが、cedarは1年以内にベースOSのサポートが切れることが分かっているので、次のようにして明示的にcedar-14を使用するのも良いと思います。
heroku create -s cedar-14 MyApp
コード修正してまたデプロイする
ここまで自分で書いたコードがまだ1行もないので、少しコード修正してみることにします。
src/main/java/jp/codezine/sample/heroku/web/HelloServlet.java
をエディタで開いてみてください。これは「Hello world」を出力するだけのごく単純で伝統的なServletです。 コード内にHello worldを出力している部分があるので、その部分を皆さんの名前などに変更して保存してください。
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.getWriter().print("Hello Shunji!"); }
修正したら一度ローカルでコンパイルして動作確認をしてみます。
$ mvn package $ ./run.sh
変更が反映されていることを確認したら、次は修正内容をgitリポジトリに反映します。
$ git status $ git add . $ $ git status $ git commit -m "Modify message." $ $ git status
gitに慣れていない人も多いかもしれませんので、上のコマンドサンプルではリポジトリ操作のコマンドの前後にリポジトリの状態を表示する「git status」コマンドを挟んでいます。
git statusの出力内容は省略しているので、それぞれのコマンドでリポジトリの状態がどのように変化するかを確認してください。 git status以外のコマンドを簡単に説明すると以下のとおりです。
git add
・引数のファイルをコミット対象リストに追加する。
・引数を「.」とした場合はカレントディレクトリ以下の変更のあるファイルすべてが対象となる。
git commit
・コミット対象リストのファイルをリポジトリに反映する。
・-mはコミットメッセージの指定。
修正内容をgitリポジトリにコミットしたら、再度その内容をherokuに送信します。
$ git push heroku master
コンパイルが終わったら、再度HerokuアプリケーションのURLにアクセスしてみてください。 今行った修正が反映されているはずです。
ここまでの流れを整理すると以下のようになります。
- コード修正
- ローカルでのコンパイルと動作確認
- 修正のgitリポジトリへの反映(git commit)
- 修正のHerokuへの反映(git push)
あとはこのサイクルを繰り返すことで、Herokuアプリケーションを開発することができます。