Absolute Jenkins pipeline/groovy noob here, I have a stage
stage('Building and Deploying'){
def build = new Build()
build.deploy()
}
which is using the shared lib, the source of the Build.groovy
is here:
def deploy(branch='master', repo='xxx'){
if (env.BRANCH_NAME.trim() == branch) {
def script = libraryResource 'build/package_indexes/python/build_push.sh'
// TODO: Test out http://stackoverflow.com/questions/40965725/jenkins-pipeline-cps-global-lib-resource-file-for-shell-script-purpose/40994132#40994132
env.PYPI_REPO = repo
sh script
}else {
echo "Not pushing to repo because branch is: "+env.BRANCH_NAME.trim()+" and not "+branch
}
}
Problem is when failing to push the build to a remote repo (see below), the stage still ends up showing successful.
running upload
Submitting dist/xxx-0.0.7.tar.gz to https://xxx.jfrog.io/xxx/api/pypi/grabone-pypi-local
Upload failed (403): Forbidden
...
Finished: SUCCESS
How do I bubble up the exit code of the shell script and fail the stage?
Best Answer
The
sh
step returns the same status code that your actual sh command (your script in this case) returns. From sh documentation :You have to make sure that your script returns a nonzero status code when it fails. If you're not sure what your script returns, you can check the return value using the
returnStatus
param of thesh
step, which will not fail the build but will return the status code. E.g:You can then use this status code to set the result of your current build.
You can use :
currentBuild.result = 'FAILURE'
orcurrentBuild.result = 'UNSTABLE'
to mark the step as red/yellow respectively. In this case the build will still process the next steps.error "Your error message"
if you want the build to fail and exit immediately.