JenkinsプラグインのGitHub pull request builder pluginを使ってみる

現在、GitHubのPull Requestでコードレビューし、問題なければマージするというフローで開発しているのですが、
コードは問題なさそうなのでマージしてみると、specが落ちている・・といったことがありました。

そこで、Pull Requestされた時点でそれをマージしspecを実行してくれる、そしてその結果を通知してくれる
といったことが自動でできれば良いなと考えていました。
そこで発見したのがGitHub pull request builder pluginというJenkinsのプラグインです。

このプラグインは、以下のようなことをやってくれます。

  • Pull Requestされた(またはそのPull Requestにコミットを積み重ねた)時にそれを検知し、自動でマージしビルドしてくれる

  (実際はcrontabで設定したタイミングで)

  • GitHubのPull Requestページに、その結果を反映してくれる(ビルドに成功したとか、失敗したとか)
  • GitHubのPull Requestページに、設定しているフレーズをコメントすると再ビルドしてくれる

設定

若干設定に戸惑いましたが、以下の流れでうまくいきました。
詳細はGitHub pull request builder plugin - Jenkins - Jenkins Wikiをご参照ください。

  1. 事前準備
    • 対象リポジトリのコラボレータにボットユーザを追加する
  1. プラグインをインストールする
  1. Jenkinsの全体設定でGitHub pull request builderの設定を行う
    • Jenkinsの管理 -> システムの設定 -> "Github pull requests builder" セクションへ
    • 事前準備で作成したGitHubのボットユーザのユーザ名とパスワードを設定する("Username"と"Password" フィールド)
      (パスワードではなくアクセストークンを使用したい場合は "高度な設定 -> Access Token" に登録する)
    • すべてのジョブに対するadminのGitHubユーザを登録する("Admin list" フィールド)
      (ここで登録したユーザが各ジョブで自動でadminとなる。各ジョブで変更することも可能)
    • 高度な設定から
      • whitelistに登録するフレーズを設定する("Add to white list phrase" フィールド)
        デフォルトは ".*add\W+to\W+whitelist.*" (Java正規表現で設定)
      • テストするPull Requestを許可するフレーズを設定する("Accept to test phrase" フィールド)
        デフォルトは ".*ok\W+to\W+test.*" (Java正規表現で設定)
      • 再ビルドするフレーズを設定する("Test phrase" フィールド)
        デフォルトは ".*test\W+this\W+please.*" (Java正規表現で設定)
      • crontabを設定する("Crontab line" フィールド)
        デフォルトは "*/5 * * * *" だったような・・・
      • (パスワードを使わない場合)アクセストークンを設定する("Access Token" フィールド)
  1. ジョブの設定を行う
    • 新しいジョブを作成する
    • "Repositories -> Repository URL" を設定する(e.g.:"git@github.com:username/repository_name.git")
    • 高度な設定から
      • "Repositories -> Refspec" に次の値を設定する

+refs/pull/*:refs/remotes/origin/pr/*

    • "Branches to build -> Branch Specifier" に次の値を設定する

${sha1}

    • "ビルド・トリガ" セクションの "Github pull requests builder" にチェックを入れる
    • adminのユーザを設定する("Admin list" フィールド)
      Jenkinsの全体の設定で登録したadminがデフォルトで入る(たぶん・・・)
    • 高度な設定から
      • crontabを設定する("Crontab line" フィールド)
        Jenkinsの全体の設定で登録したcrontabがデフォルトで入る
      • whitelistを登録する("White list" フィールド)

結果

上記の設定を行った後、Pull Requestを出してみてください。
crontabに設定したタイミングでPull Requestを検知し、ビルドを実行してくれるはずです。

GitHubのPull Requestページは以下のようになります。

  • ビルド中

  • ビルドが成功した場合

  • ビルドが失敗した場合

  • 各コミットにグリーン、レッドマークがつく


ビルドのステータスによって色分けされ、とても分かりやすいですね^^
これにより、Pull Requestのビルド結果をマージする前に知ることができ、冒頭で書いたような問題が解消されました。

Pull Requestをトリガーにして何かをするという場合、とても良いプラグインだと思います。
後は結果をIRC等で通知しても面白そうですね。

注意点とフレーズについて

Pull Requestを出したユーザがadminまたはwhitelistに登録されていない場合は、自動でビルドされません。
この時、ボットが "Can one of the admins verify this patch?" とコメントします。

adminユーザがビルドして良いと判断したとき、 下記2つのどちらかのフレーズをコメントし、ビルドを実行します。
(adminユーザ以外がこの2つのフレーズをコメントしても動きません)

  • ok to test
    Pull Requestがテストされるのを許可し、ビルドを実行する
  • add to whitelist
    whitelistにPull Requestの作成者を追加、Pull Requestがテストされるのを許可し、ビルドを実行する

再度ビルドを実行したい場合、下記フレーズをコメントすれば、再ビルドしてくれます。
(これはadminユーザまたはwhitelistに登録されたユーザが実行できます)

  • test this please
    再度ビルドを実行する

whitelist周りの設定が煩わしい場合は、ジョブの設定の段階でwhitelistを登録しておくと良いと思います。

備考

Jenkins1.442からは、プラグインを再起動しないでインストールできるようになりましたが、
今回Github pull requests builder pluginの設定を行う際、それができずエラーとなってしまいました。

原因はPersona Pluginによるものでした。Jenkinsにおいて画像を扱うプラグインのようです。
これをインストールしていると「再起動せずにインストール」ができません。

この現象が問題となる場合は、Persona Pluginを外した方がいいかもしれませんね。