【CloudBees CI奮闘記】第5章:パイプラインテンプレートを利用する


Jenkinsは世界中で人気があるフリーでオープンソースの自動化サーバーです。そのため気軽に運用を開始することができ、Jenkinsの豊富な機能やプラグインを用いることで環境を発展させていくことが可能です。その一方でJenkinsの運用を進めていくうちに課題も発生してくることがあります。
CloudBees CI奮闘記として、Jenkinsを利用していると発生し得る課題の紹介をしながら、それらを解消するエンタープライズ機能を強化した有償版JenkinsであるCloudBees CIの紹介を行っていきます。
本ブログでは、CloudBees CIと区別するためにhttps://www.jenkins.io/のJenkinsをOSS Jenkinsと記載します。

そもそも「CloudBees CIとは?」といったことや、Jenkinsの利用上の課題についてはこちらのブログより確認ください。

はじめに

登場人物

吉田:転職したてのエンジニア。前職では積極的にCIやCDに取り組みながら開発をしていた。CI奮闘記では服部に色々アドバイスを行った。

服部:元々CIやJenkinsについては言葉は聞いたことがある程度であったが、吉田からのサポートをうけつつCI環境の導入担当として日々奮闘している。CI奮闘記では自部署にJenkinsを導入した。

パイプラインテンプレート

あら、今日もパイプライン作ってるの?最近パイプラインのスクリプトを書いてることが多いわよね。

そうなんですよ。Jenkinsが使われるようになって、いろいろな部署でもパイプラインを作り始めたところまでよかったんですけど。

あら、何か問題があったのかしら?

こないだ少しパイプラインを見てほしいと見に行ったら、なんと1000行以上のスクリプトパイプラインが作成されていて……。流石にこれは問題だと修正し始めたら、ほかの部署からも修正依頼や作成依頼が来るようになってきてしまったんです。

ベストプラクティスとして300行未満が良いとされているのに、1000行越えはなかなかすごいわね。やっぱりいろいろビジネスロジックとか埋め込まれているの?

他にXMLやJSONファイルの解析がされていたりもしますね。以前吉田さんにパイプラインに書かれたGroovyコードは、常にCPUやメモリといったコントローラーのリソースを使用するので、パイプラインによって実行されるGroovyコードの量を減らすことが非常に重要だと教えてもらったこともあり、一層気になってしまって。

それでパイプライン職人になってるのね。

そうなんです。開発者に対してパイプラインを勉強して作れ!というのも少し違うかなぁと思いまして。

もともと開発に集中するために導入したCI環境ですものね。管理者の服部さんがベストプラクティスに則ったパイプラインを作成するのは良いことだと思うわ。

ただ、最近依頼が多くて、現場の開発者を待たせることも少しづつ増えてきてしまったりして。何かいい方法ないんですかね。

それならCloudBees CIのパイプラインテンプレートという機能で何とかなるかもしれないわよ。

パイプラインテンプレートとは

例えばパイプラインのベストプラクティスの一つに「シンプルに保ち、パイプライン自体に複雑なロジックを埋め込まない」というものがあります。このようなベストプラクティスを理解しながらパイプラインを構築するには、それなりの知識が必要となります。ただ、現場の開発者全員にパイプラインの書き方を学習させるのは現実的ではないでしょう。かといって、Jenkins管理者がパイプラインを構築するという運用をした場合、パイプライン作成依頼が集中してしまい、Jenkins管理者のパイプライン作成時間がボトルネックになることも考えられます。特に大規模にJenkinsの運営されている組織では顕著でしょう。
この問題を解消するために、CloudBees CIのパイプラインテンプレート機能が活用できます。パイプラインテンプレート機能を用いることで、現場の開発者はパイプラインの知識の習得をすることなく、ベストプラクティスに則ったCI/CDを素早く開始できるようになります。

パイプラインテンプレートの利用

パイプラインテンプレートを利用するにはパイプラインテンプレート用のリポジトリを作成し、以下の様なディレクトリやファイル構成にします。
また、CloudBeesのGitHubリポジトリでサンプル用のテンプレートカタログのリポジトリが確認できます。Cloudbees/cloudbees-examples

catalog.yamlファイルの作成

パイプラインテンプレート用のリポジトリということを示すために、catalog.yamlファイルを作成し、リポジトリのルートに配置します。catalog.yamlファイルには以下のパラメータを記載します。

パラメータ説明
versionyamlファイルのバージョン。
typeカタログのyaml構文の定義。type: pipeline-template-catalogを入力。
name一意の識別子。
displayNameCloudBees CIのUIに表示される名前。

catalog.yamlのサンプルとしては次のようになります。

version: 1
type: pipeline-template-catalog
name: customerPortalFrontendTeamCatalog
displayName: Shared Template Catalog for Teams Working on the Customer Portal

