Ngoại lệ mà bạn đang thấy là do bảo mật tập lệnh và hộp cát. Về cơ bản, theo mặc định, khi bạn chạy một tập lệnh đường ống, nó sẽ chạy trong một hộp cát chỉ cho phép sử dụng một số phương thức và lớp nhất định. Có nhiều cách để lập danh sách trắng các hoạt động, hãy kiểm tra liên kết ở trên.
Các @NonCPS
chú thích rất hữu ích khi bạn có phương pháp mà sử dụng đối tượng mà không phải là serializable. Thông thường, tất cả các đối tượng mà bạn tạo trong tập lệnh đường ống của mình phải có thể tuần tự hóa (lý do cho điều này là Jenkins phải có khả năng tuần tự hóa trạng thái của tập lệnh để có thể tạm dừng và lưu trữ trên đĩa).
Khi bạn đặt @NonCPS
một phương thức, Jenkins sẽ thực thi toàn bộ phương thức trong một lần mà không có khả năng tạm dừng. Ngoài ra, bạn không được phép tham chiếu bất kỳ bước đường ống hoặc phương pháp được chuyển đổi CPS nào từ bên trong một @NonCPS
phương pháp được chú thích. Thông tin thêm về điều này có thể được tìm thấy ở đây .
Đối với việc xử lý ngoại lệ: Không chắc chắn 100% những gì bạn đang gặp phải; Tôi đã thử những cách sau và nó hoạt động như mong đợi:
@NonCPS
def myFunction() {
throw new RuntimeException();
}
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
và
@NonCPS
def myFunction() {
throw new RuntimeException();
}
def mySecondFunction() {
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
}
mySecondFunction();
và cuối cùng:
@NonCPS
def myFunction() {
throw new RuntimeException();
}
@NonCPS
def mySecondFunction() {
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
}
mySecondFunction();
Tất cả đều in "Caught" như mong đợi.