2016-07-04 12 views
7

हम एक जटिल परियोजना के लिए जेनकिंस पाइपलाइन प्लगइन का उपयोग करने पर विचार कर रहे हैं जिसमें विलय होने से पहले विभिन्न उपकरणों (विभिन्न मशीनों पर) का उपयोग करके कई डिलीवरी शामिल हैं। फिर भी, यह एक Jenkinsfile के साथ एक पूर्ण निर्माण करने के लिए काफी आसान लगता है, और मुझे पाइपलाइन के साथ आने वाली गिट शाखाओं की स्वचालित खोज पसंद है।अलग नौकरी के रूप में एक पाइपलाइन के भाग भाग

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

इस का अनुकरण करने के लिए, कुछ विचार मन में आया था:

  • उपयोग विभिन्न Jenkinsfile प्रसव के लिए और शीर्ष स्तर के Jenkinsfile में load उन्हें; ऐसा लगता है कि मल्टीब्रैंच पाइपलाइन जॉब अभी तक (https://issues.jenkins-ci.org/browse/JENKINS-35415) का उपयोग करने के लिए Jenkinsfile को कॉन्फ़िगर करने की अनुमति नहीं देता है, इसलिए, व्यक्तिगत वितरण के लिए नौकरियां बनाना अभी भी खुला है।
  • "शीर्ष-स्तरीय" नौकरी के लिए कॉन्फ़िगरेशन विकल्प प्रदान करें और एसमें सभी डिलीवरी के लिए बनाने के लिए चुनने में सक्षम होने के लिए if एस है। यह एक अलग पाइपलाइन में अलग-अलग प्रकार के प्रकारों को मिलाएगा, और, कम से कम, निर्माण समय के आकलन को गड़बड़ कर देगा।

क्या वे व्यवहार्य विकल्प हैं, या क्या कोई बेहतर है?

+1

यह प्रश्न http://stackoverflow.com/questions/38129745/jenkins-build-pipeline-restart-at-stage के समान ही है, हालांकि वह पुनरारंभ करने के बारे में है। फिर भी, उस प्रश्न के उत्तर भी इस सवाल को पकड़ते हैं। – olenz

उत्तर

5

तुम कर सकते हो क्या एक पाइपलाइनिंग स्क्रिप्ट है कि लिखने के लिए है "अगर" एकल चरणों के आसपास -guards, इस तरह:

stage "s1" 
if (theStage in ["s1","all"]) { 
    sleep 2 
} 

stage "s2" 
if (theStage in ["s2", "all"]) { 
    sleep 2 
} 

stage "s3" 
if (theStage in ["s3", "all"]) { 
    sleep 2 
} 

तो फिर तुम एक "मुख्य" काम इस स्क्रिप्ट का उपयोग करता है बना सकते हैं और पैरामीटर "theStage" को "सभी" पर सेट करके सभी चरणों को एक साथ चलाता है। यह कार्य आंकड़े एकत्र करेगा जब सभी चरण एक साथ चलते हैं और आपको उपयोगी अनुमान समय देते हैं।

इसके अलावा, आप इस स्क्रिप्ट का उपयोग करने वाली "आंशिक दौड़" नौकरी कर सकते हैं और यह उस चरण के साथ parametrized है जिसे आप चलाने के लिए चाहते हैं। हालांकि, अनुमान बहुत उपयोगी नहीं होगा।

ध्यान दें कि मैंने मंच को मुख्य स्क्रिप्ट पर रखा है और मार्टिन बा द्वारा सुझाए गए अनुसार केवल निष्पादन कोड को सशर्त में रखा है। यह सुनिश्चित करें कि काम के दृश्य और अधिक विश्वसनीय

+0

यह * एक अच्छा विचार है, हालांकि: ["गतिशील चरण: सामान्य रूप से, यदि आप गतिशील रूप से बदलते चरणों को विज़ुअलाइज़ करना चाहते हैं, तो इसे चरण सामग्री को निष्पादित करने के लिए सशर्त बनाएं, चरण को शामिल करने के लिए सशर्त नहीं है"] (https: // wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+View+Plugin) –

+0

अच्छी सलाह। मैं इसे अपने उत्तर में जोड़ दूंगा। – olenz

0

पिछले जवाब का एक विस्तार के रूप में है बनाता है, मैं ऐसा ही कुछ प्रस्ताव हैं:

def stageIf(String name, Closure body) { 
if (params.firstStage <= name && params.lastStage >= name) { 
    stage(name, body) 
} else { 
    stage(name) { 
     echo "Stage skipped: $name" 
    } 
} 
} 

node('linux') { 
properties([ 
     parameters([ 
       choiceParam(
         name: 'firstStage', 
         choices: '1.Build\n' + 
           '2.Docker\n' + 
           '3.Deploy', 
         description: 'First stage to start', 
         defaultValue: '1.Build', 
       ), 
       choiceParam(
         name: 'lastStage', 
         choices: '3.Deploy\n' + 
           '2.Docker\n' + 
           '1.Build', 
         description: 'Last stage to start', 
         defaultValue: '3.Deploy', 
       ), 
     ]) 
]) 

stageIf('1.Build') { 
    // ... 
} 
stageIf('3.Deploy') { 
    // ... 
} 
} 

रूप में एकदम सही नहीं मैं चाहता हूँ के रूप में लेकिन कम से कम अपने काम कर रहे।

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