मैंने घोषणात्मक दृष्टिकोण के लिए त्रुटि हैंडलिंग के विभिन्न तरीकों को नीचे दिखाया है:
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'
}
}
stage('stage B') {
steps {
echo 'stage B started'
sleep 10
echo 'stage B Ended'
}
}
stage('stage C') {
steps {
echo 'stage C started'
echo 'stage C Ended'
}
}
}
}
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]
[Pipeline] }
[Pipeline] sh
+ false
[Pipeline] }
[Pipeline]
[Pipeline] }
Failed in branch stage A
[Pipeline] }
[Pipeline]
[Pipeline] }
Failed in branch stage B
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] stage
[Pipeline] { (final stage sequential)
Stage "final stage sequential" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE
जब "फेलफस्ट झूठा" तब भी यह अन्य समानांतर कार्यों को जारी रखता है।
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]
[Pipeline] }
[Pipeline] sh
+ false
[Pipeline] }
[Pipeline]
[Pipeline] }
Failed in branch stage A
[Pipeline] echo
stage B Ended
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] stage
[Pipeline] { (final stage sequential)
Stage "final stage sequential" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE
जेनकिंस पाइपलाइन स्क्रिप्ट में ट्राइ-कैच ब्लॉक
पाइपलाइन की घोषणात्मक शैली में, इसलिए आपको कोशिश / कैच ब्लॉक (जो स्क्रिप्टेड पाइपलाइनों के लिए है) का उपयोग नहीं करना चाहिए, कुंजी की कोशिश है ... घोषणात्मक पाइपलाइन सिंटैक्स में स्क्रिप्ट ब्लॉक में पकड़। तब यह काम करेगा। यह उपयोगी हो सकता है यदि आप कहना चाहते हैं कि विफलता के बावजूद पाइपलाइन निष्पादन जारी रखें (उदाहरण के लिए: परीक्षण विफल रहा, फिर भी आपको रिपोर्ट की आवश्यकता है ..)
नोट: 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'
}
}
stage('stage B') {
steps {
echo 'stage B started'
sleep 10
echo 'stage B Ended'
}
}
stage('stage C') {
steps {
echo 'stage C started'
echo 'stage C Ended'
}
}
}
}
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]
[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]
[Pipeline] }
[Pipeline]
[Pipeline] }
Failed in branch stage A
[Pipeline] }
[Pipeline]
[Pipeline] }
Failed in branch stage B
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] stage
[Pipeline] { (final stage sequential)
Stage "final stage sequential" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[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'
This will not stop the executions.
जेनकींस पाइपलाइन नौकरी के निर्माण के परिणाम में हेरफेर कैसे करें?
डिज़ाइन के अनुसार, "परिणाम केवल खराब हो सकता है, अन्य सेट को नजरअंदाज कर दिया जाता है" -> @see setResult () @ https://github.com/jenkinsci/jenkins/blob/213363d387736874fd14d83d57d7f757f3ed3f4f/core/src/main/java/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'
}
}
stage('stage C') {
steps {
echo 'stage C started'
echo 'stage C Ended'
}
}
}
}
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]
[Pipeline] }
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline]
[Pipeline] echo
RESULT: FAILURE
[Pipeline] echo
stage A Ended
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline] echo
stage B wakeup
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline]
[Pipeline] echo
RESULT: FAILURE
[Pipeline] echo
stage B Ended
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] stage
[Pipeline] { (final stage sequential)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
The complete run!
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[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'
}
}
stage('stage B') {
steps {
echo 'stage B started'
sleep 10
echo 'stage B wakeup'
echo "RESULT: ${currentBuild.result}"
echo 'stage B Ended'
}
}
stage('stage C') {
steps {
echo 'stage C started'
echo 'stage C Ended'
}
}
}
}
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]
[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]
[Pipeline] }
[Pipeline]
[Pipeline] }
Failed in branch stage A
[Pipeline] }
[Pipeline]
[Pipeline] }
Failed in branch stage B
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] stage
[Pipeline] { (final stage sequential)
Stage "final stage sequential" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[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' } }
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'
}
}
stage('stage B') {
steps {
echo 'stage B started'
sleep 10
echo 'stage B wakeup'
echo "RESULT: ${currentBuild.result}"
echo 'stage B Ended'
}
}
stage('stage C') {
steps {
echo 'stage C started'
echo 'stage C Ended'
}
}
}
}
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]
[Pipeline] }
[Pipeline] script
[Pipeline] {
[Pipeline] error
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] }
Failed in branch stage A
[Pipeline] }
[Pipeline]
[Pipeline] }
Failed in branch stage B
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] stage
[Pipeline] { (final stage sequential)
Stage "final stage sequential" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[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'
}
}
stage('stage B') {
steps {
echo 'stage B started'
sleep 10
echo 'stage B wakeup'
echo "RESULT: ${currentBuild.result}"
echo 'stage B Ended'
}
}
stage('stage C') {
steps {
echo 'stage C started'
echo 'stage C Ended'
}
}
}
}
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]
[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]
[Pipeline] }
[Pipeline]
[Pipeline] echo
RESULT: FAILURE
[Pipeline] echo
stage A Ended
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline] echo
stage B wakeup
[Pipeline] echo
RESULT: FAILURE
[Pipeline] echo
stage B Ended
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] stage
[Pipeline] { (final stage sequential)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
The complete run!
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] }
[Pipeline]
[Pipeline] End of Pipeline
Finished: FAILURE