Jika Anda ingin mendapatkan stdout DAN tahu apakah perintahnya berhasil atau tidak, gunakan saja returnStdout
dan bungkuslah dengan penangan pengecualian:
pipa scripted
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}")
}
keluaran :
[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
Sayangnya hudson.AbortException tidak memiliki metode yang berguna untuk mendapatkan status keluar itu, jadi jika nilai aktual diperlukan Anda harus menguraikannya keluar dari pesan (ugh!)
Bertentangan dengan Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html build tersebut adalah tidak gagal ketika pengecualian ini ditangkap. Gagal saat tidak tertangkap!
Memperbarui:
Jika Anda juga ingin keluaran STDERR dari perintah shell, Jenkins sayangnya gagal untuk mendukung kasus penggunaan umum dengan benar. Tiket 2017 JENKINS-44930 macet dalam kondisi ping-pong yang beralasan sementara tidak membuat kemajuan menuju solusi - harap pertimbangkan untuk menambahkan suara Anda ke dalamnya.
Sebagai solusi sekarang , mungkin ada beberapa pendekatan yang mungkin:
a) Redirect STDERR ke STDOUT 2>&1
- tetapi terserah Anda untuk menguraikannya dari output utama, dan Anda tidak akan mendapatkan output jika perintah gagal - karena Anda berada di handler pengecualian.
b) redirect STDERR ke file sementara (nama yang Anda persiapkan sebelumnya) 2>filename
(tapi ingat untuk membersihkan file sesudahnya) - yaitu. kode utama menjadi:
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) Pergi ke arah lain, atur returnStatus=true
sebagai gantinya, membuang pengecualian handler dan selalu menangkap output ke file, yaitu:
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
}
Peringatan: kode di atas adalah khusus Unix / Linux - Windows memerlukan perintah shell yang sama sekali berbeda.