Posted at

Jenkins Declarative Pipeline 〜whenを使い倒す!〜

More than 1 year has passed since last update.

Jenkins2系からPipelineが標準サポートされましたね。

そのPipelineも初期のScripted PipelineからDeclarative Pipelineに代わり、

宣言的に記述することができるようになりました。

今回はそのDeclarative Pipelineの1機能であるwhenについてです。


whenとは何か?

whenは実行の分岐をstage単位で制御できる、if 文みたいなものです。

まずは簡単な例を見てみましょう!

pipeline {

agent any
stages {
stage('Example Deploy') {
when {
branch 'production'
}
echo 'Deploying'
}
}
}
}

はい、ぱっと見ただけでやっていることがわかりますね?

これはブランチがproductionのときにだけ、Example Deploy stageが実行されるようになります。

それ以外はスルーになります。


whenの条件に指定できるのは?

このように便利なwhenですが、2017/05/25現在、指定できる条件は以下の3つになります。

条件
説明

branch
指定したブランチのときに
when { branch 'master' }

environmet
環境変数が指定した値のとき
when { environment name: 'DEPLOY_TO', value: 'production' }

expression
groovyで書いた条件がtrueを返すとき
when { expression { return params.DEBUG_BUILD } }

とくにexpressionはgroovyで記述できるため、複雑な条件も記述できるため重宝します。

pipeline {

agent any
parameters {
string (
defaultValue: '*',
description: '',
name : 'BRANCH_PATTERN')
booleanParam (
defaultValue: false,
description: '',
name : 'FORCE_FULL_BUILD')
}
stages {
stage ('Build') {
when {
expression {
GIT_BRANCH = 'origin/' + sh(returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim()
return GIT_BRANCH == 'origin/master' || params.FORCE_FULL_BUILD
}
}
steps {
sh 'echo HelloWorld'
}
}
}
}


And, Or はどうやるの?

条件を作っていると、複合条件が必要になってくる場合が往々にしてあります。

例えば、AブランチかBブランチのときに実行したい。CブランチのときはDパラメータがあるときに実行したい、などなど。

その場合、どうするか?

まずは例を見てみましょう!

pipeline {

agent any
stages {
stage('Example Build') {
when {
anyOf {
allOf {
not {
expression { false }
}
expression { true }
}
expression { false }
}
}
steps {
echo 'Hello World'
}
}
}
}

なんとなくわかりますが、説明します。

条件
表記

AND条件
allOf

OR条件
anyOf

NOT条件
not

このように英語らしい表現になっていて、入れ子も可能になります。

上の例は、みなさんが見慣れた(?)Javaのif文で書くとこのようになります。

if ( (!false && true) || false) {

...
}


所感

複合条件の部分はドキュメントに載っていないので、ソースコードを追っかけ苦労した部分でもあります。

みなさんの助けになれば、と思ってQiitaに投稿しました。


参考