Jenkins2をコード化しよう - その3:Jenkins Job DSLプラグインでジョブをコード化する

Jenkins2をコード化しよう - その3:Jenkins Job DSLプラグインでジョブをコード化する
目次

前回の記事 Jenkins2をコード化しよう - その2:Jenkinsの起動時にプログラム(Groovy Hook Script)を動かす ではJenkins2起動時に実行するGroovy Hook Scriptの書き方を紹介しました。

今回はJenkinsのジョブ設定をコード化してみましょう。

JenkinsのジョブはXMLで管理されている

${JENKINS_HOME} 配下のディレクトリ構成は以下のようになっています。ジョブに関連する部分のみ抜粋します。

${JENKINS_HOME}
├── jobs
│   ├── ${JOB名}
│   │   ├── builds
│   │   ├── config.xml
│   │   ├── lastStable -> builds/lastStableBuild
│   │   ├── lastSuccessful -> builds/lastSuccessfulBuild
│   │   └── nextBuildNumber
│   ├── ${JOB名}
(以下略)

jobs ディレクトリ直下にジョブ名のディレクトリがあり、その配下に config.xml が存在します。 config.xml 内にJenkinsのジョブの設定全体を保存しているのですが、xmlを直接編集したり、gitで管理するのは苦行です。

Jenkins Job DSL プラグインを使う

xml管理を避ける方法の1つとして、Jenkins Job DSL プラグイン を使ってGroovy DSLでJenkinsの設定を作成できます。

Jenkins Job DSL プラグインは、Jar単体で動く job-dsl-core-${version}-standalone.jar も提供しており、 これを使うのが個人的にはオススメです。

理由としては、Jenkinsプラグインを使うと、DSLを実行時にJenkinsの管理者のスクリプト実行許可(ScriptApproval)が必要な場合があり、自動的にJobをインポートさせたいユースケースの妨げになるからです。

スタンドアロンなjarの使い方をサンプルコードで紹介します。

以下のようなGroovy DSLファイル( config.groovy )を準備し、

 1pipelineJob('config') {
 2    definition {
 3        cpsScm {
 4            scm {
 5                git {
 6                    remote {
 7                        url('[email protected]:xxxxxxxx/xxxxxxxx.git')
 8                        credentials('your-credential')
 9                    }
10                    branch('*/master')
11                }
12            }
13            scriptPath('path to Jenkinsfile')
14        }
15    }
16}

Groovy DSLをスタンドアロンなJarに渡します。

1java -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -jar job-dsl-core-1.74-standalone.jar -j config.groovy

すると、カレントディレクトリに config.xml を生成してくれます。

 1<flow-definition>
 2    <actions></actions>
 3    <description></description>
 4    <keepDependencies>false</keepDependencies>
 5    <properties></properties>
 6    <triggers></triggers>
 7    <definition class='org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition'>
 8        <scriptPath>path to Jenkinsfile</scriptPath>
 9        <lightweight>false</lightweight>
10        <scm class='hudson.plugins.git.GitSCM'>
11            <userRemoteConfigs>
12                <hudson.plugins.git.UserRemoteConfig>
13                    <url>[email protected]:xxxxxxxx/xxxxxxxx.git</url>
14                    <credentialsId>your-credential</credentialsId>
15                </hudson.plugins.git.UserRemoteConfig>
16            </userRemoteConfigs>
17            <branches>
18                <hudson.plugins.git.BranchSpec>
19                    <name>*/master</name>
20                </hudson.plugins.git.BranchSpec>
21            </branches>
22            <configVersion>2</configVersion>
23            <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
24            <gitTool>Default</gitTool>
25        </scm>
26    </definition>
27</flow-definition>

ユースケース:ジョブをインポートするジョブを作る

私は、この job-dsl-core-${version}-standalone.jar を使って、Jenkinsが「自分のジョブを丸ごとインポートする」ジョブ を作っています。

ジョブの処理概要は以下です。

  1. Groovy DSLを含むGitリポジトリをClone
  2. Jenkinsの jobs ディレクトリ配下の構成にならって、再帰的にすべてのJobの config.xml を生成する。
  3. 生成された config.xml を含むジョブのディレクトリをまるごと ${JENKINS_HOME}/jobs 配下にコピー
  4. jenkins-cliを使って自分を再起動

参考にさせていだいたサイト