আপনি যদি স্টাডাউট পেতে চান এবং কমান্ডটি সফল হয়েছে কিনা তা জানতে চান, কেবলমাত্র 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
দুর্ভাগ্যক্রমে হডসন.এবার্ট এক্সপ্লেশন সেই প্রস্থান স্থিতিটি পেতে কোনও কার্যকর পদ্ধতি অনুপস্থিত, সুতরাং যদি আসল মান প্রয়োজন হয় তবে আপনাকে বার্তাটি ছাড়িয়ে তা ছড়িয়ে দিতে হবে (উ!)
জাভাডোক https://javadoc.jenkins-ci.org/hudson/AbortException.html এর বিপরীতে এই ব্যতিক্রম ধরা পড়লে বিল্ডটি ব্যর্থ হয় না । ধরা না পড়লে ব্যর্থ হয় !
আপডেট:
আপনিও যদি শেল কমান্ড থেকে এসটিডিআরআর আউটপুট চান, জেনকিনস দুর্ভাগ্যক্রমে সেই সাধারণ ব্যবহারের ক্ষেত্রে সঠিকভাবে সমর্থন করতে ব্যর্থ। একটি 2017 টিকিট জেনকিনস -৪৪৯৩০ কোনও সমাধানের দিকে অগ্রগতি না করে মতামতযুক্ত পিং-পং অবস্থায় আটকে আছে - দয়া করে এতে আপনার আপভোট যুক্ত করার বিষয়টি বিবেচনা করুন।
এখনই সমাধান হিসাবে , কয়েকটি সম্ভাব্য পন্থা থাকতে পারে:
ক) STDERR কে STDOUT এ পুনর্নির্দেশ করুন 2>&1
- তবে এটি মূল আউটপুটটি বাইরে রেখে পার্স করা আপনার পক্ষে, এবং কমান্ড ব্যর্থ হলে আপনি আউটপুট পাবেন না - কারণ আপনি ব্যতিক্রম হ্যান্ডলারটিতে রয়েছেন।
খ) এসটিডিআরআরকে একটি অস্থায়ী ফাইলে পুনর্নির্দেশ করুন (যার নামটি আপনি আগে প্রস্তুত করেন) 2>filename
(তবে পরে ফাইলটি পরিষ্কার করতে ভুলবেন না) - অর্থাৎ ie প্রধান কোড হয়ে যায়:
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
}
ক্যাভ্যাট: উপরের কোডটি ইউনিক্স / লিনাক্স-নির্দিষ্ট - উইন্ডোজের সম্পূর্ণ পৃথক শেল কমান্ড প্রয়োজন।