LoginSignup
94
92

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-02-03

Commit Status APIについて

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

参考: Commit Status API · GitHub Blog

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

こんな感じ。
https://pbs.twimg.com/media/BCAnariCIAAy5y1.png

travis-ciを使ってると上手いことやってくれるんですが、今の所、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

高度な設定のChoosing starategyで、inverseを選びターゲットのブランチを逆転させる。
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

commit_statusパラメーターを使ってgithubのAPIを叩く。
ここではCLIで実行できる簡単なGemを作って、APIにアクセスしやすくしています。
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

失敗した時はcommit_statusにfailureを渡す。
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というプラグインがあり、そのプラグインで、同じような事が可能なのですが、pull requestをポーリングしていたり、ある程度ワークフローが決まっているようなので、多少使い辛かったので、自前で構築しました。

おまけ

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

joker1007/github-commit-status-updater · GitHub

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

94
92
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
94
92