在 Jenkinsfile 建造失败

在某些情况下,我想让构建失败。我该怎么做呢?

我试过:

throw RuntimeException("Build failed for some specific reason!")

这实际上会导致构建失败。但是,日志显示了异常:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use new java.lang.RuntimeException java.lang.String

这让用户有点困惑,有更好的办法吗?

155651 次浏览

You can use the error step from the pipeline DSL to fail the current build.

error("Build failed because of this and that..")

I have shown below different ways of error handling for declarative approach:

failfast in parallel pipeline

https://issues.jenkins-ci.org/browse/JENKINS-55459?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory-tabpanel

If a user has a Declarative Pipeline script with parallel stages, and they set failFast true for those stages, if one of the stages fails then the build is immediately aborted.

NOTE: sh 'false' --> Can fail the stage

pipeline {
agent any
stages {
stage('Validate Fail fast') {
failFast true
parallel {
stage('stage A') {
steps {
echo 'stage A started'
sleep 5
sh 'false'
echo 'stage A Ended' //will not execute because of above sh return


}
}
stage('stage B') {
steps {
echo 'stage B started'
sleep 10
echo 'stage B Ended' //will not execute because of above stage fail
}
}
stage('stage C') {
steps {
echo 'stage C started'
echo 'stage C Ended' //May complete before Stage A fails
}
}
}
}
stage('final stage sequential') {
steps {
script {
echo "The complete run!"
}
}
}
}
}

When failFast true it terminates the parallel tasks.

