Jenkins Gerrit Trigger Plugin の使い方

  • 2011.10.25
  • CI
Jenkins Gerrit Trigger Plugin の使い方

はじめまして。Aiming で C# を書いてるウェブっ子エンジニアの廣岡 (hirooka) です。

弊社ではすべての開発ラインでコードレビューに Android 開発で有名な Gerrit という Google 製のツールを使っています。
今回は、この Gerrit と CI ツールである Jenkins を組み合わせて使う需要が社内で発生したので、公開社内向けドキュメントにしました。

Jenkins Gerrit Trigger Plugin

Jenkins には Gerrit Trigger というプラグインがあります。このプラグインが行ってくれることは、

  • Gerrit にパッチセットをアップロードすると、そのパッチセットを Jenkins でビルド・テスト
  • Jenkins 上でのビルド・テストの成功・失敗を Gerrit に通知
  • テストに成功していれば CodeReview +1, 失敗していれば CodeReview -2 など

です。
簡単にいえば「Jenkins を Gerrit のレビュワーにできちゃう」とてもハッピーなプラグインなのです。

例えば「気づかないうちにテストでエラーになるコードをアップロードしてたよ、ごめん」→「それ Jenkins がダメ出ししてくれてたから master にマージしてないよ

Gerrit はレビューが OK になって初めて本流ブランチ (master) にマージできるタイプのレビューシステムなので、これまでの Git Plugin だけを使った方法だとレビューブランチにアップロードされていく無数のトピックブランチを統一的に CI することが困難でした。

Gerrit Trigger Plugin は、Gerrit にアップロードされたチェンジセットを直ちにビルドしてテスト結果などをレポートします。レポート結果は Jenkins 上に表示されるもののほか、Gerrit の該当チェンジセットのコメントとレビュースコアにも反映されます。

Gerrit Trigger 導入方法

Gerrit Trigger Plugin の Jenkins への導入方法は https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger に書かれていることを順にたどれば簡単に導入できますが、はまりポイントもあるのでこちらで解説します。

前提知識

* Gerrit Trigger は Jenkins にビルドトリガー(ビルドのきっかけ)を追加するもの
* Gerrit Trigger の内部では、Jenkins から Gerrit への接続は SSH で、Jenkins から Gerrit の操作も Gerrit の CLI である gerrit コマンドを内部的に利用

% gerrit approve --code-review=+1 c0ff33

Gerrit に Jenkins 用ユーザを追加する

Gerrit Trigger は Gerrit 上にコードレビューなどを行う都合上、権限を広く持っておく必要があります。最低限、Read Access, Code Review, Verified の3つの権限は必要です。
※この権限の設定にミスがあってもエラーが出ないので気をつけてください。

Jenkins で Git Plugin と Gerrit Trigger プラグインをインストールする

Gerrit Trigger だけじゃなく、Git Plugin もインストールして置かなければなりません。
Jenkins のプラグインのインストール方法は Plugins – Jenkins Wiki に書いてあるので割愛します。

Jenkins 上で Gerrit への接続設定

Gerrit Trigger のプラグインをインストールすると “Jenkins の管理” ページに Gerrit Trigger の設定へのリンクが追加されています。”Gerrit Hudson トリガ” という名前なので注意してください。

このページで次の画像のように Gerrit への SSH 接続の設定を行います。接続ユーザは先程作成した Jenkins 用の Gerrit ユーザです。弊社では “devbot” という名前にしています。

Gerrit Trigger のビルドのための新規プロジェクト作成

Gerrit Trigger は既存のエッジバージョン用のプロジェクトと相乗りできません。別プロジェクトとして作成してください。

基本的にはほとんどの設定が本流用と同じものになりますので、以下に差分だけ上げます。設定画面の言語は日本語です。

# ビルドトリガーの設定に “Gerritイベント” を選択する
# Gerrit Project の左側の項目に次を記入
** Type : "Plain"
** Pattern : "あなたの Gerrit 上でのプロジェクト名
#  Gerrit Project の右側の項目に次を記入
** Type : "Path"
** Pattern : "**"

ここまでが Gerrit Trigger によるビルドトリガーの設定です。
次からは Gerrit Trigger ではなく Git Plugin の設定になるので注意してください。

# ソースコード管理システムの設定で Git を選択し URL of repository に Gerrit プロジェクトのリポジトリ URL を設定
** このとき、Gerrit のユーザは上記で作成した Jenkins 用のユーザでなくてもよい
# Name of repository は空白を設定
# Refspec には $GERRIT_REFSPEC と記入
** これは Gerrit Trigger のきっかけでビルドが実行されたときに自動的に設定される環境変数
# Branches to build は空白を設定
# Choose strategy には “Gerrit Hudson トリガ” を選択
# それ以外の設定はデフォルトのままが望ましい

これで、Gerrit にアップロードされたパッチセットを自動的に Jenkins でチェックアウトするところまで動くようになります。

このあとはビルドスクリプトの設定やテスト集計やコードメトリクス計測など、通常通りの Jenkins の設定を行なってください。

デバッグ方法

Gerrit Trigger は設定がややこしいことと、導入時にぶつかる問題がよくあるので、設定が正しいかの確認方法が必要です。
これに便利なのが「Gerrit イベントの手動トリガ」です。Gerrit 上の検索や選択したパッチセットの手動ビルド実行ができるので、動かないときにこの機能を使って原因を調査してみてください。
 

注意事項

  • Gerrit Trigger に設定する Gerrit ユーザの権限にミスがあってもエラーが出てくれない
  • Jenkins の Java の文字エンコードが UTF-8 以外で動いてると、日本語環境だとビルドトリガーが動かない(例えば Windows で Jenkins Host を動かしてたらよくある)し、エラーがでない
  • Git Plugin の Choose strategy の設定漏れはよくある
  • Git Plugin のバージョンとの相性が稀に発生する。弊社では Git Plugin バージョンは 1.1.9 、Gerrit Trigger は 2.3.0、Jenkins は 1.427

プロジェクトで Gerrit をお使いの人はぜひ導入してみてはいかがでしょうか。