ブロックチェーン事業部の飯田です。
私が現在携わっているプロジェクトでは、プルリクエストを使ってコードレビューを行っています。
今回はそのプロジェクトで、プルリクエストを作成したときにテストとLintを実行するようにJenkins
と連携させたことについて書きたいと思います。
なお、メモを見て思い出しながら記事を書いたので、途中の設定が怪しい箇所がありますがご容赦ください。
環境について
弊社ではGitBucket
を使っているので、GitBucket
とJenkins
の連携になります。
今回使用したGitBucket
とJenkins
のバージョンは以下になります。
ツール名 | バージョン |
---|---|
GitBucket | 4.11.0 |
Jenkins | 2.203 |
GitBucket
やJenkins
のバージョンによっては今回記載したスクショとは違う表示になってしまう可能性があります。その場合は適宜最新の情報を参照してください。
GitBucketの設定 その1
まずはGitBucket
の設定から始めます。
Jenkins
との連携アカウントの作成
GitBucket
にJenkins
からの通知を受け取るアカウントを作成します。
後述するGitHub Pull Request Builder
の設定でユーザ名に.
と_
が使えないので注意してください。アカウントの
Personal access token
の作成
作成したアカウントのAccount Settings
のApplications
のGenerate new token
で作成します。
Token description
に任意の名前を入れてGenerate Token
ボタンで作成されます。token
は作成時にしか表示されないので忘れないようにコピーして保存しておきましょう。リポジトリの
Collaborators
に設定
作成したアカウントを作業するリポジトリのCollaborators
にAdmin
で追加してください。Branch
の設定
ブランチの構成は以下のような想定で進めます。
ブランチ名 | 用途 |
---|---|
master | リリース用 |
develop | 開発環境用 |
feature/* | 各自の開発用 |
まず、develop
ブランチを作成して、Default branch
に設定します。
そして、master
とdevelop
ブランチのProtected branches
でProtect this branch
を選択します。
Require status checks to pass before merging
が選択肢に増えますがこれはあとから設定するのでおいておきます。
設定後は以下のような表示になっているかと思います。
5. Service Hooks
の設定
最後にプルリクエスト時のJenkins
へのフックの設定をあらかじめしておきます。
Payload URL
にはhttps://(your jenkins host url)/gitbucket-webhook/
を指定してください。
これでいったんGitBucket
の設定は終わりです。
Slackの通知設定
次にSlack
で通知を受け取るためJenkins CI
とGitHub Enterprise Server
を任意のチャンネルに追加しておきます。
ここではとりあえず追加しておいて、連携設定は後で行います。
Jenkinsの設定
続けてJenkins
の設定をしていきます。
GitBucket
のプルリクエストとのやり取りにGitHub pull request builder plugin
を使用します。
https://wiki.jenkins.io/display/JENKINS/GitHub+pull+request+builder+plugin
プラグインのインストール
以下のプラグインを入れます。- GitHub pull request builder
- GitBucket Plugin
- Slack Notification Plugin
認証情報
の追加
この後の設定で使用する認証情報を追加しておきます。
メニューから認証情報
→System
と選択した画面でグローバルドメイン
を選択し、認証情報の追加
から追加できます。 追加する認証情報は以下になります。- GitBucket Access User
- 種類 : ユーザ名とパスワード
ユーザ名
とパスワード
に「GitBucketの設定 その1」の1
で作成した「Jenkins
との連携アカウント」のユーザのIDとパスワードを設定する。
- 種類 : ユーザ名とパスワード
- GitBucket Access Key
- 種類 : Secret text
Secret
に「GitBucketの設定 その1」の2
で作成したPersonal access tokens
を設定する。
- 種類 : Secret text
- Slack Integration Token
- 種類 : Secret text
- 「Slackの通知設定」で追加した
Jenkins CI
アプリ設定時に取得できるトークンを設定する。
- 「Slackの通知設定」で追加した
- 種類 : Secret text
- GitBucket Access User
システムの設定
Jenkinsの管理
→システムの設定
から以下の各項目を設定していきます。- GitHub Pull Request Builder
- GitHub Auth
- GitHub Server API URL
GitBucket
のAPIのEndpointのURLを指定します。
例)https://(your domain)/api/v3
- Credentials
- 先ほど作成した認証情報の
GitBucket Access Key
を選択する。
- 先ほど作成した認証情報の
- Description
GitBucket Connection
等を設定
- GitHub Server API URL
- Auto-manage webhooks
- チェックを入れておく
- GitHub Auth
- Slack
- Credential
- 先ほど作成した認証情報の
Slack Integration Token
を選択する。
- 先ほど作成した認証情報の
- Credential
- GitHub Pull Request Builder
ジョブの作成
次にプルリクエストが作成・更新されたら起動するジョブを以下の内容で作成します。- Enter an item name
- ジョブの名前の設定
例)develop - pull request test
- ジョブの名前の設定
フリースタイル・プロジェクト
のビルドを選択
- Enter an item name
ジョブの設定
ジョブの各項目の設定は以下になります。- GitBucket
- GitHub project
- 選択して
Project url
にhttps://(your domain)/{グループ名}/{リポジトリ名}/
といった形式で入力する。
※GitHub Pull Request Builder
プラグインの仕様なのか、https://(domain)/gitbucket/{グループ名}/{リポジトリ名}/
(ドメインとグループ名の間にサブディレクトリが入っている)といったURLを入れても動作しないので注意!
- 選択して
- GitHub project
- ソースコード管理
Git
を選択- リポジトリ
- リポジトリURL
.git
の入った対象リポジトリのURLを設定
- 認証情報
GitBucket Access User
を選択
- 高度な設定
- Refspec
+refs/pull/*:refs/remotes/origin/pr/*
- Refspec
- リポジトリURL
- ビルドするブランチ
- ブランチ指定子 (空欄はすべてを指定)
${sha1}
- ブランチ指定子 (空欄はすべてを指定)
- ビルド・トリガ
GitHub Pull Request Builder
を選択- GitHub API credentials
システム設定
のGitHub Pull Request Builder
のGitHub Auth
のDescription
で設定した名称(例ではGitBucket Connection
)を選択
- Admin list
- 認証情報の
GitBucket Access User
作成時に使用したユーザIDを設定
- 認証情報の
- 高度な設定
- Crontab line
H/2 * * * *
デフォルト5分間隔なので2分間隔に変更する(任意)
- Build every pull request automatically without asking (Dangerous!).
- 選択しなくてもいいかも?
動かなかったら選択してみてください。
- 選択しなくてもいいかも?
- Crontab line
- GitHub API credentials
- ビルド
ここには実際に実行したい処理を設定してください。
私のプロジェクトではNuxt.js
を使用していたのでNode.js
とシェルスクリプトの実行を設定しました。
細かい設定は今回の記事の趣旨と離れてしまうので、また別の記事で紹介したいと思います。 - ビルド後の処理
結果を通知したいサービスの設定をしてください。
今回はSlack Notifications
の設定をしました。
- GitBucket
ここまで設定が終わったら、適当なブランチを作成してGitBucket
へプッシュし、プルリクエストを作成してみましょう!
しばらくすると作成したJenkins
のジョブが動き出し、下記画像のようにステータスが表示されるようになると思います。
動かないですか?
もしかしたら、なにか設定がもれているのかもしれません……。
GitBucketの設定 その2
もし正常にJenkins
のジョブが動くことの確認ができたら、次はまたGitBucket
の設定の続きを行います。
Require status checks to pass before merging
最初の設定時にスキップした箇所です。この設定を行うことでJenkins
でのチェックが通らないとマージできなくすることが可能になります。
プルリクエストでJenkins
のジョブが動いていたら、オレンジ色の背景のメッセージが消えて以下画像のようになっているかと思います。 選択すると下記画像のように選択肢が増えますので、default
を選択してSave changes
のボタンを押して完了です。
※Include administrators
を選択すると管理者でもマージできなくすることができます。 上記設定をすると下記画像のようにチェックが通らないとMerge pull request
のボタンが押せないようになります!Service Hooks
の設定
最後にGitBucket
の操作がSlack
へ通知されるように設定をします。
Payload URL
には「Slackの通知設定」で追加したGitHub Enterprise Server
のWebhook URL
を指定してください。
まとめ
少し長くなりましたが、以上で設定は終わりになります。
プルリクエストのレビュー前にテストやLintのチェックを通すことで、レビューで本来見るべき箇所に集中できるのでおすすめです!
また、コードレビューの方法に関してはまだ模索中なので、まとまったら記事にしていきたいと思います。