Conditional step/stage in Jenkins pipeline
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 missedadding this earlier! You can do "not equals" comparisons using the not{ equals ... } combination too.
changeRequest - In its simplest form, this will return true if thisPipeline 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 masterbranch?" and much more.
buildingTag - A simple condition that just checks if the Pipeline isrunning against a tag in SCM, rather than a branch or a specificcommit reference.
tag - A more detailed equivalent of buildingTag, allowing you to checkagainst the tag name itself.
Just use if
and env.BRANCH_NAME
, example:
if (env.BRANCH_NAME == "deployment") { ... do some build ... } else { ... do something else ... }
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' } } } } }}