2017-02-17 13 views
30

Tôi có tập lệnh đường ống trong Jenkins.Hiệu ứng trên @NonCPS trong tập lệnh đường dẫn Jenkins là gì

tôi đã sử dụng để có được ngoại lệ này:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts không được phép sử dụng phương pháp groovy.json.JsonSlurperClassic parseText java.lang.String

Tôi đã xem xét ngoại lệ và tôi đã tìm thấy một số dấu hiệu cho thấy tôi nên chú thích phương thức mà xảy ra ngoại lệ với @NonCPS. Tôi đã làm điều này, mà không thực sự hiểu điều này. Tuy nhiên,

Sau đó, ngoại lệ mà tôi đã ném vào phương thức đó không còn bị bắt theo mệnh đề try.

Vậy ý tưởng đằng sau @NonCPS là gì? Những tác động của việc sử dụng nó là gì?

Trả lời

37

Ngoại lệ bạn thấy là do script security và hộp cát. Về cơ bản, theo mặc định, khi bạn chạy tập lệnh đường ống, nó chạy trong hộp cát chỉ cho phép sử dụng các phương thức và lớp nhất định. Có nhiều cách để đưa vào danh sách trắng, kiểm tra liên kết ở trên.

Chú thích @NonCPS hữu ích khi bạn có phương pháp sử dụng các đối tượng không thể tuần tự hóa được. Thông thường, tất cả các đối tượng mà bạn tạo trong kịch bản đường dẫn phải được 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 để nó có thể bị tạm dừng và lưu trữ trên đĩa).

Khi bạn đặt @NonCPS trên phương thức, Jenkins sẽ thực thi toàn bộ phương pháp 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 nào hoặc phương pháp đã chuyển đổi CPS từ trong phương thức được chú thích @NonCPS. More information about this can be found here.

Đố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 điều sau đây và nó hoạt động như mong đợi:

@NonCPS 
def myFunction() { 
    throw new RuntimeException(); 
} 

try { 
    myFunction(); 
} catch (Exception e) { 
    echo "Caught"; 
} 

@NonCPS 
def myFunction() { 
    throw new RuntimeException(); 
} 

def mySecondFunction() { 
    try { 
     myFunction(); 
    } catch (Exception e) { 
     echo "Caught"; 
    } 
} 

mySecondFunction(); 

và cuối cùng là:

@NonCPS 
def myFunction() { 
    throw new RuntimeException(); 
} 

@NonCPS 
def mySecondFunction() { 
    try { 
     myFunction(); 
    } catch (Exception e) { 
     echo "Caught"; 
    } 
} 

mySecondFunction(); 

Tất cả print "Caught" như mong đợi.

Các vấn đề liên quan