LoginSignup
55
35

More than 5 years have passed since last update.

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

Posted at

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

参考

55
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
35