Помилка збірки в Jenkinsfile


80

За певних умов я хочу провалити збірку. Як це зробити?

Я намагався:

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

Що трохи бентежить користувачів. Чи є кращий спосіб?

Відповіді:


170

Ви можете використовувати errorкрок від конвеєрного DSL, щоб провалити поточну збірку.

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

1
Чи знаєте ви, чи зберігається це повідомлення у такій змінній, як BUILD_NUMBER чи JOB_NAME тощо ...?
PRF

@PRF Чому б? Коли збірка не вдається, конвеєр закінчується. Де б ви тоді використали цю змінну?
Саймон Форсберг

1
Щоб використовувати це повідомлення в сповіщеннях поштою або в чаті
PRF

4
Просто скористайтесь ${env.BUILD_NUMBER} ${env.BUILD_URL}і${env.JOB_NAME}
присвячено

1
На post{fail{...}}етапі конвеєра може використовуватися сховище змінних .
sakurashinken

4

Я показав нижче різні способи обробки помилок для декларативного підходу:

failfast паралельно трубопроводу

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

Якщо у користувача є Декларативний сценарій конвеєра з паралельними етапами, і вони встановлені failFast trueдля цих етапів, якщо один із етапів не вдається, збірка негайно припиняється.

ПРИМІТКА: sh 'false' -> Може провалити етап

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!"
                 }
             }
         }
     }
}

Коли failFast trueвін припиняє паралельні завдання.

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

Коли "failFast false", він все одно продовжує виконувати інші паралельні завдання.

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 у сценарії конвеєра Jenkins

У декларативному стилі конвеєра, тому ви не повинні використовувати блоки try / catch (які призначені для сценарій конвеєрів). Ключ полягає в тому, щоб поставити try ... catch у блоці сценарію в декларативному синтаксисі конвеєра. Тоді це спрацює. Це може бути корисно, якщо ви хочете сказати продовжувати виконання конвеєра, незважаючи на збій (наприклад: тест не вдався, все-таки потрібні звіти ..)

ПРИМІТКА: sh 'невірна команда' -> Може провалити етап, навіть якщо він є частиною сценарію.

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.

Як маніпулювати результатом збірки роботи конвеєра Дженкінса? за задумом, "результат може тільки погіршитися, інакше набір ігнорується" -> @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

Як закинути виняток у трубопровід дженкінс?

Мета винятку - це не плавний вихід.

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

Як закинути виняток у трубопровід дженкінс?

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

error може зробити паралельні етапи трубопроводу, щоб припинити його виконання.

Наведена нижче unstableкоманда ' ' подібна до встановлення currentBuild.result = ' UNSTABLE'.

Це не зупинить страти.

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'
    }

Це еквівалентно налаштуванню currentBuild.result = 'FAILURE'

Це не зупинить страти.

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


1

Якщо ви хочете використовувати певні методи / клас, ви можете отримати подібне повідомлення:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Скриптам заборонено використовувати новий java.lang.RuntimeException java.lang.String

Зазвичай за цим посилається посилання на сторінку схвалення сценаріїв у вашому Jenkins (яке ви можете оновити, якщо ви адміністратор).

Наприклад, від мого власного Дженкінса:

Сценарії не мають права використовувати метод org.w3c.dom.Element setAttribute java.lang.String java.lang.String. Адміністратори можуть вирішити, затвердити чи відхилити цей підпис. org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Скриптам заборонено використовувати метод org.w3c.dom.Element setAttribute java.lang.String java.lang.String

Адміністратори тексту можуть вирішити, затвердити чи відхилити цей підпис. має бути посиланням, яке ви можете перейти на Сторінку затвердження сценарію Дженкінса. Зазвичай це URL-адреса:

http://<Jenkins URL>/scriptApproval/

Або має бути доступний через: Дженкінс -> Керування -> Підтвердження сценарію в процесі

На цій сторінці ви можете погодитись, що сценарії можуть використовувати ці методи / класи.

Однак ви просто повинні мати можливість створити виняток - я можу це зробити, не вимагаючи схвалення сценарію.

Наприклад, у моєму грубому сценарії Pipeline:

throw new Exception('Some error text')

Цей результат у консолі побудови Jenkins:

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)

Це виводить досить довгий стек, перший рядок:

у WorkflowScript.processProjectsToUpdate (WorkflowScript: 106 )

Рядок 106 повинен бути рядком у вашому грубому сценарії Pipeline, куди було викинуто виняток, що може бути корисною інформацією для вас.

Якщо вас не цікавить стек, як і в інших відповідях, просто використовуйте помилку :

error('Some error text')

Про це згадується в документації трубопроводу Дженкінса: https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#error-error-signal

помилка: сигнал помилки сигналізує про помилку. Корисно, якщо ви хочете умовно перервати якусь частину вашої програми. Ви також можете просто викинути новий виняток (), але цей крок дозволить уникнути друку трасування стека.


0

Як щодо того, System.exit(1)якщо виконана умова, що не відповідає?

private void test(boolean status){
    if(!status){
       printReport();
       System.exit(1);
     }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.