[elixir][heroku][dynamo] herokuでrun dynamo!してみるテスト

dynamoというweb frameworkがある。sinatraに似ているということだが、sinatraに詳しくないのですいません。

get "/" do
  render "hoge.html", [a: "test", b: "teset2"]
end

とかするとテンプレートhoge.html.eexに変数 aに "test", bに"test2"が代入されてレンダリングされるという感じの物。
ここでは、テンプレートエンジンとして markdown処理系の一つである erlmarkdown を採用してdynamoに組み込んで、herokuへデプロイしてみようというテストをしてみた。
作成するアプリケーションの名前は tinymd とした。ベタだねー。

mix new tinymd

dynamoをインストール後、

mix new tinymd

でアプリケーションのひな形を作製する。

buildpack for elixir

herokuでelixirを使うためにはbuildpackが必要で、

https://github.com/goshakkk/heroku-buildpack-elixir

を使う。コレ自体はダウンロードする必要も無く、自分のアプリケーションへの組み込みは以下のコマンドで行う。

$ heroku config:add BUILDPACK_URL="https://github.com/goshakkk/heroku-buildpack-elixir.git" -a tinymd

mix.lockとmix.exsのメンテナンス

dynamoのmix.lockをよく見て、依存ライブラリのリビジョンをそろえておく事が必要。通常はmix.lockに維持されるが、ひょんな事からわからなくなったときにはまる。

erlmarkdownの追加

mix.exsにerlmarkdownを追加する。

  defp deps do
    [ { :ranch, %r(.*), github: "extend/ranch", ref: "c3133bfbc324fbb9ac26ab689c\
d41dc362ad7c05" },
      { :cowboy, %r(.*), github: "extend/cowboy", ref: "a3049f7100bb9f3cbaef1db6\
bf6cdeb750d9e298" },
      { :dynamo, %r(.*), github: "elixir-lang/dynamo" },
      { :markdown, %r(.*), github: "k1complete/erlmarkdown", compile: "sh -c 'mk\
dir -p ebin; erlc -o ebin src/markdown.erl ; cp src/markdown.app.src ebin/markdo\
wn.app' ", branch: "unicode_option" },
      { :mix_task_heroku, %r(.*), github: "k1complete/mix_task_heroku" } ]
  end

template engineの実装

compileとrenderを実装すればよく、compileは文字列をhtmlにした結果を返せば良いので、そのまま markdown:conv_utf8()を呼び出してバイナリにすればよい。renderもほぼお決まりのコードなのでそのままでよい。

mix_task_herokuの追加

dynamoに付属しているmix serverタスクは環境によってPORTを変更することができるが、herokuは事前にどのポートで待っているかわからないため、そのままでは使えない。従って、環境変数PORTを使って受け待ちするようなmix serverを作製した。これをtinymdのmix.exsのdepsに追加してビルドすると、mix heroku -p $PORTが使えるようになるため、Procfileに以下のように書いておく事でデプロイできるようになる。

web: MIX_ENV=prod mix heroku -p=$PORT

もちろんheroku関係なくこのコマンドでアプリの起動は可能。

git push heroku

ローカル環境でうまく動くようになったら、
git push heroku

でデプロイ。

heroku logs

なにかあったらheroku logsでみてみる。

heroku run mix deps.clean

こまったらmix deps.cleanするのものよい。
herokuでなんどもpushするとビルドに失敗することがある。そんなときは気を取り直して翌日にpushすると治ったりするから謎だ。

https://github.com/k1complete/tinymd

ブツはここにある感じで、cloneしてweb/template/配下にコンテンツを*.mdで記述してherokuにpushするという超手抜きのcmsとなっているw