GitPrepをcartonベースでインストールする

いろいろあって、GitPrepを試してみることに。

http://gitprep.org/

共有サーバでのセットアップ手順の他に普通にLinuxでセットアップする方法(setup.shを実行するやつ)もREADMEに書いてあるが、都合上モジュール類をcartonで処理したい。

セットアップスクリプトや起動用のラッパーを読むと、要するにモジュールのサーチパスをどうこうしているだけなので、基本的には「ただのMojoliciousプロジェクト」である。ということは、適切な環境さえ用意すれば、あとはscript/gitprepを叩くだけで動く。

cartonに環境構築を任せるなら、難しいことを何一つ考えなくてもcarton execで動作させることができる。はずだ。

前提

  • cartonがインストール済みで正しく動く

git cloneする

git clone https://github.com/yuki-kimoto/gitprep

cpanfileを書き換える

setup.shやその他のセットアップコード、実行スクリプト、同梱モジュールなどを見ると、プロジェクトのコンセプトは「プロジェクト内で完結すること」である。

例えば、基本になるcpanmもMojoliciousフレームワークも同梱されている。その他の同梱されていない依存モジュールはcpanfileに書いてある。同梱してあるcpanmを使ってインストールするという前提だ。

また、各種セットアップスクリプトや実行用ラッパーなども、それを前提としてパスや環境変数の調整を行うようになっている。

これはこれで完結していて良いとは思うのだが、モジュールのインストールパスが何だかよく分からないことになる危険がある。

今回は、環境の調整等も含めて全てcartonで処理したいので、同梱されているいろいろを無視してcpanfileだけ活用する。が、肝心のMojoliciousとかが書いていない(前述の通り含まれている)ので、書かれていない依存モジュールをcpanfileに書き加えておく。

いろいろ調べたり動かしたりした結果、書かれていなくて加えなくてはならなかったのは以下。

requires 'Mojolicious', '== 4.07';
requires 'Mojolicious::Plugin::INIConfig', '== 0.02';
requires 'Mojolicious::Plugin::BasicAuth', '== 0.07';
requires 'Mojolicious::Plugin::AutoRoute', '== 0.12';

バージョン指定は、mojoディレクトリに含まれる「同梱されてきたMojolicious」の各モジュールバージョンにした。

たぶんバージョンにそれほどこだわりはなかろうが、Mojoliciousの最新を持ってくるとvalidationの仕組みが微妙に変わっていたりして動かなくなったりする。まぁ、最新にして「動くようにする」というのでも良い。さほど大変でもないだろう。

carton install

依存モジュールをがばっと入れる。

carton install

して待つだけ。

実行

cartonで必要なモジュールを全部入れたので、同梱の起動スクリプトを使用せず、cartonで直接実行すれば良い。とりあえず試すなら開発サーバにて。

carton exec — morbo script/gitprep

無事立ち上がればOK。

デプロイ等、実運用でのノウハウはそれぞれにお任せします(丸投げ)。どうせただのMojoliciousプロジェクトなので、情報ならどうにでもなるだろう。

上記の依存モジュール調査では、実行してみて足らないものを足す、というのもやった。たぶん上記のレシピだけで問題はないはず。

留意点

当然だが、Mojoliciousがリポジトリに含まれているとかを無視してcartonで入れてしまっているので、今後のアップデートの際に、git pullしたらだいたいアップデート完了!とはならないだろうと思う。アップデート時には主にcpanfileを保守してcarton installというのが基本フローになるだろう。

感想

多少心得があるなら、いろいろ考えるより「普通にMojoliciousプロジェクトをデプロイする」方式のほうが、むしろ馴染みがあって楽なのでは、と思った。

GitPrepについては、本当に気軽に使えるのが良いなと思う。gitoliteみたく、 公開鍵 + sshでのアクセスもユーザー情報と絡めてうまい感じにハンドリングしてくれると嬉しいな。HTTPでも悪くはないけど、使いどころによってはSSLとか考えないといけなくて、その点gitoliteは考えることが少なくて良い。

とはいえ何より、独自の仕組みとかではなく汎用フレームワーク上に作ってあるので、好みに合わせて手出しやすいのが良いかなぁ。本当に欲しいなら自分で付ければ良いのだ。