GitBucketとJenkinsでプルリクエスト開発

ブロックチェーン事業部の飯田です。

私が現在携わっているプロジェクトでは、プルリクエストを使ってコードレビューを行っています。
今回はそのプロジェクトで、プルリクエストを作成したときにテストとLintを実行するようにJenkinsと連携させたことについて書きたいと思います。
なお、メモを見て思い出しながら記事を書いたので、途中の設定が怪しい箇所がありますがご容赦ください。

環境について

弊社ではGitBucketを使っているので、GitBucketJenkinsの連携になります。
今回使用したGitBucketJenkinsのバージョンは以下になります。

ツール名 バージョン
GitBucket 4.11.0
Jenkins 2.203

GitBucketJenkinsのバージョンによっては今回記載したスクショとは違う表示になってしまう可能性があります。その場合は適宜最新の情報を参照してください。

GitBucketの設定 その1

まずはGitBucketの設定から始めます。

  1. Jenkinsとの連携アカウントの作成
    GitBucketJenkinsからの通知を受け取るアカウントを作成します。
    後述するGitHub Pull Request Builderの設定でユーザ名に._が使えないので注意してください。

  2. アカウントのPersonal access tokenの作成
    作成したアカウントのAccount SettingsApplicationsGenerate new tokenで作成します。
    Token descriptionに任意の名前を入れてGenerate Tokenボタンで作成されます。 f:id:teco_iida:20191225101859p:plain tokenは作成時にしか表示されないので忘れないようにコピーして保存しておきましょう。 f:id:teco_iida:20200122163100j:plain

  3. リポジトリのCollaboratorsに設定
    作成したアカウントを作業するリポジトリのCollaboratorsAdminで追加してください。

  4. Branchの設定
    ブランチの構成は以下のような想定で進めます。

