ผลกระทบของ @NonCPS ในสคริปต์ไปป์ไลน์ของเจนกินส์คืออะไร


111

ฉันมีสคริปต์ไปป์ไลน์ในเจนกินส์

ฉันเคยได้รับข้อยกเว้นนี้:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: สคริปต์ไม่ได้รับอนุญาตให้ใช้เมธอด groovy.json.JsonSlurperClassic parseText java.lang.String

@NonCPSผมมองข้อยกเว้นขึ้นและผมพบว่าตัวชี้วัดบางอย่างที่ฉันควรใส่คำอธิบายประกอบวิธีการที่เกิดขึ้นกับ theexception ฉันทำสิ่งนี้โดยไม่เข้าใจจริงๆว่ามันทำอะไร

อย่างไรก็ตามหลังจากนั้นข้อยกเว้นที่ว่าฉันกำลังขว้างปาด้วยวิธีนั้นก็ไม่ถูกจับโดยtryประโยคอีกต่อไป

แล้วแนวคิดเบื้องหลัง@NonCPSคืออะไร? ผลของการใช้งานคืออะไร?


1
บล็อกอย่างเป็นทางการของเจนกินส์มีบทความที่แนะนำคำอธิบายประกอบนี้และอาจช่วยคุณได้ jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice
袁文涛

คำตอบ:


142

ข้อยกเว้นที่คุณเห็นเกิดจากความปลอดภัยของสคริปต์และแซนด์บ็อกซ์ โดยพื้นฐานแล้วโดยค่าเริ่มต้นเมื่อคุณรันสคริปต์ไปป์ไลน์จะทำงานในแซนด์บ็อกซ์ซึ่งอนุญาตให้ใช้เฉพาะเมธอดและคลาสบางอย่างเท่านั้น มีหลายวิธีในการดำเนินการที่อนุญาตพิเศษตรวจสอบลิงก์ด้านบน

@NonCPSคำอธิบายประกอบเป็นประโยชน์เมื่อคุณมีวิธีการที่ใช้วัตถุที่ไม่ serializable โดยปกติออบเจ็กต์ทั้งหมดที่คุณสร้างในสคริปต์ไปป์ไลน์ของคุณจะต้องสามารถต่ออนุกรมกันได้ (เหตุผลก็คือเจนกินส์ต้องสามารถทำให้สถานะของสคริปต์เป็นอนุกรมเพื่อให้สามารถหยุดชั่วคราวและเก็บไว้ในดิสก์ได้)

เมื่อคุณ@NonCPSใช้วิธีการ Jenkins จะดำเนินการวิธีการทั้งหมดในครั้งเดียวโดยไม่สามารถหยุดชั่วคราวได้ นอกจากนี้คุณไม่ได้รับอนุญาตให้อ้างอิงขั้นตอนไปป์ไลน์หรือวิธีการแปลง CPS จากภายใน@NonCPSวิธีการที่มีคำอธิบายประกอบ ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้สามารถพบได้ที่นี่

สำหรับการจัดการข้อยกเว้น: ไม่แน่ใจ 100% ว่าคุณกำลังประสบกับอะไร ฉันได้ลองทำสิ่งต่อไปนี้แล้วและได้ผลตามที่คาดไว้:

@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();

และในที่สุดก็:

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

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

mySecondFunction();

พิมพ์ "Caught" ทั้งหมดตามที่คาดไว้


เมื่อฉันใช้ @NonCPS เจนกินส์ไม่สามารถหาวิธีนั้นได้เนื่องจากฉันได้รับข้อผิดพลาดเช่นhudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method
อรุณ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.