Halt a jenkins pipeline job early

Another way to achieve this behavior is to throw an Exception. In fact, this is just what Jenkins itself does. That way, you can also set the build status either to ABORTED or FAILURE. This example aborts the build:

stage('Building') {
    currentBuild.rawBuild.result = Result.ABORTED
    throw new hudson.AbortException('Guess what!')
    echo 'Further code will not be executed'
}

Output:

[Pipeline] stage
[Pipeline] { (Building)
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
ERROR: Guess what!
Finished: ABORTED

Basically that is what the sh step does. If you do not capture the result in a variable, you can just run:

sh "./build"

This will exit if the script returns a non-zero exit code.

If you need to do stuff first, and need to capture the result, you can use a shell step to quit the job

stage('Building') {
    def result = sh returnStatus: true, script: './build.sh'
    if (result != 0) {
        echo '[FAILURE] Failed to build'
        currentBuild.result = 'FAILURE'
        // do more stuff here

        // this will terminate the job if result is non-zero
        // You don't even have to set the result to FAILURE by hand
        sh "exit ${result}"  
    }
}

But the following will give you the same, but seems more sane to do

stage('Building') {
    try { 
         sh './build.sh'
    } finally {
        echo '[FAILURE] Failed to build'
    }
}

It is also possible to call return in your code. However if you are inside a stage it will only return out of that stage. So

stage('Building') {
   def result = sh returnStatus: true, script: './build.sh'
   if (result != 0) {
      echo '[FAILURE] Failed to build'
      currentBuild.result = 'FAILURE'
      return
   }
   echo "This will not be displayed"
}
echo "The build will continue executing from here"

wont exit the job, but

stage('Building') {
   def result = sh returnStatus: true, script: './build.sh'
}
if (result != 0) {
  echo '[FAILURE] Failed to build'
  currentBuild.result = 'FAILURE'
  return
}

will.


Since Jenkins v2 this should also work

error('Failed to build')

The Job will end with:

ERROR: Failed to build
Finished: ERROR