Jenkins PipelineのJenkinsfileを作っていて、設定ファイル(Gradleでいう、gradle.propertiesのような感じ)が欲しいと思う時があります。今回はYamlファイルをJnekinsfileから読み込んで設定ファイルとして使う方法をご紹介します。

1. Pipeline Utility Steps Pluginをインストール

Jenkinsで様々な形式のファイルが簡単に読み込めるようになるプラグインです。Yamlファイルの読み込みに使います。Jenkins初期設定時のSuggested Pluginには入っていないので、自分でインストールしましょう。

2. config.ymlを作成

プロジェクト直下(Jenkinsfileと同じ場所)にconfig.ymlを作ります。

config.yml
someProp: 値1
someCategory:
  prop: 値2
  arrayProp:
    - 配列値0
    - 配列値1
    - 配列値2

3. Jenkinsfileを作成

Jenkinsfileを下記のようにします。今回はDeclarative Pipelineの書き方ですが、Scripted Pipelinesでもほとんど同じ書き方だと思います。

Jenkinsfie
pipeline {
    agent any

    environment {
        CONFIG = "" //この時点ではプロジェクトの設定ファイルを読み込めないので仮の値を設定しておく
    }

    stages {
        stage('チェックアウトして設定ファイル読み込み') {
            steps {
                // プロジェクトをチェックアウト
                checkout scm

                script {
                    // チェックアウト後に設定ファイルを読み込む
                    // Pipeline Utility Steps Pluginの関数を使う
                    CONFIG = readYaml(file: 'config.yml')
                }
            }
        }

        stage('設定ファイル参照') {
            steps {
                echo "CONFIG.someProp = ${CONFIG.someProp}"
                echo "CONFIG.someCategory.prop = ${CONFIG.someCategory.prop}"
                echo "CONFIG.someCategory.arrayProp[0] = ${CONFIG.someCategory.arrayProp[0]}"
                echo "CONFIG.someCategory.arrayProp[1] = ${CONFIG.someCategory.arrayProp[1]}"
                echo "CONFIG.someCategory.arrayProp[2] = ${CONFIG.someCategory.arrayProp[2]}"
            }
        }
    }
}

これでJobを実行すると下記のようなコンソールログが出力されます。

Jenkinsのコンソール出力(一部抜粋)
[Pipeline] { (設定ファイル参照)
[Pipeline] echo
CONFIG.someProp = 値1
[Pipeline] echo
CONFIG.someCategory.prop = 値2
[Pipeline] echo
CONFIG.someCategory.arrayProp[0] = 配列値0
[Pipeline] echo
CONFIG.someCategory.arrayProp[1] = 配列値1
[Pipeline] echo
CONFIG.someCategory.arrayProp[2] = 配列値2

最後に

今回はYamlファイルをJenkins Pipelineの設定ファイルとして使ってみました。
Pipeline Utility Steps Pluginはpropertiesファイルも読み込めるので、gradle.propertiesを読み込んで、設定ファイルをGradleとJenkins Pipelineで共有することもできそうです。