2016-10-20 15 views
7

के भीतर ग्रोवी का उपयोग करके मानचित्र पर पुनरावृत्ति करने की असंभवता हम Map पर फिर से प्रयास करने की कोशिश कर रहे हैं, लेकिन बिना किसी सफलता के। हम इस कम से कम उदाहरण के लिए हमारी मुद्दा कम:जेनकिन्स पाइपलाइन

def map = [ 
      'monday': 'mon', 
      'tuesday': 'tue', 
      ] 

हम साथ पुनरावृति करने का प्रयास करें: monday:mon


विकल्प हम जानते हैं:

map.each{ k, v -> println "${k}:${v}" } 

केवल पहली प्रविष्टि उत्पादन होता है लूप में प्रवेश करने में भी सक्षम नहीं हैं:

for (e in map) 
{ 
    println "key = ${e.key}, value = ${e.value}" 
} 

या

for (Map.Entry<String, String> e: map.entrySet()) 
{ 
    println "key = ${e.key}, value = ${e.value}" 
} 

असफल रहे हैं, दोनों एकमात्र अपवाद java.io.NotSerializableException: java.util.LinkedHashMap$Entry दिखा। (जो 'वास्तविक' अपवाद को उठाते हुए अपवाद से संबंधित हो सकता है, जो हमें यह जानने से रोकता है कि क्या हुआ)।

हम नवीनतम स्थिर जेनकींस (2.1 9 .1) का उपयोग कर रहे हैं, सभी प्लगइन्स आज (2016/10/20) के अनुसार अद्यतित हैं।

क्या जेनकिंस पाइपलाइन ग्रोवी स्क्रिप्ट के भीतर Map में तत्वों पर पुनरावृत्ति करने का कोई समाधान है?

उत्तर

17

यह कुछ समय बाद से मैंने खेला था, लेकिन नक्शे (और अन्य कंटेनर) के माध्यम से फिर से शुरू करने का सबसे अच्छा तरीका लूप के लिए "शास्त्रीय" या "इन" के साथ था। देखें Bug: Mishandling of binary methods accepting Closure

आपकी विशिष्ट समस्या के लिए, अधिकांश (सभी?) पाइपलाइन डीएसएल कमांड एक अनुक्रम बिंदु जोड़ देंगे, जिसका मतलब है कि मेरा मतलब है कि पाइपलाइन की स्थिति को सहेजना और बाद में इसे फिर से शुरू करना संभव है। उदाहरण के लिए उपयोगकर्ता इनपुट की प्रतीक्षा करने के बारे में सोचें, आप इस स्थिति को पुनरारंभ के माध्यम से भी रखना चाहते हैं। नतीजा यह है कि प्रत्येक लाइव इंस्टेंस को क्रमबद्ध किया जाना चाहिए - लेकिन मानक मैप इटेटरेटर दुर्भाग्य से धारावाहिक नहीं है। Original Thread

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

@NonCPS 
def mapToList(depmap) { 
    def dlist = [] 
    for (def entry2 in depmap) { 
     dlist.add(new java.util.AbstractMap.SimpleImmutableEntry(entry2.key, entry2.value)) 
    } 
    dlist 
} 

यह स्पष्ट रूप से कहा जा करने के लिए प्रत्येक नक्शे के लिए आप पुनरावृति करना चाहते है, लेकिन उल्टा यह, लूप के शरीर ही रहता है।

for (def e in mapToList(map)) 
{ 
    println "key = ${e.key}, value = ${e.value}" 
} 

आप SimpleImmutableEntry निर्माता पहली बार स्वीकृत करने के लिए होगा, या बहुत संभव है आप वर्कफ़्लो पुस्तकालय में mapToList समारोह रखकर कि आस-पास काम कर सकता है।

+12

जेनकिंस के साथ एक घंटे की लंबी लड़ाई के बाद इस पोस्ट को मिला। एक देशी डेटा संरचना पर सरल पुनरावृत्त करने के लिए इस संघर्ष से गुजरना अपमानजनक है! –

+2

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

+0

मैंने इस समाधान का उपयोग किया लेकिन फिर भी एक त्रुटि प्राप्त हुई: "org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: स्क्रिप्ट को नए उपयोग करने की अनुमति नहीं है" (यह नक्शा के अंदर नया है) –

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