How do you run a build step/stage only if building a specific branch?
For example, run a deployment step only if the branch is called deployment, leaving everything else the same.
Doing the same in declarative pipeline syntax, below are few examples:
stage('master-branch-stuff') { when { branch 'master' } steps { echo 'run this stage - ony if the branch = master branch' } } stage('feature-branch-stuff') { when { branch 'feature/*' } steps { echo 'run this stage - only if the branch name started with feature/' } } stage('expression-branch') { when { expression { return env.BRANCH_NAME != 'master'; } } steps { echo 'run this stage - when branch is not equal to master' } } stage('env-specific-stuff') { when { environment name: 'NAME', value: 'this' } steps { echo 'run this stage - only if the env name and value matches' } } More effective ways coming up - https://issues.jenkins-ci.org/browse/JENKINS-41187
Also look at - https://jenkins.io/doc/book/pipeline/syntax/#when
The directive beforeAgent true can be set to avoid spinning up an agent to run the conditional, if the conditional doesn't require git state to decide whether to run:
when { beforeAgent true; expression { return isStageConfigured(config) } } Release post and docs
UPDATE
New WHEN Clause
REF: https://jenkins.io/blog/2018/04/09/whats-in-declarative
equals - Compares two values - strings, variables, numbers, booleans - and returns true if they’re equal. I’m honestly not sure how we missed adding this earlier! You can do "not equals" comparisons using the not { equals ... } combination too.
changeRequest - In its simplest form, this will return true if this Pipeline is building a change request, such as a GitHub pull request. You can also do more detailed checks against the change request, allowing you to ask "is this a change request against the master branch?" and much more.
buildingTag - A simple condition that just checks if the Pipeline is running against a tag in SCM, rather than a branch or a specific commit reference.
tag - A more detailed equivalent of buildingTag, allowing you to check against the tag name itself.
when{} condition evaluates to false. :(beforeAgent true to avoid thatbeforeAgent is now a workaround for that.Just use if and env.BRANCH_NAME, example:
if (env.BRANCH_NAME == "deployment") { ... do some build ... } else { ... do something else ... } I'm adding this answer to explicitly mention using a condition in a step in contrast to a stage, both within declarative pipelines.
As already shown by @Chandan Nayak and others, this can be done based on when as in
stage('myConditionalStage') { when { branch 'myBranch' } steps { echo 'triggered by myBranch' } } So the stage myConditionalStage will only be run if triggered by a push to myBranch.
If you however need a condition within the steps section of a stage, you can use Groovy syntax (if/else in this case) that is used in Scripted pipelines. In case of a Declarative pipeline you have to put it into a script block as follows:
stage('myStage') { steps { echo 'within myStage' script { if (env.BRANCH_NAME == "myBranch") { echo 'triggered by myBranch' } else { echo 'triggered by something else' } } } } For a Scripted pipeline, you can use it without the script block as shown by @Krzysztof Krasoń
According to other answers I am adding the parallel stages scenario:
pipeline { agent any stages { stage('some parallel stage') { parallel { stage('parallel stage 1') { when { expression { ENV == "something" } } steps { echo 'something' } } stage('parallel stage 2') { steps { echo 'something' } } } } } } I created more nested stages as follows:
pipeline { // Agent To Run On agent none stages { // Processing OpenCV Optimizer stage('OpenCV Processing'){ when { expression { inputOptimizer == "OpenCV DNN" } } stages { // Checkout and Compile stage stage('SCM Checkout & Build'){ parallel { stage('Test On Windows') { agent { label "Stagging-Node" } steps { echo "first stage" } }//Test On Windows stage('Test On Linux') { agent { label "Stagging-Node" } steps { echo "second stage" } }//Test On Linux stage('Testing '){ agent { label "Stagging-Node" } steps { echo "second dddd" } }//Testing } } // Docker Build stage("Docker Build"){ steps { echo "Build stage" } } } } // Processing OpenVino Optimizer stage('OpenVino Processing'){ when { expression { inputOptimizer == "OpenVino CPU Yolov7" } } stages { // Checkout and Compile stage stage('SCM Checkout & Build'){ parallel { stage('Test On Windows') { agent { label "Stagging-Node" } steps { echo "first stage" } }//Test On Windows stage('Test On Linux') { agent { label "Stagging-Node" } steps { echo "second stage" } }//Test On Linux stage('Testing '){ agent { label "Stagging-Node" } steps { echo "second dddd" } }//Testing } } // Docker Build stage("Docker Build"){ steps { echo "Build stage" } } } } }//end of stages }//end of pipeline