はじめに
PlayFrameworkを使ってWebサービスを作ってみたので、簡単にデプロイできると噂のHerokuを今更ながら試してみました。git push heroku masterで使用しているフレームがPlayFrameworkということを検出して自動でビルド開始するログを見て思わず「Heroku ってすげー!」ってなってましたが、ステータスがcrashedとなってハマったので、Herokuデプロイ時に必要なProcfileについての解決方法を簡単にまとめたいと思います。
環境
- PlayFramework 2.4.1(Java)
解決方法
Herokuでデプロイをする場合、Procfileに最低限の情報を記載してあげる必要がありますが、その書き方をきちんと理解してなかったようです。
ちなみにHerokuの公式サイトには以下のように記載するように書かれています。
web: target/universal/stage/bin/{your project name} -Dhttp.port=$PORT
ここで私は、your project name にHerokuのプロジェクトネームを記載していましたが、ここにはPlayFrameworkのプロジェクト情報が記載されている「build.sbt」の name属性を記載する必要があります。
name := "XXX" /* ここが {your project name}に相当 */
version := "1.0"
lazy val `baseball` = (project in file(".")).enablePlugins(PlayJava,PlayEbean)
resolvers += "scalaz-bintray" at "https://dl.bintray.com/scalaz/releases"
scalaVersion := "2.11.11"
libraryDependencies ++= Seq(javaJdbc, cache, javaWs)
unmanagedResourceDirectories in Test <+= baseDirectory(_ / "target/web/public/test")
PlayFrameworkはバージョンによってProcfilen書き方は変わるようですが、Herokuの公式サイトに加えてHerokuのrunコマンドを使ってHerokuに動作しているコンテナの実態を抑えるのが問題解決には早そうです。
heroku run "ls -l target/universal/stage/bin"
Running ls -l target/universal/stage/bin on ⬢ apps... up, run.5849 (Free)
total 28
-rwx------ 1 u43543 dyno 13969 Jun 30 11:37 apps
-rw------- 1 u43543 dyno 9362 Jun 30 11:37 apps.bat
上記のように、target/universal/stage/bin以下に何が格納されているのか把握できれば、Procfileには以下のように記載すればOKだということが分かると思います。。
web: target/universal/stage/bin/apps -Dhttp.port=$PORT
最後に
Herokuに依存するProcfileの書き方でハマってしまったわけですが、これさえ分かっておけばHerokuのログを見れば解決していける内容(Herokuには依存しない)だと思います。