Issue
In our Jenkins Pipeline job we have a couple of stages, and what I would like is if any of the stages fail, then to have the build stop and not continue on to the further stages.
Here's an example of one of the stages:
stage('Building') {
def result = sh returnStatus: true, script: './build.sh'
if (result != 0) {
echo '[FAILURE] Failed to build'
currentBuild.result = 'FAILURE'
}
}
The script will fail, and the build result will update, but the job continues on to the next stages. How can I abort or halt the job when this happens?
Solution
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.
Answered By - Rik
Answer Checked By - Cary Denson (JavaFixing Admin)