2017-02-17 7 views
30

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

मैं इस अपवाद प्राप्त करने के लिए प्रयोग किया है:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: स्क्रिप्ट विधि groovy.json.JsonSlurperClassic parseText java.lang.String

उपयोग की अनुमति नहीं

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

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

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

उत्तर

37

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

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

जब आप किसी विधि पर @NonCPS डालते हैं, तो जेनकिंस पूरी विधि को रोकने की क्षमता के बिना एक ही समय में निष्पादित करेगा। साथ ही, आपको @NonCPS एनोटेटेड विधि के भीतर से किसी भी पाइपलाइन चरणों या सीपीएस रूपांतरित विधियों को संदर्भित करने की अनुमति नहीं है। More information about this can be found here

अपवाद हैंडलिंग के लिए: 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(); 

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

संबंधित मुद्दे