テンプレートカタログのリポジトリとJenkinsの関連付け

作成したリポジトリとClient Controllerを関連付けるため、Client ControllerのサイドメニューにあるPipeline Template Catalogsから情報を登録します。

Add catalogをクリックし、画面の案内に従って作成したパイプラインテンプレート用のリポジトリの情報を入力し保存すると、以下の様にClient Controllerに登録されます。

Pipeline Template Catalogsのメニューに登録された状態。
Client Controllerのジョブにはフォルダとして表示される。

パイプラインテンプレートのセットアップ

作成したパイプラインテンプレート用のリポジトリにサブディレクトリを作成し、テンプレートとして利用するパイプラインを登録します。

  • Jenkinsfile:通常のパイプラインで作成するJenkinsfile。宣言型パイプラインもスクリプトパイプラインもどちらも登録可能。
  • template.yaml:テンプレートのパラメータを設定するためのyamlファイル。

template.yamlに設定できる値は以下になります。

パラメータ説明必須
nameJenkinsfile内のパラメータに使用される名称
displayNameCloudBees CIのUIに表示される名称。ジョブを作成するときに開発者が確認できる
allowedValues入力可能なパラメータのリスト
defaultデフォルト値
typeパラメータのデータ型。詳細はこちらのtypeの表を参照ください。

Jenkinsfileとtemplate.yamlのサンプルを以下に記載します。

pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                git credentialsId: "${github_creds}", url: "${github_repo}"
            }
        }
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
    }
    post {
        success {
            emailext (
                subject: "SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
                body: """<p>SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]':</p>
                  <p>Check console output at &QUOT;<a href='${env.BUILD_URL}'>${env.JOB_NAME} [${env.BUILD_NUMBER}]</a>&QUOT;</p>""",
                to: "${emailRecipient}",
                from: "buildNotifications@emailaddress.com"
            )
        }
        failure {
            ・・・
        }
    }
}
  version: 1
  type: pipeline-template

  name: Java Maven App Pipeline Job
  description: Simple Java App With Maven
  parameters:
    - name: emailRecipient
      type: string
      displayName: Email address to be used for sending build notifications
    - name: github_repo
      type: string
      displayName: GitHub HTTPS repo endpoint
    - name: github_creds
      displayName: GitHub Credentials ID
      type: credentials
      defaultValue: github-creds-example

デフォルトの場合、パイプラインテンプレートの更新タイミングは1日毎になっています。直ちにClient Controllerに反映したい場合、ダッシュボード > Pipeline Template Catalogs > 該当のCatalog Name > Run Catalog Import Nowをクリックします。

パイプラインジョブの作成

作成したパイプラインテンプレートを用いてジョブを作成します。登録したパイプラインテンプレートは新規ジョブ作成時のジョブの種類として表示されます。

フリースタイル・プロジェクトのビルドやパイプラインといった種類の選択画面に、作成したテンプレートが表示される。

先ほど作成した「Java Maven App Pipeline Job」を選択します。template.yamlで変数として定義できる部分を設定し、Saveボタンを入力することで、簡単にパイプラインジョブを作成できます。

パイプラインジョブの保守

パイプラインテンプレートを利用することで、パイプラインテンプレートの変更内容が参照しているジョブにも反映されるため、メンテナンス箇所を減らすことができます。
また、どのジョブがパイプラインテンプレートを利用しているかはClient Controller上から確認できます。そのためパイプラインテンプレートの修正時に、どのジョブに影響するのか影響範囲を確認しながら修正が可能です。

まとめ

今回は「Java Maven App Pipeline Job」というジョブを作成したけど、これ以外にも用途別にパイプラインテンプレートを作成しておけばいいんじゃない?

確かに!そうすれば開発者は選択するだけでジョブを作れますし、メンテナンス箇所も減らせてとてもよさそうです。早速取り掛かってみます!

今回はパイプラインテンプレートを紹介しました。

  • 機能名パイプラインテンプレート
  • 概要:テンプレート化したパイプラインを作成し、テンプレートを用いてジョブを作成できる。
  • 具体的な活用例:「ビルド」「静的解析」「単体テスト」といった枠組みをテンプレートとして作成し、ビルドバッチやテストスイート等個別のパラメータを各ジョブで設定することで、ベストプラクティスに基づいたパイプラインを標準化することができる。

今回紹介した機能以外にも、共通管理や大規模なJenkinsの効率的な管理に便利な機能があります。
ぜひCloudBees CIを導入し、管理がしやすく、安定稼働するJenkins環境を手に入れてください。

CloudBees CI奮闘記一覧

Jenkinsのよくある課題とCIツール比較

Jenkinsのよくある課題とCIツール比較