Jenkinsでプルリクエストをビルドする

プラグインに設定オプションが多すぎて、設定の違いにより思い通りに動いたり動かなかったりしたので自分なりにまとめた。

基本的にはまず以下のリンクを参考にしてセットアップしてください。

[JenkinsプラグインのGitHub pull request builder pluginを使ってみる](http://d.hatena.ne.jp/oovu70/20130118/p1)
-> ビルドの結果のキャプチャあり（参考にしたソース、内容はほぼ同じ）

[Jenkins wiki - GitHub pull request builder plugin](https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin)
[GitHub - ghprb-plugin](https://github.com/jenkinsci/ghprb-plugin)

説明通りセットアップしたものの、自分のところではうまく動作しなかった部分を以降にまとめました。

## GitHubの設定

個人とか少数で使う場合は必ずしも必要ない
-> Jenkinsプラグインのジョブの設定でAdmin listに設定すれば良い

##### Jenkinsプラグインのジョブの設定でList of organisationsを使う場合

* Pushできる権限のチームにJenkinsで使うユーザーを追加
  * 自動コメントさせたければbotユーザーを作っても良い
  * 別のAdmin権限のチームの人も同じチームに追加しないといけない

例えばPushもAdminも権限がある違うチームがある場合、その中のメンバーもJenkins用ユーザーのチームに追加する必要がある
[Github Team permissioins](https://help.github.com/articles/what-are-the-different-access-permissions)

## Jenkinsプラグインの管理

* GitHub Pull Request Builder (>= 1.9)
* Git Pluginは2.0はまだ不安定かもしれないので、1.Xの方が良い

## システムレベルの設定

Jenkinsの管理 > システムの設定

#### Jenkinsの位置 - Jenkins URL

* Pull Request上のリンクに使われる
* ローカルなら `http://127.0.0.1:8080/` など

#### GitHub pull requests builder

* Access Token
  * GitHubのページで作成 [https://github.com/settings/applications] > Personal Access Tokens
  * または 高度な設定 -> Username/Password を入力して Create access token
* Admin list (任意)
  * GithubのUsername
  * ジョブ作成時のデフォルト値としてコピーされる
* Crontab line (任意)
  * `H/5 * * * *` 推奨。ジョブ作成時のデフォルト値としてコピーされる
* Published Jenkins URL (任意)
  * ローカルなら `http://127.0.0.1:8080/` など
  * この値が設定されると、ビルド後Test PASSed/FAILed. などのコメントをするようになる

## 各ジョブの設定

一つのジョブで通常のbranchとPull Requestを同時に扱えないみたいなので別ジョブを作る必要がある

#### GitHub project (プロジェクト名の少し下)

* URLを設定 `https://github.com/username/repository_name`

#### ソースコード管理 Git

* Repository URL `git@github.com:username/repository_name.git`
* 高度な設定
  * Refspec `+refs/pull/*:refs/remotes/origin/pr/*`
* Branch Specifier `${sha1}`

#### ビルド・トリガ

* GitHub pull requests builder をチェック
  * Admin listかWhite listかList of organisationsの権限の設定が必要
  * Admin list - GitHubのユーザー名
  * List of organisations - GitHubのチーム名
  * Crontab line - ポーリングスケジュールを設定

#### ビルド

* シェルの実行（例）
  * `bundle install`
  * `rake test`

## ビルドの実行

* デフォルトはcronでポーリングする
* 設定でgithub hookも可能
* Pull Request上のコメントで起動

#### Pull Request上にコメントして起動

* `test this please`
  * 設定などが間違っていて起動しない時や、強制的に再度ビルドしたい時
* `add to whitelist`や`ok to test`
  * Admin list, White list, List of organisationsなどを変更した場合は、それだけではそのPull Requestに対して権限を再評価しないような動きなので`add to whitelist`や`ok to test`をコメントする必要がある
  * コメントするユーザーはそのジョブでAdmin listに追加されている必要がある

acceptedの確認 -> [GhprbPullRequest#checkComment のロジック](https://github.com/jenkinsci/ghprb-plugin/blob/master/src/main/java/org/jenkinsci/plugins/ghprb/GhprbPullRequest.java)

#### 設定がうまくいっていない場合

画面上は問題が分かりにくいためログを確認すると良い

* Author of #1 username on username/repository_name not in whitelist!
  * Github上にコメント `Can one of the admins verify this patch?` される
* GitHub project not set up, cannot start trigger for job GhprbTest
  * GitHub project のURLが設定されていない

問題を調べる方法として、各ジョブ、ビルドの状態はJENKINS_HOMEの以下のファイルに記録されている
`$ cat org.jenkinsci.plugins.ghprb.GhprbTrigger.xml`

## 推奨プラグイン

* [Template Project Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Template+Project+Plugin)
  * 他のジョブのビルドやレポート設定を再利用できる
  * ビルド > Use builders from another project

## 同時に使うと問題のあるプラグイン

* [JobConfigHistory](https://wiki.jenkins-ci.org/display/JENKINS/JobConfigHistory+Plugin)
  * 設定の変更履歴を保持し、変更点のdiffが見れるプラグイン
  * 問題はhistoryのファイルが空き容量を食いつぶす
  * 例えば5分間隔のポーリング、10ほどのjobで1ヶ月動かすと約10GBといったようにゴミのログファイルがたまる
  * 既知の問題らしい [GhprbTrigger saves its descriptor every time it runs](https://issues.jenkins-ci.org/browse/JENKINS-26494)

対象のログが保存される場所は
`$JENKINS_HOME/config-history/org.jenkinsci.plugins.phprb.GhprbTrigger/`

解決方法はJobConfigHistoryの設定変更

**JobConfigHistoryの設定変更**

システム設定 > システム設定/ジョブ設定の変更履歴

* 除外するシステム設定ファイルのパターンに`|org.jenkinsci.plugins.ghprb.ghprbTrigger`を追加
* 一応、`重複する変更履歴を保存しない`(Do not save duplicate history)もチェック

![JobConfigHistory.png](https://qiita-image-store.s3.amazonaws.com/0/5764/5c0fa46a-6771-d0f2-28e5-4e241a3ab3a2.png)

[参考](http://d.hatena.ne.jp/tyuki39/20110303/1299108685)

~~解決方法はJobConfigHistoryを使うのを止めるか、定期的なログの削除をするか、JobConfigHistoryの設定でなんとかするのが考えられる~~

**定期的なログの削除**

```
# 容量の確認
du -sh .jenkins/config-history/org.jenkinsci.plugins.phprb.GhprbTrigger/

# 14日以前の古いものを削除する
# crontabに設定してもよい
find .jenkins/config-history/org.jenkinsci.plugins.phprb.GhprbTrigger/ -ctime +14 -maxdepth 1 -print0 | xargs -0 rm -rf
```

`.jenkins`は`$JENKINS_HOME`

## その他

* レポートは省略した方が時間の節約になる
* 他の設定でハッシュを直接指定して手動起動することも出来る
* （課題）自動コメントは失敗したときだけコメントするようにしたい