Githubのpull requestページに、テスト結果を表示するJenkinsの設定

# Commit Status APIについて
Githubにはcommit statusを操作するためのAPIがあります。
commit statusとは、特定のコミットがどういう状態にあるのかを示すものです。
successとかfailureとかpendingとか。

参考: [Commit Status API · GitHub Blog](https://github.com/blog/1227-commit-status-apis)

commit statusが登録されているコミットをpull requestすると、commit statusの状況を確認して、マージしても問題無いかを自動で表示してくれます。

こんな感じ。
![https://pbs.twimg.com/media/BCAnariCIAAy5y1.png](https://pbs.twimg.com/media/BCAnariCIAAy5y1.png)

travis-ciを使ってると上手いことやってくれるんですが、今の所、Jenkinsだと多少工夫が必要です。

いくつかやり方はありますが、私が採用したのは[parameterized trigger plugin](https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin)を使う方法です。

# 設定内容
### 1. masterや、release等のマーカーとして使っているブランチ以外にpushされたら、branch用のテストジョブを走らせる

Branches to Buildにmasterとreleaseを指定。
![http://cdn-ak.f.st-hatena.com/images/fotolife/j/joker1007/20130203/20130203171618_original.png?1359879440](http://cdn-ak.f.st-hatena.com/images/fotolife/j/joker1007/20130203/20130203171618_original.png?1359879440)

高度な設定のChoosing starategyで、inverseを選びターゲットのブランチを逆転させる。
![http://cdn-ak.f.st-hatena.com/images/fotolife/j/joker1007/20130203/20130203171619_original.png?1359879477](http://cdn-ak.f.st-hatena.com/images/fotolife/j/joker1007/20130203/20130203171619_original.png?1359879477)


### 2. parameterized buildで、commit statusをアップデートする子ジョブを作る

commit_statusというパラメーターを受け付ける。
![http://cdn-ak.f.st-hatena.com/images/fotolife/j/joker1007/20130203/20130203172602_original.png?1359879973](http://cdn-ak.f.st-hatena.com/images/fotolife/j/joker1007/20130203/20130203172602_original.png?1359879973)

commit_statusパラメーターを使ってgithubのAPIを叩く。
ここではCLIで実行できる簡単なGemを作って、APIにアクセスしやすくしています。
![http://cdn-ak.f.st-hatena.com/images/fotolife/j/joker1007/20130203/20130203172603_original.png?1359880079](http://cdn-ak.f.st-hatena.com/images/fotolife/j/joker1007/20130203/20130203172603_original.png?1359880079)

### 3. テスト実行ジョブからparameterized triggerで成功状況を子ジョブに伝える

成功した時はcommit_statusにsuccessを渡す。
また、同一のコミットで子ジョブを流せるように、pass-through Git commitの設定も行う。
![http://cdn-ak.f.st-hatena.com/images/fotolife/j/joker1007/20130203/20130203171621_original.png](http://cdn-ak.f.st-hatena.com/images/fotolife/j/joker1007/20130203/20130203171621_original.png)

失敗した時はcommit_statusにfailureを渡す。
![http://cdn-ak.f.st-hatena.com/images/fotolife/j/joker1007/20130203/20130203171620_original.png](http://cdn-ak.f.st-hatena.com/images/fotolife/j/joker1007/20130203/20130203171620_original.png)

### 結果
これで、何かしらのトピックブランチがpushされた時にはブランチ用のテストジョブが実行され、実行結果から判断したcommit statusがパラメーターとして子ジョブに渡され、そこからAPIにアクセスする事で、pushされたコミットのテスト結果を毎回commit statusに記録できるようになります。
後は、適当なタイミングでpull requestすれば、そのpull requestがテストを通っているかどうかが、一目で判断できるようになります。

実は[GitHub pull request builder plugin](https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin)というプラグインがあり、そのプラグインで、同じような事が可能なのですが、pull requestをポーリングしていたり、ある程度ワークフローが決まっているようなので、多少使い辛かったので、自前で構築しました。

### おまけ
私はRailsがメインなので、Railsからcommit statusを更新しやすくするために、非常にシンプルなGemを作りました。

[joker1007/github-commit-status-updater · GitHub](https://github.com/joker1007/github-commit-status-updater)

ただのCLIツールをGemにラップしただけなので、rubygemsにはリリースしていません。
こんな感じでCLIのツールをGemとしてラップしておくと、Gemfileに書いておけば、更新したり各環境にデプロイする時に一緒に配置できるので、slaveがあちこちにあっても楽チンです。
暇があったら、CLIのツールもGem化してgithubに上げておくのは、結構オススメだと思います。