最近業務ではコードを触る機会が減っており、趣味も兼ねてのJenkinsfile修正で少しでもコードを触って「たーのしー」となっている Jenkins おじさんこと中村です。こんにちは。今日は、先日リリースした「 Jenkins Backlog Plugin 」のPipeline対応についてご紹介します。
内容的には、2016年8月のJenkins勉強会で発表した内容となります(この際は、主に技術的・内部的な説明が中心でしたが)。1年近く社内で運用していて問題なさそうなのと同時に、BacklogとJenkinsを両方使用しているユーザの方にも便利なのでぜひ使ってもらいたいと思って、リリースしました!
既存の「プルリクエストのCIビルド」の問題点
以前「Jenkins Backlog Pluginで、ビルド結果をプルリクエストに通知!」で、BacklogのプルリクエストとJenkinsを連携させる方法を紹介しました。これにより、プルリクエストをCIできることにより、安心してマージができる環境になりました。
ただこの方式は、一つのジョブで全プルリクエストを処理する方式となっていることから、以下のような問題点がありました。
- ビルドが失敗したときに、どのプルリクエストが失敗したのかが分かりづらい
- 失敗したプルリクエストを再実行しようとしたとき、該当のプルリクエストを指定しづらい
- プルリクエストが同時に複数更新されると、プルリクエストのビルドが詰まりがちになる
Pipeline対応 – プルリクエストジョブの自動作成
Jenkinsでは、Pipelineという機能が2.0から公式に導入されています。Pipelineではいくつかの機能がサポートされています。一番分かりやすい機能は、Jenkinsfileというファイルを通じてコードでジョブ設定を定義できるというものですが、その他にもブランチごとにジョブを自動で生成するMultibranch Pipelineという機能も提供されています。
Jenkins Backlog Plugin のPipeline対応では、Multibranch Pipeline機能を拡張して、各プルリクエストに応じてジョブを個別に自動生成するという機能を追加しました。これによって、一つのジョブで全プルリクエストを処理することによって発生していた前述の問題点を解決しました。
- ビルドが失敗したときに、どのプルリクエストに紐づくビルドが失敗したのかが分かりやすくなった
- 失敗したプルリクエストのビルドを再実行しやすくなった
- 複数のプルリクエストが更新されても、それぞれ別のビルドとして実行できるため待たされなくなった
GitHubを対象としたGitHub Branch Source(以前はGitHub Organization Folder Pluginで提供されていた)と似たような機能を提供するので、そちらを知ってる方はイメージつきやすいかもしれません。
設定方法
それでは、実際の設定方法を説明していきます。設定方法は、Jenkinsの画面上での設定と、Jenkinsfileでの設定の大きく2つに分かれています。前提条件として、Jenkins Backlog Plugin の2.0以降にアップデートしておいてください。
Jenkins画面での設定
まず、新規ジョブ作成画面から、Multibranch Pipelineを作成します。
Backlog Pluginの適切なバージョンが入っていれば、”Branch Sources > Add source”に”Backlog Git用プルリクエスト”が追加されているかと思います。そちらを選択してください。
”Project Repository”などの情報は、Pipelineを使わない既存のジョブ設定と同様なので、細かい説明は省略します。Multibranch Pipeline特有の設定は、以下の点です。
- Backlog URL(プロジェクトホームのURLを指定してください)
- ApiKey(Backlogの個人設定 > APIの設定から発行することができます)
- Add Property > Backlogのプルリクエスト情報を付与
Jenkinsfileの設定
続いて、Jenkinsfileの設定です。Jenkinsfileの基本的な設定方法は別途参照いただくとして、ここでは以下の2つのステップを追加します。
- properties : プルリクエストにコメントするのに必要な情報を ‘BacklogProjectProperty’ として設定
- backlogPullRequest : ビルド終了時、ビルド結果をBacklogのプルリクエストにコメント
Jenkinsfileのサンプルコードを、以下に示します。
pipeline { agent any stages { stage('Example') { steps { script { properties([[ $class : 'BacklogProjectProperty', url : <Jenkins画面上で設定した”Backlog URL”と同じ値>, apiKey : <Jenkins画面上で設定した”ApiKey”と同じ値>, ]]) } echo 'Hello World' } } } post { always { backlogPullRequest() } } }
設定結果確認
上記のコードをJenkinfileとして保存し、BacklogのGitリポジトリにpushした後にプルリクエストを作ると、プルリクエストに対応したジョブが自動的に作成されます。もちろん、プルリクエストがマージもしくは却下された場合、対応するジョブも自動的に削除されます。
ジョブ名にはプルリクエストの件名が表示され、プルリクエストへのリンクも追加されているのが分かります。
以上、Pipelineをプラグイン側で拡張することによって、プルリクエストのビルド結果を見やすくする方法について紹介しました。
なお、2017/06時点で、Jenkins Backlog Pluginには以下の制限があります。
- GUIで設定できてたJenkins Backlog Pluginの機能のうち、このブログに取り上げた範囲のみを移行しています
- 新しいUIであるBlue Oceanには、細かい表示の点で対応しきれていません
もし質問や希望などがあれば、ぜひぜひコメントもしくはTwitterなどでご連絡ください。
ヌーラボでは、Jenkinsおじさんを駆逐するぜという活きがいいエンジニアを募集しています。