Stdout'u almak ve komutun başarılı olup olmadığını bilmek istiyorsanız, returnStdout
bunu bir istisna işleyicisine kullanın ve sarın:
kodlanmış boru hattı
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}")
}
çıktı :
[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
Ne yazık ki hudson.AbortException bu çıkış durumunu elde etmek için herhangi bir yararlı yöntemi içermiyor, bu nedenle gerçek değer gerekiyorsa iletiden ayrıştırmanız gerekir (ugh!)
Javadoc'un aksine https://javadoc.jenkins-ci.org/hudson/AbortException.html Bu kural dışı durum yakalandığında derleme başarısız olmaz . O ne zaman başarısız değil yakalandı!
Güncelleme:
STDERR çıktısının shell komutundan da olmasını istiyorsanız, Jenkins maalesef bu yaygın kullanım durumunu düzgün bir şekilde destekleyemiyor. Bir JENKINS-44930 2017 bileti , bir çözüme doğru ilerleme kaydederken, bir ping-pong durumunda sıkıştı - lütfen oyunuzu eklemeyi düşünün.
Şimdi bir çözüme gelince , birkaç olası yaklaşım olabilir:
a) STDERR'ı STDOUT'a yönlendirin 2>&1
- ancak bunu ana çıkıştan ayrıştırmak size kalmıştır ve komut başarısız olursa çıktıyı alamazsınız - çünkü istisna işleyicisindesiniz.
b) STDERR'ı geçici bir dosyaya (daha önce hazırladığınız adı) yönlendirin 2>filename
(ancak daha sonra dosyayı temizlemeyi unutmayın) - yani. ana kod:
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}")
}
c) Diğer yöne gidin, returnStatus=true
bunun yerine ayarlayın , istisna işleyicisinden vazgeçin ve çıktıyı her zaman bir dosyaya kaydedin, yani:
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
}
Dikkat: yukarıdaki kod Unix / Linux'a özgüdür - Windows tamamen farklı kabuk komutları gerektirir.