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が「自分のジョブを丸ごとインポートする」ジョブ を作っています。
ジョブの処理概要は以下です。
- Groovy DSLを含むGitリポジトリをClone
- Jenkinsの
jobs
ディレクトリ配下の構成にならって、再帰的にすべてのJobのconfig.xml
を生成する。 - 生成された
config.xml
を含むジョブのディレクトリをまるごと${JENKINS_HOME}/jobs
配下にコピー - jenkins-cliを使って自分を再起動