मेरे पास सरल पाइपलाइन स्क्रिप्ट है:

#!groovy

@org.jenkinsci.plugins.workflow.libs.Library('Some@lib')

import com.cloudbees.groovy.cps.NonCPS

node() {

    echo CheekyEnum.getByName('name1').getName()

}

enum CheekyEnum {

    ENUM_1('name1', 'f1'),
    ENUM_2('name2', 'f2')

    String name
    String field

    CheekyEnum(String name, String field) {
        this.name = name
        this.field = field
    }

    static CheekyEnum getByName(String name) {
        return values().find { it.name == name }
    }
    
    String getName() {
        return name
    }
}

जब मैं इसे चलाता हूं तो सब कुछ ठीक काम करता है, लेकिन अगर विधि में थोड़ा बदलाव होता है getName()

@NonCPS
String getName() {
    return name
}

मुझे एक बहुत लंबी त्रुटि स्टैकट्रेस मिलती है:

java.lang.StackOverflowError
    at java.lang.ClassLoader.loadClass(ClassLoader.java:398)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxResolvingClassLoader.lambda$loadClass$0(SandboxResolvingClassLoader.java:51)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxResolvingClassLoader.lambda$load$2(SandboxResolvingClassLoader.java:85)
    at com.github.benmanes.caffeine.cache.BoundedLocalCache.lambda$doComputeIfAbsent$14(BoundedLocalCache.java:2337)
    at java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1892)
    at com.github.benmanes.caffeine.cache.BoundedLocalCache.doComputeIfAbsent(BoundedLocalCache.java:2335)
    at com.github.benmanes.caffeine.cache.BoundedLocalCache.computeIfAbsent(BoundedLocalCache.java:2318)
    at com.github.benmanes.caffeine.cache.LocalCache.computeIfAbsent(LocalCache.java:111)
    at com.github.benmanes.caffeine.cache.LocalManualCache.get(LocalManualCache.java:54)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxResolvingClassLoader.load(SandboxResolvingClassLoader.java:79)
    ...

क्यों? क्या @NonCPS केवल सीपीएस रूपांतरण से बाहर की गई विधि को नहीं बनाता है?

1
RedMurloc 24 नवम्बर 2020, 16:06

1 उत्तर

सबसे बढ़िया उत्तर

Enum प्रति से एक क्रमबद्ध प्रकार है। तो आपको इसके लिए एक रैपर फ़ंक्शन बेहतर बनाना चाहिए:

import com.cloudbees.groovy.cps.NonCPS

node() {

    echo getName(CheekyEnum.getByName('name1'))

}
...
@NonCPS
String getName(CheekyEnum cheeky) {
    return cheeky.name
}

संबंधित StackOverflowError हो सकता है workflow-cps- में बग/गंध हो सकती है- प्लगइन. कृपया इसके तकनीकी डिज़ाइन पर एक नज़र डालें

पाइपलाइन स्क्रिप्ट @NonCPS एनोटेशन के साथ निर्दिष्ट विधियों को चिह्नित कर सकती हैं। फिर इन्हें सामान्य रूप से संकलित किया जाता है (सैंडबॉक्स सुरक्षा जांच को छोड़कर)।

AFAICS आप ग्रूवी सैंडबॉक्स के अंदर चल रहे हैं। सैंडबॉक्सइंटरसेप्टर शायद इस स्टैक ओवरफ्लो को उत्पन्न कर रहा है। सैंडबॉक्स के बाहर दौड़ने से आपकी समस्या भी ठीक होनी चाहिए।

BTW आप एक के लिए पाइपलाइन CPS मेथड मिसमैच भी पढ़ सकते हैं। गैर-सीपीएस रूपांतरित कोड में क्या कहा जा सकता है, इसकी बेहतर समझ।

2
Lorenzo Orsatti 24 नवम्बर 2020, 20:09