コードレビューのツールについての調査

このドキュメントはコードレビューを支援するツールについての調査を行った結果を記述する。

#ツールの紹介
##Redmine Code Review プラグイン
Redmineのプラグインとして動作する。
http://www.r-labs.org/projects/1/wiki/Code_Review

###インストール方法
通常のRedmineのプラグインと同様

###使用方法
リポジトリ―でコミット済みのリビジョンの差分を取り、レビュー用のコメントを記述する。

![review.png](https://qiita-image-store.s3.amazonaws.com/0/47856/8a894997-e165-b2f6-e8fd-e8582e17e937.png)

作成したレビューはプロジェクトのコードレビュータブで一覧として表示される。
![review.png](https://qiita-image-store.s3.amazonaws.com/0/47856/f264a043-25d1-c4ba-fc76-978183def4f5.png)

記述したレビューはチケットとして登録される。
そして、レビューで作成したチケットはリポジトリから返信とステータスの遷移が行える。

##Trac Peer Review Plugin
Tracのプラグインとして動作する。
http://trac-hacks.org/wiki/PeerReviewPlugin

###インストール方法
Trac0.11以前でしか動作しない。

現在のtrac-lightning 3.2.0でインストールされるtrac0.12に適用しても動作しない。

###以前の使用感
以前0.11で動作してた時の使用感は以下の通り。

コミットされた、特定のリビジョンのファイルを指定してコメントを記述する。
Redmineのプラグインと違って差分にコメントを記述するのではない。

登録した内容はPeerReviewタブで確認できる。

##Trac CodeReviewerPlugin
Trac0.12以降のプラグインとして動作する。
http://trac-hacks.org/wiki/CodeReviewerPlugin

Redmineのプラグインと同様に作成したコメントはチケットとして登録される。

###インストール方法
現在のtrac-lightning 3.2.0でインストールされるtrac0.12に適用したが、期待通りに動作しなかった。

##Rietveld
Google App Engine で動作しており、下記の構成管理が利用できる。
・Git
・Mercurial
・Subversion
・Perforce 
https://code.google.com/p/rietveld/

下記のページを見る限り、コミット済みのものをレビューするのでなく、メインラインのコードと、自分が作ったコードの差分を作りそれをチェックするようだ。
http://d.hatena.ne.jp/Wacky/20090720/1248087982

Google App Engine での動作が前提になっているので今回は未検証。
（ローカルのサーバーだけ動作させることができないので、使いづらい）

##ReviewBoard
Pythonで作成されたコードレビューツール。
下記の構成管理ツールが使用できる。
・Bazaar
・CVS
・Git
・Mercurial
・Perforce
・Subversion
コミット前のレビューとコミット後のレビューの両方ができる。
https://www.reviewboard.org/

###インストール方法
Debian7にて検証

１．下記のインストールを行う。

```
$apt-get install apache
$apt-get install libapache2-mod-wsgi
$apt-get install babel python-babel -y
$apt-get install memcached
$easy_install python-memcached
$apt-get install patch
$apt-get install python-dev
$easy_install ReviewBoard

# RBToolsはクライアント側にも必要。
$easy_install -U RBTools

```

２．レビューボードのサイトを作成する

```
rb-site install /var/www/reviews
```

このコマンドを実行すると対話形式でサイトを作成する。
DataBaseはSQLiteにしておくとデータベースの構築が楽になる。

３．作成したサイトをapacheからアクセスできるように所有者を変更しておく

```
$chown -R www-data /var/www/reviews
```

４．/etc/apache2/sites-enabled/000-default に以下を追記

```
	WSGIPassAuthorization On
	WSGIScriptAlias "/reviews" "/var/www/reviews/htdocs/reviewboard.wsgi/reviews"

	<Directory "/var/www/reviews/htdocs">
		AllowOverride All
		Options -Indexes +FollowSymLinks
		Allow from all
	</Directory>

	# Prevent the server from processing or allowing the rendering of
	# certain file types.
	<Location "/reviews/media/uploaded">
		SetHandler None
		Options None

		AddType text/plain .html .htm .shtml .php .php3 .php4 .php5 .phps .asp
		AddType text/plain .pl .py .fcgi .cgi .phtml .phtm .pht .jsp .sh .rb

		<IfModule mod_php5.c>
			php_flag engine off
		</IfModule>
	</Location>

	# Alias static media requests to filesystem
	Alias /reviews/media "/var/www/reviews/htdocs/media"
	Alias /reviews/static "/var/www/reviews/htdocs/static"
	Alias /reviews/errordocs "/var/www/reviews/htdocs/errordocs"
	Alias /reviews/favicon.ico "/var/www/reviews/htdocs/static/rb/images/favicon.png"
```

###使用方法
管理者権限を持つユーザについては、My accountを選択した場合は通常ユーザ、Adminを選択した場合は管理者として動作する。

![review.png](https://qiita-image-store.s3.amazonaws.com/0/47856/f3e0d522-5e59-1c39-9bf3-eed9dc98765c.png)

####管理画面
![review.png](https://qiita-image-store.s3.amazonaws.com/0/47856/964df54b-346d-7681-1652-8af19937cb51.png)

管理画面では次のようなことが行える。
・各種設定の確認と変更
・ユーザの追加
・レビューグループの追加
・リポジトリの追加
・レビューの実施状況の確認

####一般ユーザ
![review.png](https://qiita-image-store.s3.amazonaws.com/0/47856/fa08f5ce-a539-10c7-bdb0-0697b1a1b979.png)

一般ユーザは次のようなことが行える。
・レビューのリクエストを行う
・他人のコードをレビューする。

#####コミット前のファイルのレビューのリクエスト
コミット前のファイルで差分ファイルを作成してサーバーにアップロードする。
![review.png](https://qiita-image-store.s3.amazonaws.com/0/47856/37f4f416-c254-c100-95de-8fd9af87d9d7.png)

その後、Summary,Description,TestingDone,Groupsを入力してPublishを押下することでレビューをリクエストできる。

#####コミット後のファイルのレビューのリクエスト
クライアント側のリポジトリで、「rbt post」コマンドを使用するといい。

```
#リポジトリとReviewBoardの関連を行う
$git config --global reviewboard.url http://debian/reviews/

#特定のリビジョン間の差分をReviewBoardに送信
$rbt post 1d00c734b018545a4c8a853b985028d383b475
39 6c904335c092de5f2aff1dec81d32f7f310416ec
```

すると、DraftとしてAll Review Requestsに登録される。このリクエストは他人には見えない。

![review.png](https://qiita-image-store.s3.amazonaws.com/0/47856/6e3c466c-37a8-8d44-78c7-fd272c60f318.png)

あとは、コミット前のファイルのレビューのリクエストと同様に必要な項目を入力してPublishを行うとリクエストが公開される。

詳しい方法は下記を参照。
 __Review Board に差分を投稿する時の tips (特にgit)__ 
http://qiita.com/thrakt/items/b758a3990560555efb1a

###レビューの方法
レビュワーはレビューリクエストにコメントを記述するが、出荷可能なら「ShipIt!」にチェックをつけて返信する。
![review.png](https://qiita-image-store.s3.amazonaws.com/0/47856/a6485193-8b3a-bc45-b125-6c0c2e27d30d.png)

レビューの対象者は、その意見を元に変更を「Submitted」で適用するか、「Discarded」で捨てるか判断をする。
![review.png](https://qiita-image-store.s3.amazonaws.com/0/47856/55105209-5fe0-4537-b702-fe26e5b6d9f2.png)

##Codestriker
Perlで作られたツールで、CVS, Subversion, Clearcase, Perforce, Visual SourceSafe 、Bugzillaなどが使用できる。
http://codestriker.sourceforge.net/

2009-11-02以降更新していない。

###インストール方法
Perl5.8と5.10しかサポートしていないので、新しいバージョンだと正常に動作しない可能性がある。
http://sourceforge.net/p/codestriker/discussion/135212/thread/956df489/

インストール方法は下記を参照。

 __Codestrikerのインストール方法__ 
http://forza.cocolog-nifty.com/blog/2009/04/codestriker-7c9.html

・codestriker.confに使用するDBの情報と、使用するリポジトリの一覧を入力する。

・SQLiteも一応動くが、動作が不安定である。

・./bin/install.plを実行するとエラーメッセージがでるので、それに合わせて足りない、ライブラリを「cpan」を使用してインストールしていく。

・それ以前に、以下のようなエラーが発生する場合、

```
(Do you need to predeclare croak?)
```

"croak" を"die"に置き換えていく。

・Apacheのリスタートで 以下のようなエラーが発生する場合、

```
 ... waiting [Thu Jul 24 06:09:54 2014] [warn] The Alias directive in /etc/apache2/sites-enabled/000-default at line 74 will probably never match because it overlaps an earlier ScriptAlias.
```

"/var/www/cgi-bin/codestriker/cgi-bin/"と"/var/www/cgi-bin/codestriker/html/"の記述の順番を変えると上手くいく。

・アクセスしてもCSSやJSが見つからないとかいう不具合がでたら、下記のスクリプトを修正する。ここで、パスを作成している。

```
vim  ../lib/Codestriker/Http/Response.pm
```

###使用方法
![review.png](https://qiita-image-store.s3.amazonaws.com/0/47856/28f8d120-875c-19fd-cb41-5cda0cc1a49d.png)

トピックとしてレビュー対象を登録する。
このとき、変更前のリビジョン番号、変更後のリビジョン番号、対象のファイルまたはディレクトリ名を指定する。

レビュワーは対象のコードにコメントをつけていく。
![review.png](https://qiita-image-store.s3.amazonaws.com/0/47856/9fa1285c-8a41-3130-4231-b4c0255aae93.png)

##Barkeep 
gitのみ。未検証
http://getbarkeep.org/

##gerrit
gitのみ。未検証
https://code.google.com/p/gerrit/


#まとめ
新規にレビュー用のツールを導入する場合で、Subversion,Gitの両方の選択肢を残しておきたいなら、「Redmine Code Review プラグイン」または「ReviewBoard」が有力な選択候補となる。

ReviewBoardは豊富な機能を有していて、特にコミット前のレビューが可能なのが魅力ではある。
しかしながら、日本語化が不十分なツールを別途導入することは作業者の学習コストなどのコストがかかることが予想される。

RedmineCodeReviewプラグインはコミット前のレビューはできないものの、Redmineのプラグインとして動作し、レビュー結果もチケットにすぎないので、導入コストは、ほぼないと言える。

レビューを行わない文化の組織ではRedmine Code Reviewプラグインを導入した方がスムーズにすすむ。
そして、レビューが必須な文化になった時点で、Redmine Code ReviewプラグインがものたりなくなったらReviewBoardを導入するのが望ましいだろう。

なお、構成管理がGitの場合、pull requestや、強力なブランチの作成機能で、特別にレビューツールを導入しなくてもコードレビューが可能であると考えられる。