Commit Status APIについて
Githubにはcommit statusを操作するためのAPIがあります。
commit statusとは、特定のコミットがどういう状態にあるのかを示すものです。
successとかfailureとかpendingとか。
参考: Commit Status API · GitHub Blog
commit statusが登録されているコミットをpull requestすると、commit statusの状況を確認して、マージしても問題無いかを自動で表示してくれます。
travis-ciを使ってると上手いことやってくれるんですが、今の所、Jenkinsだと多少工夫が必要です。
いくつかやり方はありますが、私が採用したのはparameterized trigger pluginを使う方法です。
設定内容
1. masterや、release等のマーカーとして使っているブランチ以外にpushされたら、branch用のテストジョブを走らせる
Branches to Buildにmasterとreleaseを指定。
高度な設定のChoosing starategyで、inverseを選びターゲットのブランチを逆転させる。
2. parameterized buildで、commit statusをアップデートする子ジョブを作る
commit_statusパラメーターを使ってgithubのAPIを叩く。
ここではCLIで実行できる簡単なGemを作って、APIにアクセスしやすくしています。
3. テスト実行ジョブからparameterized triggerで成功状況を子ジョブに伝える
成功した時はcommit_statusにsuccessを渡す。
また、同一のコミットで子ジョブを流せるように、pass-through Git commitの設定も行う。
失敗した時はcommit_statusにfailureを渡す。
結果
これで、何かしらのトピックブランチが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に上げておくのは、結構オススメだと思います。