यदि आप स्टैडआउट प्राप्त करना चाहते हैं और यह जानते हैं कि कमांड सफल हुआ या नहीं, बस returnStdout
एक अपवाद हैंडलर में इसका उपयोग करें और इसे लपेटें:
स्क्रिप्टेड पाइपलाइन
try {
// Fails with non-zero exit if dir1 does not exist
def dir1 = sh(script:'ls -la dir1', returnStdout:true).trim()
} catch (Exception ex) {
println("Unable to read dir1: ${ex}")
}
आउटपुट :
[Pipeline] sh
[Test-Pipeline] Running shell script
+ ls -la dir1
ls: cannot access dir1: No such file or directory
[Pipeline] echo
unable to read dir1: hudson.AbortException: script returned exit code 2
दुर्भाग्य से hudson.AbortException उस निकास स्थिति को प्राप्त करने के लिए किसी भी उपयोगी विधि को याद कर रही है, इसलिए यदि वास्तविक मूल्य की आवश्यकता है तो आपको इसे संदेश से बाहर पार्स करने की आवश्यकता होगी (ugh!)
Javadoc के विपरीत https://javadoc.jenkins-ci.org/hudson/AbortException.html यह अपवाद पकड़े जाने पर बिल्ड विफल नहीं है। यह तब विफल हो जाता है जब यह पकड़ा नहीं जाता है !
अद्यतन:
यदि आप भी शेल कमांड से STDERR आउटपुट चाहते हैं, तो जेनकिंस दुर्भाग्य से उस सामान्य उपयोग के मामले का ठीक से समर्थन करने में विफल रहता है। 2017 का टिकट JENKINS-44930 एक समाधान की दिशा में कोई प्रगति नहीं करते हुए, विचारित पिंग-पोंग की स्थिति में फंस गया है - कृपया इसमें अपने उत्थान को जोड़ने पर विचार करें।
अब एक समाधान के रूप में , संभव दृष्टिकोण के एक जोड़े हो सकता है:
a) STDERR को STDOUT में रीडायरेक्ट करें 2>&1
- लेकिन यह आपके लिए है कि मुख्य आउटपुट से बाहर पार्स करें, और कमांड के विफल होने पर आपको आउटपुट नहीं मिलेगा - क्योंकि आप अपवाद हैंडलर में हैं।
b) STDERR को एक अस्थायी फ़ाइल (जिसका नाम आप पहले तैयार करते हैं) पर पुनर्निर्देशित करें 2>filename
(लेकिन बाद में फ़ाइल को साफ करना याद रखें) - यानी। मुख्य कोड बन जाता है:
def stderrfile = 'stderr.out'
try {
def dir1 = sh(script:"ls -la dir1 2>${stderrfile}", returnStdout:true).trim()
} catch (Exception ex) {
def errmsg = readFile(stderrfile)
println("Unable to read dir1: ${ex} - ${errmsg}")
}
ग) दूसरे तरीके से जाएं, returnStatus=true
इसके बजाय सेट करें , अपवाद हैंडलर के साथ वितरित करें और हमेशा फ़ाइल पर आउटपुट कैप्चर करें, अर्थात:
def outfile = 'stdout.out'
def status = sh(script:"ls -la dir1 >${outfile} 2>&1", returnStatus:true)
def output = readFile(outfile).trim()
if (status == 0) {
// output is directory listing from stdout
} else {
// output is error message from stderr
}
कैविएट: उपरोक्त कोड यूनिक्स / लिनक्स-विशिष्ट है - विंडोज के लिए पूरी तरह से अलग शेल कमांड की आवश्यकता होती है।