jenkins と ghprb,github commit status を使った仕事が楽になる 10 の設定

jenkins と ghprb,github commit status  を使った仕事が楽になる 10 の設定

「ぐるぐるイーグル」チームでエンジニアをしている @takesato こと佐藤(たけ)です.

「ぐるぐるイーグル」では,エンジニアだけでなく企画もデザイナも github を使用して仕事をし,お互いレビューをするという環境ができあがっています.
see. 【GGG#4】Aiming『ぐるぐるイーグル』にみるゲーム性を左右する背景マップの作り方…職種を超えた挑戦が効率的なワークフローを生む | Social Game Info

プロジェクト開始当初から Jenkins も導入しており,Jenkins の結果を github に反映していました.
しかし,github の表示できるステータスは長い間1つのみだった為, 「ぐるぐるイーグル」 での Jenkins の Job は色々なチェックを全て一つの Job でおこなっていました.
Job の分割を行なうと色々なメリットがあるので,今回 Job の分割を行ないました.
いくつかその時に得た知見を紹介してみようと思います.

ちなみにメリットはこのようなものがあります.

  • 分割した Job 単位で成功失敗がわかる.
    • 1つの Job の場合,途中で失敗した場合,残りの処理が成功するのか失敗するのかがわからない.
  • 依存しない Job であれば,複数同時に実行する事ができ,時間の短縮にも繋る.
  • A(Unity), B(Ruby) のようなテストの場合, B を実行するサーバだけ Linux のサーバに移すといった事もやりやすくなる.
  • 失敗した Job だけを再開できる(要 rebuild plugin)

github commit status  が複数表示できるようになっていた

まず,今回分割を行なおうと思った理由として, github commit status  が複数表示できるようになったのが挙げられます.
Jenkins を最初に構築した時は status の表示が一つだったので,Job を分割しづらい状況でした.
しかし 2014/12/9 に status を複数表示する機能が追加された為(See results from all pull request status checks), Job を分割しても個別にステータスを表示できるようになりました.
これにより Job を分けてもそれぞれの Job の結果を github 上で表示できるようになりました.

ghprb で github commit status  を更新する

セキュリティ等の都合もあり,弊社では Github Pull Request Builder plugin (以下 ghprb )を使用しているプロジェクトが多いです.
設定画面はバージョン毎に変わる可能性があるので,参考程度にしてください.原稿時に使用していたバージョンは 1.29.4 になります.

ghprb も githubs status api の更新にあわせてアップデートされており,現在のバージョンであれば plugin の設定だけで github commit status  の更新ができます.
設定方法も簡単で plugin 全体の設定をした後, github commit status  更新したい Job の設定で ビルド環境Set GitHub commit status with custom context and message (Must configure upstream job using GHPRB trigger) にチェックをいれるだけです.
あとは必要なステータスの時に, github 上でどういったメッセージを表示するかを設定すれば設定は完了です.
img1

  • Commit Status Context
    • ここを空にすると default が更新されます.この context 単位で github にはステータスが表示されます
  • Commit Status URL
    • github commit status  からリンクさせたい url を指定します.ここは空だと jenkins の job への url が設定されます.
  • Commit Status Build Triggered / Commit Status Build Started
    • それぞれ job スタート時と,job 内のビルドが実際に開始した時に github commit status  に表示するメッセージを指定します.二つわかれているのは,ビルドを実際に初めるまでに前処理がいろいろある為です.
  • Commit Status Build Result
    • ビルドが終った後に github commit status  を更新する内容を設定します.成功や失敗等,ステータスに応じて設定する事が可能です.

このような設定をすると,github 上でこのような表示になります
img2

基本的にはこの設定をするだけで, github commit status  を更新できるようになります.

しかし Set GitHub commit status with custom context and message (Must configure upstream job using GHPRB trigger) には問題があり,かっこ内に書いてある通り ghprb を使用していない場合は使用する事ができないといった問題がありました.正確には upstream の job が ghprb を使用していれば使えるのですが,それだけでは動作しませんでした.

Parameterized Trigger plugin を使って Jenkins の Job を分割する

前項の通り, ghprb を導入すれば github commit status  の更新は簡単に行なえるのですが,Job を分割する場合,全ての Job に ghprb を導入する必要がでてしまいます.
しかしこれでは親の Job が失敗した場合に,子の Job を実行しない…といった構成ができません.

jenkins 単独でも job の親子関係を構築できるのですが,この設定では子の job では ghprb の機能が使えませんでした.
そこで Parameterized Trigger plugin を導入する事にしました.

Parameterized Trigger plugin は親 Job から子 Job を起動する際に,パラメータを色々な方法で設定する事ができる Plugin になります.
この Plugin の設定の一つに `Current build parameters` と言う設定があり,これを使うと ghprb によって設定されたパラメータを全て引き継いで子の Job を起動する事ができるようになります.
img3

これにより,子の Job でも ghprb の機能である Set GitHub commit status with custom context and message が使えるようになりました.

次回

長くなってしまったので一旦今回はここまで.
次回は

  • credential を設定する
  • github commit status  の応用
  • github commit status  の default を非表示にする
  • slack への通知に plugin を使用しないで custom job を作成する

の4本をお送りする予定です.