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に投稿しました。