warファイルをサーブレットコンテナにデプロイするだけで利用可能なGithubクローン、GitBucket 1.0をリリースしました。
当初の目標(6月末)からは少し遅れてしまいましたが、Gitリポジトリの作成、リポジトリビューア、Wiki、Issuesなどは一通り実装しており、なんとか実用に耐えうる機能は揃っているのではと思います。フォークやプルリクエスト、タイムライン、チーム管理、メール通知などまだまだ未実装の機能は多いですが、今後のバージョンアップで随時機能を追加していきます。
フレームワークとか
少し話は変わりますが、GitBucketはScalaで書かれており、フレームワークとして以下のものを組み合わせて使用しています。
- Scalatra
- scalatra-forms(Play2のフォームのようなバリデーション&マッピング用ライブラリ)
- Twirl(Play2のようなタイプセーフなHTMLテンプレート)
- Slick(ScalaQueryの後継)
- JGit
- jQuery
- Bootstrap
Scalatra、scalatra-forms、Twirlの組み合わせでほぼPlay2と同じ感覚でコントローラを実装することができます。Play2と比べて不便だなと感じるのはroutesによる逆引きがないのとTwirlのコンパイルエラーが若干わかりにくいというくらいでしょうか。
とはいえ、なぜメジャーなPlay2ではなくScalatraを採用したかというと、
- GitBucketはとにかくセットアップの簡単さを追求しており、できればwarで配布したい
- 基本的にイントラで限られたメンバーで使うことを想定しているので並列性が売りのPlay2を使うメリットがない
という感じです。Play2には仕事でいろいろと苦労させられましたが、Scalatraは特にフレームワークに悩まされたということは(少なくとも現時点では)一切ありません。もともとPlay2も大規模なアプリケーションの開発にはいろんな意味で向いていないので、同時接続数を重視するケースでなければScalatraでいいんじゃないかと思います。
SQLはそれほど難しいものはなかったので、今のところFOR UPDATEが必要なクエリ以外は全てSlickのタイプセーフDSLで実装できています。最初は難しくて同僚の作ってくれたサンプル集を見ながらでないとなかなかクエリが書けなかったのですが、慣れると割とすらすら書けるようになりました。やはりタイプセーフなのはいいですね。ただ、Slickに関してはまだバグもそれなりにあるなぁ…という印象です。
ただ、なによりも一番大きかったのはJGitの存在ですね。若干APIに使いにくいなと感じる部分はありますが、そもそもJGitがなかったらGitBucketを作ろうとは思っていなかったです。