जेनकींस पाइपलाइन लिपि में @NonCPS का क्या प्रभाव है


110

मेरे पास जेनकिंस में एक पाइपलाइन स्क्रिप्ट है।

मुझे यह अपवाद मिलता था:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: लिपियों को विधि groovy.json का उपयोग करने की अनुमति नहीं है।

मैंने अपवाद को देखा और मुझे कुछ संकेत मिले कि मुझे उस पद्धति का एनोटेट करना चाहिए जहां पर अपवाद होता है @NonCPS। मैंने यह किया, वास्तव में यह समझने के बिना कि यह क्या करता है।

हालांकि इसके बाद, एक अपवाद जो मैं उस पद्धति में फेंक रहा था, वह अब एक tryखंड द्वारा नहीं पकड़ा गया था ।

तो पीछे क्या विचार है @NonCPS? इसका उपयोग करने के क्या प्रभाव हैं?


1
जेनकींस के आधिकारिक ब्लॉग में एक लेख है जो इस एनोटेशन का परिचय देता है और आपकी मदद कर सकता है। jenkins.io/blog/2017/02/01/pipeline-scalability-best-ults
1916

जवाबों:


141

आप जो अपवाद देख रहे हैं, वह स्क्रिप्ट सुरक्षा और सैंडबॉक्सिंग के कारण है । मूल रूप से, डिफ़ॉल्ट रूप से, जब आप एक पाइपलाइन स्क्रिप्ट चलाते हैं, तो यह सैंडबॉक्स में चलता है जो केवल कुछ विधियों और कक्षाओं के उपयोग की अनुमति देता है। श्वेतसूची संचालन के तरीके हैं, ऊपर दिए गए लिंक की जांच करें।

@NonCPSआप जो वस्तुओं जो serializable नहीं हैं का उपयोग तरीकों जब एनोटेशन उपयोगी है। आम तौर पर, आपके द्वारा अपनी पाइपलाइन स्क्रिप्ट में बनाई जाने वाली सभी वस्तुएँ क्रमबद्ध होनी चाहिए (इसका कारण यह है कि जेनकिंस को स्क्रिप्ट की स्थिति को क्रमबद्ध करने में सक्षम होना चाहिए ताकि इसे रोक दिया जा सके और डिस्क पर संग्रहीत किया जा सके)।

जब आप @NonCPSएक विधि पर रखते हैं, तो जेनकिन्स विराम देने की क्षमता के बिना एक ही बार में पूरी विधि निष्पादित करेगा। इसके अलावा, आपको किसी @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();

सभी प्रिंट "पकड़ा" उम्मीद के अनुसार।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.