ブランチ名 用途
master リリース用
develop 開発環境用
feature/* 各自の開発用

まず、developブランチを作成して、Default branchに設定します。
そして、masterdevelopブランチのProtected branchesProtect this branchを選択します。
Require status checks to pass before mergingが選択肢に増えますがこれはあとから設定するのでおいておきます。 f:id:teco_iida:20191225102042p:plain 設定後は以下のような表示になっているかと思います。 f:id:teco_iida:20191225102117p:plain 5. Service Hooksの設定
最後にプルリクエスト時のJenkinsへのフックの設定をあらかじめしておきます。
Payload URLにはhttps://(your jenkins host url)/gitbucket-webhook/を指定してください。 f:id:teco_iida:20200122162433j:plain

これでいったんGitBucketの設定は終わりです。

Slackの通知設定

次にSlackで通知を受け取るためJenkins CIGitHub Enterprise Serverを任意のチャンネルに追加しておきます。
ここではとりあえず追加しておいて、連携設定は後で行います。

Jenkinsの設定

続けてJenkinsの設定をしていきます。
GitBucketのプルリクエストとのやり取りにGitHub pull request builder pluginを使用します。
https://wiki.jenkins.io/display/JENKINS/GitHub+pull+request+builder+plugin

  1. プラグインのインストール
    以下のプラグインを入れます。

    • GitHub pull request builder
    • GitBucket Plugin
    • Slack Notification Plugin
  2. 認証情報の追加
    この後の設定で使用する認証情報を追加しておきます。
    メニューから認証情報Systemと選択した画面でグローバルドメインを選択し、認証情報の追加から追加できます。 f:id:teco_iida:20200109184023p:plain 追加する認証情報は以下になります。

    • GitBucket Access User
      • 種類 : ユーザ名とパスワード
        • ユーザ名パスワードに「GitBucketの設定 その1」の1で作成した「Jenkinsとの連携アカウント」のユーザのIDとパスワードを設定する。
    • GitBucket Access Key
      • 種類 : Secret text
        • Secretに「GitBucketの設定 その1」の2で作成したPersonal access tokensを設定する。
    • Slack Integration Token
      • 種類 : Secret text
        • 「Slackの通知設定」で追加したJenkins CIアプリ設定時に取得できるトークンを設定する。
  3. システムの設定
    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等を設定
      • Auto-manage webhooks
        • チェックを入れておく
    • Slack
      • Credential
        • 先ほど作成した認証情報のSlack Integration Tokenを選択する。
  4. ジョブの作成
    次にプルリクエストが作成・更新されたら起動するジョブを以下の内容で作成します。

    • Enter an item name
      • ジョブの名前の設定
        例) develop - pull request test
    • フリースタイル・プロジェクトのビルドを選択
  5. ジョブの設定
    ジョブの各項目の設定は以下になります。

    • GitBucket
      • GitHub project
        • 選択してProject urlhttps://(your domain)/{グループ名}/{リポジトリ名}/といった形式で入力する。
          GitHub Pull Request Builderプラグインの仕様なのか、https://(domain)/gitbucket/{グループ名}/{リポジトリ名}/(ドメインとグループ名の間にサブディレクトリが入っている)といったURLを入れても動作しないので注意!
    • ソースコード管理
      • Gitを選択
      • リポジトリ
        • リポジトリURL
          • .gitの入った対象リポジトリのURLを設定
        • 認証情報
          • GitBucket Access Userを選択
        • 高度な設定
          • Refspec
            • +refs/pull/*:refs/remotes/origin/pr/*
      • ビルドするブランチ
        • ブランチ指定子 (空欄はすべてを指定)
          • ${sha1}
    • ビルド・トリガ
      • GitHub Pull Request Builderを選択
        • GitHub API credentials
          • システム設定GitHub Pull Request BuilderGitHub AuthDescriptionで設定した名称(例ではGitBucket Connection)を選択
        • Admin list
          • 認証情報のGitBucket Access User作成時に使用したユーザIDを設定
        • 高度な設定
          • Crontab line
            • H/2 * * * *
              デフォルト5分間隔なので2分間隔に変更する(任意)
          • Build every pull request automatically without asking (Dangerous!).
            • 選択しなくてもいいかも?
              動かなかったら選択してみてください。
    • ビルド
      ここには実際に実行したい処理を設定してください。
      私のプロジェクトではNuxt.jsを使用していたのでNode.jsとシェルスクリプトの実行を設定しました。
      細かい設定は今回の記事の趣旨と離れてしまうので、また別の記事で紹介したいと思います。
    • ビルド後の処理
      結果を通知したいサービスの設定をしてください。
      今回はSlack Notificationsの設定をしました。

ここまで設定が終わったら、適当なブランチを作成してGitBucketへプッシュし、プルリクエストを作成してみましょう!
しばらくすると作成したJenkinsのジョブが動き出し、下記画像のようにステータスが表示されるようになると思います。 f:id:teco_iida:20200114135335p:plain f:id:teco_iida:20200114124727p:plain f:id:teco_iida:20200114124750p:plain

動かないですか?
もしかしたら、なにか設定がもれているのかもしれません……。

GitBucketの設定 その2

もし正常にJenkinsのジョブが動くことの確認ができたら、次はまたGitBucketの設定の続きを行います。

  1. Require status checks to pass before merging
    最初の設定時にスキップした箇所です。この設定を行うことでJenkinsでのチェックが通らないとマージできなくすることが可能になります。
    プルリクエストでJenkinsのジョブが動いていたら、オレンジ色の背景のメッセージが消えて以下画像のようになっているかと思います。 f:id:teco_iida:20200109185739p:plain 選択すると下記画像のように選択肢が増えますので、defaultを選択してSave changesのボタンを押して完了です。
    Include administratorsを選択すると管理者でもマージできなくすることができます。 f:id:teco_iida:20200123102153p:plain 上記設定をすると下記画像のようにチェックが通らないとMerge pull requestのボタンが押せないようになります! f:id:teco_iida:20200124121459p:plain

  2. Service Hooksの設定
    最後にGitBucketの操作がSlackへ通知されるように設定をします。
    Payload URLには「Slackの通知設定」で追加したGitHub Enterprise ServerWebhook URLを指定してください。 f:id:teco_iida:20200122162615j:plain

まとめ

少し長くなりましたが、以上で設定は終わりになります。
プルリクエストのレビュー前にテストやLintのチェックを通すことで、レビューで本来見るべき箇所に集中できるのでおすすめです!
また、コードレビューの方法に関してはまだ模索中なので、まとまったら記事にしていきたいと思います。

tecotec.co.jp