note/Jenkins で複数のプロジェクトがあって、それぞれにビルドやデプロイのジョブを作成している。 同じようなステップを実行するので、共通処理をまとめてメンテナスしやすくしたい。

Jenkins Shared Library

Shared Libraryを使うとpipelineからライブラリに定義された関数や変数を使うことができる。 Jenkins Shared Librariesの活用事例の紹介 - DeNA Testing Blog

なんと pipeline {} ごと定義することもできる。

使い方

Share a standard Pipeline across multiple projects with Shared Libraries

Extending with Shared Libraries

  1. ライブラリを作成する

ライブラリ用のリポジトリを作成して、ディレクトリ構成を以下のようにする(srcかvarsどちらか一つは必須)

mylibrary

+- src                     # Groovy source files
|   +- org
|       +- foo
|           +- Bar.groovy  # for org.foo.Bar class
+- vars
|   +- foo.groovy          # for global 'foo' variable
|   +- foo.txt             # help for 'foo' variable
+- resources               # resource files (external libraries only)
|   +- org
|       +- foo
|           +- bar.json    # static helper data for org.foo.Bar

処理を以下のように記述する。callメソッドを定義すると

mylibrary/vars/hello.groovy

def call() {
  pipeline {
    agent any
    stages {
      stage('library stage') {
        steps {
          echo "hello"
        }
      }
    }
  }
}
  1. Jenkinsの管理 > システムの設定 > Global Pipeline Libraries に、ライブラリのリポジトリを設定する

設定値は見ての通り

  1. pipelineを作成する

Jenkinsfile

// ライブラリ名を指定
@Library('mylibrary') _
 
// xxx.groovy の xxx 部分で関数を実行できる
hello()

vars 配下に作成した場合は、globalに定義されるためimportを書かずに利用できる。

// Global Pipeline Libraries の Default version を使用する
@Library('mylibrary') _
 
// ブランチやタグを指定する場合
@Library('mylibrary@1.0') _
 
// 複数ライブラリの読み込み
@Library(['mylibrary', 'other@abcdef1234']) _

src 配下に作成した場合は、importしてnewでインスタンスを作成した上で利用できる。

// 利用したい class を import する
@Library('mylibrary') import org.foo.Sample
 
// 利用時は script { } ブロック内で利用する
script {
  def sample = new org.foo.Sample()
  sample.hello()   // Sample 内に定義されている hello() メソッドの呼び出し
}