Nếu bạn muốn nhận được thiết bị xuất chuẩn VÀ biết liệu lệnh có thành công hay không, chỉ cần sử dụng returnStdout
và bọc nó trong một trình xử lý ngoại lệ:
đường ống dẫn
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}")
}
đầu ra :
[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
Thật không may hudson.AbortException thiếu bất kỳ phương thức hữu ích nào để có được trạng thái thoát đó, vì vậy nếu giá trị thực tế là bắt buộc, bạn cần phải phân tích nó ra khỏi tin nhắn (ugh!)
Trái ngược với Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html việc xây dựng không bị thất bại khi ngoại lệ này bị bắt. Nó thất bại khi nó không bị bắt!
Cập nhật:
Nếu bạn cũng muốn đầu ra STDERR từ lệnh shell, Jenkins không may không hỗ trợ đúng trường hợp sử dụng thông thường đó. Một vé năm 2017 JENKINS-44930 bị kẹt trong tình trạng bóng bàn gây tranh cãi trong khi không có tiến triển nào đối với giải pháp - vui lòng xem xét việc thêm upvote của bạn vào đó.
Như một giải pháp bây giờ , có thể có một vài cách tiếp cận có thể:
a) Chuyển hướng STDERR sang STDOUT 2>&1
- nhưng sau đó, bạn phải phân tích ra khỏi đầu ra chính và bạn sẽ không nhận được đầu ra nếu lệnh thất bại - vì bạn đang xử lý ngoại lệ.
b) chuyển hướng STDERR sang một tệp tạm thời (tên mà bạn chuẩn bị trước đó) 2>filename
(nhưng nhớ làm sạch tệp sau đó) - tức là. mã chính trở thành:
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) Đi theo cách khác, returnStatus=true
thay vào đó, phân phối với trình xử lý ngoại lệ và luôn luôn bắt đầu ra thành một tệp, nghĩa là:
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
}
Hãy cẩn thận: đoạn mã trên là dành riêng cho Unix / Linux - Windows yêu cầu các lệnh shell hoàn toàn khác nhau.