おひさしぶりです。
さて、懲りもせずに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とデプロイサーバ(いわゆる本番)として使うかもしれない、というおはなしでした。