25

I'm having some trouble to manipulate the build result of a Jenkins pipeline. I've narrowed it down to the following issue: anyone know why the following Jenkins pipeline doesn't make the build result SUCCESS? Instead the build fails.

print "Setting result to FAILURE"
currentBuild.result = 'FAILURE'

print "Setting result to SUCCESS"
currentBuild.result = 'SUCCESS'
Ian
  • 11,280
  • 3
  • 36
  • 58
Joost
  • 663
  • 1
  • 6
  • 10

5 Answers5

26

I guess this is by design, "result can only get worse" in setResult():

// result can only get worse
if (result==null || r.isWorseThan(result)) {
    result = r;
    LOGGER.log(FINE, this + " in " + getRootDir() + ": result is set to " + r, LOGGER.isLoggable(Level.FINER) ? new Exception() : null);
}

That's a bummer

StephenKing
  • 36,187
  • 11
  • 83
  • 112
Joost
  • 663
  • 1
  • 6
  • 10
14

For simplier answer, just get raw build, and set field directly:

currentBuild.rawBuild.@result = hudson.model.Result.SUCCESS
Cheng Bao
  • 161
  • 1
  • 4
  • This is the one which worked for me. A plugin (NUnit Publishing) was setting the stage result to "unstable" via the "build.setResult" method, so error catching wasn't working. Adding this to the end of the stage done the job. – Mr Chris Dec 06 '19 at 10:25
  • yes, this is the one. it is a pitty that TextFinder plugin doesn't have this implemented, with it you can set build only to unstable, not_built or success... – YaP Mar 11 '20 at 21:01
4

That's works and can be executed from another job!

import com.cloudbees.groovy.cps.NonCPS
import jenkins.model.*
import hudson.model.Result

@NonCPS
def getProject(projectName) {
    // CloudBees folder plugin is supported, you can use natural paths:
    // in a postbuild action use `manager.hudson`
    // in the script web console use `Jenkins.instance`
    def project = jenkins.model.Jenkins.instance.getItemByFullName(projectName)
    if (!project) {error("Project not found: $projectName")}
    return project
}

project = getProject('foo/bar')
build = project.getBuildByNumber(2443)
// build = project.getBuild(project, '2443')

build.@result = hudson.model.Result.SUCCESS
// build.@result = hudson.model.Result.NOT_BUILT
// build.@result = hudson.model.Result.UNSTABLE
// build.@result = hudson.model.Result.FAILURE
// build.@result = hudson.model.Result.ABORTED
METAJIJI
  • 361
  • 2
  • 11
1

I resolved this by using this

currentBuild.result = hudson.model.Result.FAILURE.toString()
AnilS
  • 795
  • 1
  • 11
  • 15
0

Adding onto @metajiji's answer, you will need to approve the commands for hudson.model.result and project.getBuildByNumber in the main jenkins configuration