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