Started by user admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /Users/Shared/Jenkins/Home/workspace/ErrorHandling
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Validate Fail fast)
[Pipeline] parallel
[Pipeline] { (Branch: stage A)
[Pipeline] { (Branch: stage B)
[Pipeline] { (Branch: stage C)
[Pipeline] stage
[Pipeline] { (stage A)
[Pipeline] stage
[Pipeline] { (stage B)
[Pipeline] stage
[Pipeline] { (stage C)
[Pipeline] echo
stage A started
[Pipeline] sleep
Sleeping for 5 sec
[Pipeline] echo
stage B started
[Pipeline] sleep
Sleeping for 10 sec
[Pipeline] echo
stage C started
[Pipeline] echo
stage C Ended
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] sh
+ false
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
Failed in branch stage A
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
Failed in branch stage B
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (final stage sequential)
Stage "final stage sequential" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE

When "failFast false" it still continue executes other parallel tasks.

Started by user admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /Users/Shared/Jenkins/Home/workspace/ErrorHandling
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Validate Fail fast)
[Pipeline] parallel
[Pipeline] { (Branch: stage A)
[Pipeline] { (Branch: stage B)
[Pipeline] { (Branch: stage C)
[Pipeline] stage
[Pipeline] { (stage A)
[Pipeline] stage
[Pipeline] { (stage B)
[Pipeline] stage
[Pipeline] { (stage C) (hide)
[Pipeline] echo
stage A started
[Pipeline] sleep
Sleeping for 5 sec
[Pipeline] echo
stage B started
[Pipeline] sleep
Sleeping for 10 sec
[Pipeline] echo
stage C started
[Pipeline] echo
stage C Ended
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] sh
+ false
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
Failed in branch stage A
[Pipeline] echo
stage B Ended
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (final stage sequential)
Stage "final stage sequential" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE

Try-catch block in Jenkins pipeline script

In declarative style of pipeline, so you must not use try/catch blocks (which are for Scripted Pipelines), The key is to put try...catch in a script block in declarative pipeline syntax. Then it will work. This might be useful if you want to say continue pipeline execution despite failure (eg: test failed, still you need reports..)

NOTE: sh 'invalid command' --> Can fail the stage even though it is part of script.

script {
try {
sh 'do your stuff'
} catch (Exception e) {
sh 'Handle the exception!'
}
}




try {
sh 'might fail'
echo 'Succeeded!'
} catch (err) {
echo "Failed: ${err}"
} finally {
sh './tear-down.sh'
}




pipeline {
agent any
stages {
stage('Validate Fail fast') {
failFast true
parallel {
stage('stage A') {
steps {
echo 'stage A started'
sleep 5
script {
try {
sh 'I_AM_NOT_VALID_CMD'
} catch (Exception e) {
sh 'EVEN_I_AM_INVALID_2_FAIL_THIS_BUILD!'
}
}
echo 'stage A Ended' //will not execute because of above sh return
}
}
stage('stage B') {
steps {
echo 'stage B started'
sleep 10
echo 'stage B Ended' //will not execute because of above stage fail
}
}
stage('stage C') {
steps {
echo 'stage C started'
echo 'stage C Ended' //will not execute because of above stage fail
}
}
}
}
stage('final stage sequential') {
steps {
script {
echo "The complete run!"
}
}
}
}
}


Started by user admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /Users/Shared/Jenkins/Home/workspace/ErrorHandling
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Validate Fail fast)
[Pipeline] parallel
[Pipeline] { (Branch: stage A)
[Pipeline] { (Branch: stage B)
[Pipeline] { (Branch: stage C)
[Pipeline] stage
[Pipeline] { (stage A)
[Pipeline] stage
[Pipeline] { (stage B)
[Pipeline] stage
[Pipeline] { (stage C)
[Pipeline] echo
stage A started
[Pipeline] sleep
Sleeping for 5 sec
[Pipeline] echo
stage B started
[Pipeline] sleep
Sleeping for 10 sec
[Pipeline] echo
stage C started
[Pipeline] echo
stage C Ended
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ I_AM_NOT_VALID_CMD
/Users/Shared/Jenkins/Home/workspace/ErrorHandling@tmp/durable-5fc28a9a/script.sh: line 1: I_AM_NOT_VALID_CMD: command not found
[Pipeline] sh
+ 'EVEN_I_AM_INVALID_2_FAIL_THIS_BUILD!'
/Users/Shared/Jenkins/Home/workspace/ErrorHandling@tmp/durable-5e73fa36/script.sh: line 1: EVEN_I_AM_INVALID_2_FAIL_THIS_BUILD!: command not found
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
Failed in branch stage A
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
Failed in branch stage B
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (final stage sequential)
Stage "final stage sequential" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 127
Finished: FAILURE

https://support.cloudbees.com/hc/en-us/articles/218554077-How-to-set-current-build-result-in-Pipeline

currentBuild.result = 'FAILURE'  //Should be inside script
This will not stop the executions.

How to manipulate the build result of a Jenkins pipeline job? by design, "result can only get worse, else set is ignored" -> @see setResult() @ https://github.com/jenkinsci/jenkins/blob/213363d387736874f1d14d83e57347f757f3ed4f/core/src/main/java/hudson/model/Run.java#L462-L466

pipeline {
agent any
stages {
stage('Validate Fail fast') {
failFast true
parallel {
stage('stage A') {
steps {
echo 'stage A started'
sleep 5
script {
currentBuild.result = 'FAILURE'
}
echo "RESULT: ${currentBuild.result}"
echo 'stage A Ended'
}
}
stage('stage B') {
steps {
echo 'stage B started'
sleep 10
echo 'stage B wakeup'
script {
currentBuild.result = 'FAILURE'
}
echo "RESULT: ${currentBuild.result}"
echo 'stage B Ended' //will not execute because of above stage fail
}
}
stage('stage C') {
steps {
echo 'stage C started'
echo 'stage C Ended' //will not execute because of above stage fail
}
}
}
}
stage('final stage sequential') {
steps {
script {
echo "The complete run!"
}
}
}
}
}




Started by user admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /Users/Shared/Jenkins/Home/workspace/ErrorHandling
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Validate Fail fast)
[Pipeline] parallel
[Pipeline] { (Branch: stage A)
[Pipeline] { (Branch: stage B)
[Pipeline] { (Branch: stage C)
[Pipeline] stage
[Pipeline] { (stage A)
[Pipeline] stage
[Pipeline] { (stage B)
[Pipeline] stage
[Pipeline] { (stage C)
[Pipeline] echo
stage A started
[Pipeline] sleep
Sleeping for 5 sec
[Pipeline] echo
stage B started
[Pipeline] sleep
Sleeping for 10 sec
[Pipeline] echo
stage C started
[Pipeline] echo
stage C Ended
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline] // script
[Pipeline] echo
RESULT: FAILURE
[Pipeline] echo
stage A Ended
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] echo
stage B wakeup
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline] // script
[Pipeline] echo
RESULT: FAILURE
[Pipeline] echo
stage B Ended
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (final stage sequential)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
The complete run!
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: FAILURE

How to throw exception in jenkins pipeline?

Throwing exception is not smooth output.

pipeline {
agent any
stages {
stage('Validate Fail fast') {
failFast true
parallel {
stage('stage A') {
steps {
echo 'stage A started'
sleep 5
script {
throw new Exception()
}
echo "RESULT: ${currentBuild.result}"
echo 'stage A Ended' //will not execute because of above sh return
}
}
stage('stage B') {
steps {
echo 'stage B started'
sleep 10
echo 'stage B wakeup'
echo "RESULT: ${currentBuild.result}"
echo 'stage B Ended' //will not execute because of above stage fail
}
}
stage('stage C') {
steps {
echo 'stage C started'
echo 'stage C Ended' //will not execute because of above stage fail
}
}
}
}
stage('final stage sequential') {
steps {
script {
echo "The complete run!"
}
}
}
}
}


Started by user admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /Users/Shared/Jenkins/Home/workspace/ErrorHandling
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Validate Fail fast)
[Pipeline] parallel
[Pipeline] { (Branch: stage A)
[Pipeline] { (Branch: stage B)
[Pipeline] { (Branch: stage C)
[Pipeline] stage
[Pipeline] { (stage A)
[Pipeline] stage
[Pipeline] { (stage B)
[Pipeline] stage
[Pipeline] { (stage C)
[Pipeline] echo
stage A started
[Pipeline] sleep
Sleeping for 5 sec
[Pipeline] echo
stage B started
[Pipeline] sleep
Sleeping for 10 sec
[Pipeline] echo
stage C started
[Pipeline] echo
stage C Ended
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] script
[Pipeline] {
Scripts not permitted to use new java.lang.Exception. Administrators can decide whether to approve or reject this signature.
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
Failed in branch stage A
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
Failed in branch stage B
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (final stage sequential)
Stage "final stage sequential" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Also:   org.jenkinsci.plugins.workflow.steps.FlowInterruptedException
at org.jenkinsci.plugins.workflow.cps.CpsBodyExecution.cancel(CpsBodyExecution.java:253)
at org.jenkinsci.plugins.workflow.steps.BodyExecution.cancel(BodyExecution.java:76)
at org.jenkinsci.plugins.workflow.cps.steps.ParallelStepExecution.stop(ParallelStepExecution.java:67)
at org.jenkinsci.plugins.workflow.cps.steps.ParallelStep$ResultHandler$Callback.checkAllDone(ParallelStep.java:147)
at org.jenkinsci.plugins.workflow.cps.steps.ParallelStep$ResultHandler$Callback.onFailure(ParallelStep.java:134)
at org.jenkinsci.plugins.workflow.cps.CpsBodyExecution$FailureAdapter.receive(CpsBodyExecution.java:361)
at com.cloudbees.groovy.cps.impl.ThrowBlock$1.receive(ThrowBlock.java:68)
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use new java.lang.Exception
at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectNew(StaticWhitelist.java:271)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onNewInstance(SandboxInterceptor.java:174)
at org.kohsuke.groovy.sandbox.impl.Checker$3.call(Checker.java:200)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedConstructor(Checker.java:205)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.constructorCall(SandboxInvoker.java:21)
at WorkflowScript.run(WorkflowScript:12)
at ___cps.transform___(Native Method)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:97)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixName(FunctionCallBlock.java:78)
at jdk.internal.reflect.GeneratedMethodAccessor188.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
at com.cloudbees.groovy.cps.Next.step(Next.java:83)
at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:129)
at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:268)
at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:51)
at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:186)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:370)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:93)
at
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
Finished: FAILURE

How to throw exception in jenkins pipeline?

node { try { error 'Test error' } catch (ex) { echo 'Error handled' } }  //node has to be replaced with scripts

error can make the parallel pipeline stages to stop executing it.

The below 'unstable' command is similar to setting currentBuild.result = 'UNSTABLE'.

This will not stop the executions.

script {
unstable 'unstable'
}




pipeline {
agent any
stages {
stage('Validate Fail fast') {
failFast true
parallel {
stage('stage A') {
steps {
echo 'stage A started'
sleep 5
script {
error 'Test error'
}
echo "RESULT: ${currentBuild.result}"
echo 'stage A Ended' //will not execute because of above sh return
}
}
stage('stage B') {
steps {
echo 'stage B started'
sleep 10
echo 'stage B wakeup'
echo "RESULT: ${currentBuild.result}"
echo 'stage B Ended' //will not execute because of above stage fail
}
}
stage('stage C') {
steps {
echo 'stage C started'
echo 'stage C Ended' //will not execute because of above stage fail
}
}
}
}
stage('final stage sequential') {
steps {
script {
echo "The complete run!"
}
}
}
}
}








Started by user admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /Users/Shared/Jenkins/Home/workspace/ErrorHandling
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Validate Fail fast)
[Pipeline] parallel
[Pipeline] { (Branch: stage A)
[Pipeline] { (Branch: stage B)
[Pipeline] { (Branch: stage C)
[Pipeline] stage
[Pipeline] { (stage A)
[Pipeline] stage
[Pipeline] { (stage B)
[Pipeline] stage
[Pipeline] { (stage C)
[Pipeline] echo
stage A started
[Pipeline] sleep
Sleeping for 5 sec
[Pipeline] echo
stage B started
[Pipeline] sleep
Sleeping for 10 sec
[Pipeline] echo
stage C started
[Pipeline] echo
stage C Ended
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] script
[Pipeline] {
[Pipeline] error
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
Failed in branch stage A
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
Failed in branch stage B
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (final stage sequential)
Stage "final stage sequential" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: Test error
Finished: FAILURE

https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-catcherror-code-catch-error-and-set-build-result

catchError {
sh 'might fail'
}

This is equivalent to setting currentBuild.result = 'FAILURE'

This will not stop the executions.

pipeline {
agent any
stages {
stage('Validate Fail fast') {
failFast true
parallel {
stage('stage A') {
steps {
echo 'stage A started'
sleep 5
script {
catchError {
sh 'might fail'
}
}
echo "RESULT: ${currentBuild.result}"
echo 'stage A Ended' //will not execute because of above sh return
}
}
stage('stage B') {
steps {
echo 'stage B started'
sleep 10
echo 'stage B wakeup'
echo "RESULT: ${currentBuild.result}"
echo 'stage B Ended' //will not execute because of above stage fail
}
}
stage('stage C') {
steps {
echo 'stage C started'
echo 'stage C Ended' //will not execute because of above stage fail
}
}
}
}
stage('final stage sequential') {
steps {
script {
echo "The complete run!"
}
}
}
}
}




Started by user admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /Users/Shared/Jenkins/Home/workspace/ErrorHandling
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Validate Fail fast)
[Pipeline] parallel
[Pipeline] { (Branch: stage A)
[Pipeline] { (Branch: stage B)
[Pipeline] { (Branch: stage C)
[Pipeline] stage
[Pipeline] { (stage A)
[Pipeline] stage
[Pipeline] { (stage B)
[Pipeline] stage
[Pipeline] { (stage C)
[Pipeline] echo
stage A started
[Pipeline] sleep
Sleeping for 5 sec
[Pipeline] echo
stage B started
[Pipeline] sleep
Sleeping for 10 sec
[Pipeline] echo
stage C started
[Pipeline] echo
stage C Ended
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] script
[Pipeline] {
[Pipeline] catchError
[Pipeline] {
[Pipeline] sh
+ might fail
/Users/Shared/Jenkins/Home/workspace/ErrorHandling@tmp/durable-2b5ebe28/script.sh: line 1: might: command not found
[Pipeline] }
ERROR: script returned exit code 127
[Pipeline] // catchError
[Pipeline] }
[Pipeline] // script
[Pipeline] echo
RESULT: FAILURE
[Pipeline] echo
stage A Ended
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] echo
stage B wakeup
[Pipeline] echo
RESULT: FAILURE
[Pipeline] echo
stage B Ended
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (final stage sequential)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
The complete run!
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: FAILURE

If you wish to use certain methods/class you may get a similar message:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use new java.lang.RuntimeException java.lang.String

Typically it is followed by a link to the Scripts Approval page in your Jenkins (which you can update if you are an admin).

For example from my own Jenkins:

Scripts not permitted to use method org.w3c.dom.Element setAttribute java.lang.String java.lang.String. Administrators can decide whether to approve or reject this signature. org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method org.w3c.dom.Element setAttribute java.lang.String java.lang.String

The text Administrators can decide whether to approve or reject this signature. should be a link you can follow to the Jenkins Script Approval Page. It's URL is typically:

http://<Jenkins URL>/scriptApproval/

Or should be accessible via: Jenkins -> Manage -> In-process Script Approval

On this page you can approve that scripts can use these method/classes.

However you should just be able to throw an Exception - I can do this without needing to do a script approval.

For example within my Pipeline groovy script:

throw new Exception('Some error text')

This output in the Jenkins build console:

java.lang.Exception: Some error text
at WorkflowScript.processProjectsToUpdate(WorkflowScript:106)
at ___cps.transform___(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83)
at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:105)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:60)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:235)

This outputs quite a long stacktrace, the first line:

at WorkflowScript.processProjectsToUpdate(WorkflowScript:106)

Line 106 should be the the line in your Pipeline groovy script where the Exception was thrown, which may be useful information to you.

If you are not interested in the stacktrace, as in other answers just use error:

error('Some error text')

This is mentioned in the Jenkins Pipeline documentation: https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#error-error-signal

error: Error signal Signals an error. Useful if you want to conditionally abort some part of your program. You can also just throw new Exception(), but this step will avoid printing a stack trace.

How about System.exit(1) if the failing condition is met?

private void test(boolean status){
if(!status){
printReport();
System.exit(1);
}
}