2013-07-02 10 views
6

मुझे विकास प्रणाली से निर्माण प्रणाली स्थापित करने की आवश्यकता है ताकि प्रत्येक बिल्ड में सभी शाखाओं के लिए एक अद्वितीय निर्माण संख्या होगी।कई नौकरियों के लिए बिल्ड नंबर साझा करने के लिए जेनकींस को कैसे मनाने के लिए?

बिल्ड प्रत्येक शाखा के लिए नौकरियों का उपयोग करके जेनकिंस द्वारा बनाए जाते हैं।

एक जेनकींस प्लगइन है कि सेटअप एक नौकरी के लिए अगले buildnumber कर सकते हैं नहीं है, लेकिन यह कम से कम दो कारणों के लिए थोड़े बेकार है:

  • यह एक एकल नौकरी के लिए बिल्ड नंबर सेट हो जाएगा और आप सभी जानते हैं नहीं कर सकते कैसे सभी शाखाओं के लिए यह सेटअप क्योंकि वे या हटाया जा सकता है किसी भी समय जोड़ा को
  • यह वर्तमान बिल्ड के लिए यह निर्धारित नहीं करता है

हम निर्माण संख्या कैसे प्राप्त करने के लिए: हम साथ HTTP कॉल करते हैं गिट/मर्कुरियल में शाखा का नाम और संशोधन संख्या। इसके आधार पर केंद्रीकृत सेवर हमें प्रतिक्रिया के रूप में एक बिल्ड नंबर दे रहा है। यदि आप इसे एक ही पैरामीटर के साथ दो बार कहते हैं, तो आपको वही प्रतिक्रिया मिल जाएगी (वांछित व्यवहार)।

अब, हम जेनकिन्स को उसी बिल्ड संख्याओं का उपयोग करने के लिए कैसे बदल सकते हैं? जाहिर है, मैं स्क्रिप्ट से लौटाई गई बिल्ड संख्या का उपयोग कर सकता हूं, लेकिन नौकरी संख्या अलग होगी और मुझे संदेह है कि जेनकिंस को पता चलेगा कि मैंने अपनी स्क्रिप्ट के अंदर BUILD_NUMBER चर को छुआ है।

मुख्य रूप से, मुझे जो कुछ चाहिए वह प्री-जॉब-स्टार्ट स्क्रिप्ट है जिसे मैं चला सकता हूं, जो बिल्ड नंबर को नौकरी के लिए सौंपे जाने से पहले चलता है।

उत्तर

0

Build Name Setter Plugin और Description Setter Plugin देखें। वे बिल्ड आउटपुट के आधार पर निर्माण के बाद बिल्ड गुणों को सेट करने के लिए RegEx और/या चर का उपयोग करते हैं।

उदाहरण के लिए, आप इस रेगुलर एक्सप्रेशन से इस्तेमाल कर सकते हैं:

At revision (\d)+ 

और इस प्रतिस्थापन स्ट्रिंग

Build number is ${BUILD_NUMBER}; Subversion revision \1 

आप निर्माण के विवरण निर्धारित कर सकते हैं।

यदि आपके प्रतिस्थापन स्ट्रिंग में किसी निर्माण के लिए कुछ अद्वितीय नहीं है (उदा।, ${BUILD_NUMBER}), तो मेरा सुझाव है कि आप बिल्ड नाम को नहीं बदलते क्योंकि एक ही भंडार संशोधन के लिए कई बिल्ड हो सकते हैं।


अब, एक ही भंडार संशोधन पर कई नौकरियां कैसे प्राप्त करें, एक और बात है! ऐसा लगता है कि parameterized builds एक HTTP पोस्ट के माध्यम से शुरू किया जा सकता है। तो, आपके पास एक ऐसी नौकरी हो सकती है जो एससीएम परिवर्तन से ट्रिगर हो जाती है और प्रत्येक पैरामीटरयुक्त नौकरी को शेड्यूल करने के लिए एक HTTP टूल (उदा।, Wget) का उपयोग करती है।

14

आप अपने रन से पहले ग्रोवी स्क्रिप्ट का मूल्यांकन करने के लिए Environment Injector Plugin का उपयोग कर सकते हैं। मेरे पास लगभग एक ही आवश्यकता है, हालांकि, मेरे नाम पर केवल job_prefix_ के साथ ही नौकरियां समान अद्वितीय nextBuildNumber साझा करती हैं (दूसरे शब्दों में, job_prefix2_ के साथ अन्य नौकरियां उनके नाम में एक अलग nextBuildNumber साझा करती हैं)।

Evaluated Groovy Script अनुभाग में, का उपयोग करें:

import jenkins.model.* 

// Access to the Jenkins instance 
jenkins_instance = jenkins.model.Jenkins.instance 

// Select jobs that match. 
job_name = "^job_prefix_.*" 
allItems = jenkins_instance.items 
chosenJobs = allItems.findAll{ job -> job.name.matches(job_name) } 

// Get the max 
build_number = chosenJobs.collect{ it -> it.nextBuildNumber }.max() 

// Increase next build number 
currentJob.nextBuildNumber = build_number + 1 

// and use it. 
def map = [BUILD_NUMBER: build_number] 
return map 
+0

धन्यवाद एक टन शुरू कर देंगे! मेरे लिए काम किया मेरे मामले में, मैं क्लाउडबीज़ फ़ोल्डर प्लगइन का उपयोग कर रहा हूं, जिसने मुझे पैटर्न द्वारा खोजने की परेशानी बचाई। इसके बजाय मैंने getItems() विधि का उपयोग किया और "currentJob" :-) का उपयोग कर वर्तमान नौकरी हटा दी। –

8

मैं dnozay's answer ले लिया है, लेकिन कम से कम जेनकींस 1.586 के लिए, यह मेरे लिए काफी अच्छी तरह से काम नहीं करता। यहाँ समस्याओं मैं था कर रहे हैं: जेनकींस में

  1. बिल्ड नंबर का निर्माण इतिहास BUILD_NUMBER चर मैं काम में उपयोग से अलग है। ऐसा लगता है कि इस बिंदु पर BUILD_NUMBER सेट करना, भले ही Override Build Parameters सेट हो, बहुत देर हो चुकी है।
  2. अगला बिल्ड नंबर वर्तमान + 2 की बजाय वर्तमान + 2 होगा, मुझे लगता है कि ऐसा इसलिए है क्योंकि nextBuildNumber इस स्क्रिप्ट और जेनकिंस दोनों द्वारा बढ़ाया गया है।

    import jenkins.model.* 
    
    // Access to the Jenkins instance 
    jenkinsInstance = jenkins.model.Jenkins.instance 
    
    // Select jobs that match. 
    jobName = "^job_prefix.*" 
    allItems = jenkinsInstance.items 
    chosenJobs = allItems.findAll{ job -> job.name.matches(jobName) } 
    
    // Get the max 
    buildNumber = chosenJobs.collect{ job -> job.nextBuildNumber }.max() 
    
    // Increase next build number for all matching jobs 
    chosenJobs.each{ job -> job.updateNextBuildNumber(buildNumber) } 
    
    return [:] 
    

    फिर से, सारा श्रेय मूल स्क्रिप्ट के लिए dnzay को जाता है:

तो यहाँ अपने उत्तर के आधार पर एक अद्यतन संस्करण है।

संपादित करें: जब नई नौकरियां पैदा, एक पुराने एक है, नए लोगों को चलाने से पहले चलाने के लिए है नहीं तो वे साथ 1.

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

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