Deepak Raut
Deepak Raut

Reputation: 191

How to skip a stage in Jenkinsfile pipeline when pipeline name ends with deliver?

I have 2 pipelines one for review and one for deploy. So when the pipeline ends with review, I want to skip Jenkinsfile execution. However, when it ends with deploy, it should execute the stage or the Jenkinsfile.

I tried to use if, but this is a declarative pipeline, so when should be used. I want to avoid execution of stage using when condition if I encounter deploy pipeline end.

#!/usr/bin/env groovy
final boolean Deploy = (env.JOB_NAME as String).endsWith("-deploy")

    
pipeline {
    agent any
    parameters {
        choice(
            choices: ['greeting' , 'silence'],
            description: '',
            name: 'REQUESTED_ACTION')
    }

    stages {
//how to ouse when here to use deploy vairable to avoide execution of stage below
        stage ('Speak') {
            
            steps {
                echo "Hello, bitwiseman!"
            }
        }
    }
}

Upvotes: 19

Views: 93730

Answers (5)

uday kiran
uday kiran

Reputation: 63

Even you can skip some parts of the steps using below code. Let's say REQUIRED_UPLOAD_INSTALL is a parameter.

stage('Checking Mail List') {
  steps {
    script {
      if(!(env.REQUIRED_UPLOAD_INSTALL.toBoolean())) {
        env.mail_list = '[email protected]'
      }
    }
  }
}

But it doesn't support in post steps, not even in the when syntax.

Upvotes: 0

andrei414
andrei414

Reputation: 15

Here is an example for a Jenkins scripted pipeline:

stage('Input of Scratch instance and Access token') {
    timeout(time: 60, unit: 'SECONDS') {
        script {
            try {
                env.SCRATCH_INSTANCE_URL = input message: 'Please enter the SCRATCH_INSTANCE_URL',
                                                parameters: [string(defaultValue: '',
                                                         description: '',
                                                         name: 'SCRATCH_INSTANCE_URL')]
                env.SCRATCH_ACCESS_TOKEN = input message: 'Please enter the SCRATCH_ACCESS_TOKEN',
                                                parameters: [string(defaultValue: '',
                                                             description: '',
                                                             name: 'SCRATCH_ACCESS_TOKEN')]
            } catch (Throwable e) {
                echo "Caught ${e.toString()}"
                            currentBuild.result = "SUCCESS"
            }
        }
    }
}

// -------------------------------------------------------------------------
// Logout from Dev Hub.
// -------------------------------------------------------------------------
            
stage('Logout from DevHub') {
    if (env.SCRATCH_INSTANCE_URL == null) {
        rc = command '''export SFDX_USE_GENERIC_UNIX_KEYCHAIN=true
             sfdx force:auth:logout --targetusername ${DEV_HUB_USERNAME} -p
             echo ${SCRATCH_INSTANCE_URL}
             echo ${SCRATCH_ACCESS_TOKEN}
             '''
    } else {
        echo "Skipping this stage"
    }
}

Upvotes: 0

Dibakar Aditya
Dibakar Aditya

Reputation: 4203

An alternative to @StephenKing’s answer, which is also correct, you can rewrite the when block when evaluating Booleans as follows:

stages {
    stage('Deploy') {
        when { 
            expression {
                return Deploy
            }
        }
        steps {
            echo "Hello, bitwiseman!" // Step executes only when Deploy is true

        }
    }
}

This will execute the stage Deploy only when the variable Deploy evaluates to true, else the stage will be skipped.

Upvotes: 16

miran
miran

Reputation: 1519

I've got quite a hard time to find it too, but finally:

stage('Speak') {
     when {
         expression { params.REQUESTED_ACTION != 'SILENCE' }
     }
     steps {
         echo "Hello, bitwiseman!"
     }
}  

Jenkins docs with examples here: https://jenkins.io/doc/book/pipeline/syntax/#when-example

Upvotes: 14

StephenKing
StephenKing

Reputation: 37580

You can skip stages in declarative pipelines using when, so the following should work.

stages {
  stage('Deploy') {
    when { equals expected: true, actual: Deploy }
    steps {
      // ...
    }
  }
}

Upvotes: 16

Related Questions