読者です 読者をやめる 読者になる 読者になる

Lambdaカクテル

DESCRIBING: Scala, Akka, P2P, Scheme, Political sth., etc.

野良Play! FrameworkをPaaSにデプロイするはなし

scala play paas sbt

おひさしぶりです。

さて、懲りもせずにP2P2chのコードを書いておりまして、デプロイとCIを自動化したいな〜などと思ったのでPaaSを色々と調べた。 昔Herokuで実験したが、向こうが用意したPlay frameworkしか使うことができず、こちらがコンパイルしたものを使うことができなかった。 僕が開発しているものはPlay frameworkの内部に干渉してしまうため、一度こちらが改造してコンパイルしたものを利用するが、これが不可能となるとデプロイできない。

改造箇所は、HTTPリクエストのエンコーディングの部分。 PlayはHTTPリクエストをUTF-8として決め打ちして処理し、必ずUTF-8でレスポンスを返す。 このためShift-JISのみに対応したクライアントと通信することができない。 そういうわけでリクエスト処理の部分とレスポンス送信の部分を、Shift-JISを利用するように改造した。 このバイナリがないいと通信できないから当然これに対応したPaaS、つまり自己ビルドのPlayを利用できるPaasを探した。

OpenShift

なにやらOpenShiftでは野良ビルドのPlayが使えるみたいだ。DIYカートリッジを利用することで、自由なアプリケーションをデプロイすることができる。 早速OpenShift上のJenkinsでPlayをビルドしてみたらあっさりうまく行った。

気を良くして他のモジュールもビルドしていると、sbtがインストールされていない。 インストールするが動作しない。

[hogehoge-piyopiyo.rhcloud.com fugafuga]\> java -Dsbt.log.noformat=true -jar /var/lib/openshift/4545072167417/app-root/data/jobs/download_sbt/workspace/sbt-launch.jar clean test scalastyle scct:test
java.io.IOException: そのようなファイルやディレクトリはありません
        at java.io.UnixFileSystem.createFileExclusively(Native Method)
        at java.io.File.createNewFile(File.java:1006)
        at xsbt.boot.Locks$.apply0(Locks.scala:35)
        at xsbt.boot.Locks$.apply(Locks.scala:28)
        at xsbt.boot.Launch.locked(Launch.scala:178)
        at xsbt.boot.Launch.app(Launch.scala:93)
        at xsbt.boot.Launch.app(Launch.scala:91)
        at xsbt.boot.Launch$.run(Launch.scala:51)
        at xsbt.boot.Launch$$anonfun$explicit$1.apply(Launch.scala:45)
        at xsbt.boot.Launch$.launch(Launch.scala:65)
        at xsbt.boot.Launch$.apply(Launch.scala:16)
        at xsbt.boot.Boot$.runImpl(Boot.scala:32)
        at xsbt.boot.Boot$.main(Boot.scala:21)
        at xsbt.boot.Boot.main(Boot.scala)
Error during sbt execution: java.io.IOException: そのようなファイルやディレクトリはありません

さて、sbtが動かなくては作業できない。試行錯誤してみたがどうやら無理みたいだ。 ここで方針を転換した。OpenShiftはデプロイ専用とし、CIは自前のサーバで行う。どうせCIは非公開なので好きにすることにする。

nginx

さて、頭を捻っているときに唐突に思い浮んだが、Playを謹製?ビルドで普通にデプロイし、プロキシでエンコーディングを変換してしまえばいいのではないか?

クライアント ---> nginx ---> Play ---> nginx ---> クライアント

調べてみるとnginxにはエンコーディングを変換するモジュールがある。使えそうだが今回は保留としておく。なぜならクライアントがエンコーディングを明記してくれないため、うまく動作するかが不明だから。

さて、そういうわけでOpenShiftはRedmineとデプロイサーバ(いわゆる本番)として使うかもしれない、というおはなしでした。