Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jenkins pipeline bubble up the shell exit code to fail the stage

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?

like image 585
James Lin Avatar asked Feb 24 '17 00:02

James Lin


People also ask

How do you stop a stage in Jenkins pipeline?

Alternatively you can call error(String message) step to stop the pipeline and set its status to FAILED . For example, if your stage 1 calls error(msg) step like: stage("Stage 1") { steps { script { error "This pipeline stops here!" } } }

How do you fail a Jenkins build pipeline?

You can use the error step from the pipeline DSL to fail the current build. error("Build failed because of this and that..")


1 Answers

The sh step returns the same status code that your actual sh command (your script in this case) returns. From sh documentation :

Normally, a script which exits with a nonzero status code will cause the step to fail with an exception.

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 the sh step, which will not fail the build but will return the status code. E.g:

def statusCode = sh script:script, returnStatus:true 

You can then use this status code to set the result of your current build.

You can use :

  • currentBuild.result = 'FAILURE' or currentBuild.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.
like image 192
Pom12 Avatar answered Sep 18 '22 15:09

Pom12