Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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に上げておくのは、結構オススメだと思います。

repro
世界59か国6,500以上の導入実績を持つCE(カスタマーエンゲージメント)プラットフォーム「Repro(リプロ)」を提供
https://repro.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away