Jenkins pipeline if else not working
your first try is using declarative pipelines, and the second working one is using scripted pipelines. you need to enclose steps in a steps declaration, and you can't use if
as a top-level step in declarative, so you need to wrap it in a script
step. here's a working declarative version:
pipeline { agent any stages { stage('test') { steps { sh 'echo hello' } } stage('test1') { steps { sh 'echo $TEST' } } stage('test3') { steps { script { if (env.BRANCH_NAME == 'master') { echo 'I only execute on the master branch' } else { echo 'I execute elsewhere' } } } } }}
you can simplify this and potentially avoid the if statement (as long as you don't need the else) by using "when". See "when directive" at https://jenkins.io/doc/book/pipeline/syntax/. you can also validate jenkinsfiles using the jenkins rest api. it's super sweet. have fun with declarative pipelines in jenkins!
It requires a bit of rearranging, but when
does a good job to replace conditionals above. Here's the example from above written using the declarative syntax. Note that test3
stage is now two different stages. One that runs on the master branch and one that runs on anything else.
stage ('Test 3: Master') { when { branch 'master' } steps { echo 'I only execute on the master branch.' }}stage ('Test 3: Dev') { when { not { branch 'master' } } steps { echo 'I execute on non-master branches.' }}
If you wanted to create a condition to execute only a stage based on expression you can use keyword when
stage ('test3'){ when { expression { return env.BRANCH_NAME == 'master'} } steps { echo 'I only execute on the master branch.' } }}
With the expression
key word you can add any condition.
e.g. if stage is dependent on generated file in workspace.
stage ('File Dependent stage'){ when { expression { return fileExists ('myfile') } } steps { echo "file exists" } }}