2016-04-14 15 views
5

समाप्त किए बिना @NonCPS विधि से विधियों को कैसे कॉल करें, मुझे जेनकिंस पाइपलाइन में कुछ JSON को पार्स करने और लूप में कुछ नियमित तरीकों को कॉल करने की आवश्यकता है, हालांकि स्क्रिप्ट हमेशा पहले फ़ंक्शन कॉल के बाद बाहर निकलती है। यह कैसे करना है?जेनकिन्स ग्रोवी पाइपलाइन

import groovy.json.JsonSlurper 
import com.cloudbees.groovy.cps.NonCPS 

@NonCPS 
def myMethod(String json) { 
    def jsonSlurper = new JsonSlurper() 
    def jsonObject = jsonSlurper(json) 
    jsonObject.each { 
     obj -> 
      switch(obj.name) { 
       case "foo": 
        doAThing(obj) 
        break 
       case "bar": 
        doAnotherThing(obj) 
        break 
      } 
    } 
} 

उपरोक्त उदाहरण में, यहां तक ​​कि के साथ एक json वस्तु की तरह:

[{ 
    "name": "foo" 
}, { 
    "name": "bar" 
}] 

... पाइपलाइन हमेशा पहले यात्रा के बाद बाहर निकालता है। संभवतः मिश्रण सिंक और एसिंक कार्यों के कारण यह संभवतः है। क्या इसे करने का कोई तरीका है?

+0

क्या आपने टाइपो देखा है: def jsonObject = jsonSurper (json) (दाईं ओर "l" गायब है)? – izzekil

+0

यह पोस्ट में सिर्फ एक टाइपो है, वास्तविक स्क्रिप्ट नहीं ... लेकिन अच्छी आंख @izzekil –

+1

आपको इसका सामना करना पड़ सकता है: https://issues.jenkins-ci.org/browse/JENKINS-31314 या यह: https: //issues.jenkins-ci.org/browse/JENKINS-26481 – izzekil

उत्तर

7

मैं निम्न कार्य करके अनिवार्य रूप से यह समस्या हल कर ली:

import groovy.json.JsonSlurper 

def myMethod(String json) { 
    def jsonSlurper = new JsonSlurper() 
    def jsonObject = jsonSlurper(json) 
    jsonSlurper = null 
    for(int i = 0; i < jsonObject.size(); i++) { 
     switch(jsonObject[i].name) { 
      case "foo": 
       doAThing(jsonObject[i]) 
       break 
      case "bar": 
       doAnotherThing(jsonObject[i]) 
       break 
     } 
    } 
} 

इसके तत्काल बाद, के बाद यह प्रयोग किया जाता है JsonSlurper उदाहरण नष्ट प्रत्येक के बजाय पाश के लिए एक सी शैली के लिए @NonCPS एनोटेशन, स्विच को हटा दें।

+0

शायद आपको यह भी पता चल जाएगा कि इस https://stackoverflow.com/questions/44629038/how-do-i-remove-a- समकालीन- फ़ोल्डर-on-exit-in-groovy को कैसे हल करें - हमें क्या करना चाहिए इसे जेनकींस में काम करने के लिए करें? – sorin

2

बस स्पष्ट करने के लिए, इस एक असमर्थित सुविधा के रूप में दर्ज है - https://github.com/jenkinsci/workflow-cps-plugin/#technical-design

आप नियमित रूप से (सीपीएस-बदल) विधियों, या पाइपलाइन चरणों फोन नहीं कर सकते हैं, एक @NonCPS विधि से, तो वे सबसे अच्छा उपयोग किया जाता है सारांश को मुख्य स्क्रिप्ट पर सारांशित करने से पहले कुछ गणना करने के लिए।

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