निरंतर एकीकरण में कई शाखाओं को संभालना


85

मैं अपनी कंपनी में CI को स्केल करने की समस्या से निपट रहा हूं और उसी समय यह पता लगाने की कोशिश कर रहा हूं कि सीआई और कई शाखाओं के पास कौन सा तरीका है। स्टैकओवरफ़्लो, मल्टीपल फ़ीचर शाखाओं और निरंतर एकीकरण पर एक समान प्रश्न है । मैंने एक नई शुरुआत की है क्योंकि मैं अधिक चर्चा प्राप्त करना चाहता हूं और प्रश्न में कुछ विश्लेषण प्रदान करना चाहता हूं।

अब तक मैंने पाया है कि 2 मुख्य दृष्टिकोण हैं जो मैं ले सकता हूं (या शायद कुछ अन्य ???)।

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

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

जवाबों:


69

जब आप CI को स्केल करने के बारे में बात करते हैं तो आप अपने मेन सर्वर के साथ-साथ अपनी सभी फीचर शाखाओं को संभालने के लिए अपने CI सर्वर के उपयोग को बढ़ाने के बारे में बात कर रहे होते हैं। प्रारंभ में यह एक अच्छे दृष्टिकोण की तरह दिखता है क्योंकि एक शाखा में डेवलपर्स को स्वचालित परीक्षण के सभी फायदे मिलते हैं जो सीआई नौकरियों में शामिल हैं। हालाँकि, आप CI सर्वर नौकरियों (जैसे आपने खोजा है) को प्रबंधित करने में समस्याओं में भाग लेते हैं और इससे भी महत्वपूर्ण बात यह है कि आप वास्तव में CI नहीं कर रहे हैं। हां, आप CI सर्वर का उपयोग कर रहे हैं, लेकिन आप अपने सभी डेवलपर्स से कोड को लगातार एकीकृत नहीं कर रहे हैं।

वास्तविक सीआई का प्रदर्शन करने का मतलब है कि आपके सभी डेवलपर्स नियमित रूप से मेनलाइन के लिए प्रतिबद्ध हैं। कहने के लिए आसान है, लेकिन कठिन हिस्सा आपके आवेदन को तोड़ने के बिना कर रहा है। मैं अत्यधिक अनुशंसा करता हूं कि आप सतत वितरण को देखें , विशेष रूप से अध्याय 13 में अपने अनुप्रयोग को जारी रखने योग्य अनुभाग : प्रबंध घटक और निर्भरता । मुख्य बिंदु हैं:

  • समाप्त होने तक नई कार्यक्षमता छिपाएँ (AKA फ़ीचर टॉगल )।
  • सभी परिवर्तनों को छोटे परिवर्तनों की एक श्रृंखला के रूप में बढ़ाएँ, जिनमें से प्रत्येक भरोसेमंद है।
  • कोडबेस में बड़े पैमाने पर परिवर्तन करने के लिए अमूर्त द्वारा शाखा का उपयोग करें।
  • अपने एप्लिकेशन के कुछ हिस्सों को अलग-अलग दरों पर बदलने के लिए घटकों का उपयोग करें।

वे अमूर्त द्वारा शाखा को छोड़कर बहुत आत्म व्याख्यात्मक हैं। यह केवल एक फैंसी शब्द है:

  1. सिस्टम के उस हिस्से पर एक अमूर्तता बनाएं जिसे आपको बदलने की आवश्यकता है।
  2. एब्सट्रैक्शन लेयर का उपयोग करने के लिए बाकी सिस्टम को रिफलेक्टर करें।
  3. एक नया कार्यान्वयन बनाएं, जो पूर्ण होने तक उत्पादन कोड पथ का हिस्सा नहीं है।
  4. अपने नए कार्यान्वयन के लिए अपनी अमूर्त परत को अद्यतन करें।
  5. पुराने कार्यान्वयन को हटा दें।
  6. अगर यह अब उचित नहीं है, तो अमूर्त परत को हटा दें।

अध्याय 14 में शाखाओं, धाराओं और सतत एकीकरण अनुभाग से निम्नलिखित पैराग्राफ : उन्नत संस्करण नियंत्रण प्रभावों को सारांशित करता है।

वृद्धिशील दृष्टिकोण को निश्चित रूप से अधिक अनुशासन और देखभाल की आवश्यकता होती है - और वास्तव में अधिक रचनात्मकता - एक शाखा बनाने और गो-हो को पुन: स्थापत्य में लाने और नई कार्यक्षमता विकसित करने की तुलना में। लेकिन यह आपके परिवर्तनों को एप्लिकेशन को तोड़ने के जोखिम को काफी कम कर देता है, और आपकी और आपकी टीम को समय के विलय, टूटने को ठीक करने, और आपके आवेदन को एक तैनाती स्थिति में लाने का एक बड़ा सौदा बचाएगा।

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


4
टॉम, यह केवल अच्छी तरह से काम करता है अगर 1) रिलीज और अपडेट दोनों तुलनात्मक रूप से आसान हैं 2) आपके अधिकांश परिवर्तन अच्छी तरह से पृथक हैं। यह वेब देव के लिए सही है, लेकिन यदि आप बॉक्सिंग उत्पाद रिलीज़ कर रहे हैं, तो स्थिर संस्करणों को हर कीमत पर स्थिर रहना होगा, क्योंकि बड़े कॉर्पोरेट वातावरण में वास्तव में महंगे या असंभव हैं।
जेवगेनी कबानोव

13
वास्तविक CI केवल एकीकृत करने के बारे में नहीं है, यह फीडबैक के बारे में भी है
एंटोन अरिप्पोव

3
मैंने इसे उत्तर के रूप में चुना (कम से कम इनाम दिया था, कृपया मुझे बताएं कि क्या मुझे किसी तरह अभी भी इसे सही तरीके से चिह्नित करने की आवश्यकता है) लेकिन मुझे लगता है कि यह मेरी समस्या का समाधान नहीं है। मैंने zeroturnेशन
blog

1
@ जेवगेनी कबानोव और @toomasr आप दोनों को लगता है कि सच्चा CI करने का मतलब गुणवत्ता को त्यागना है और यह वेब देव के लिए ही काम करता है, क्योंकि यह फिक्स को धकेलना इतना आसान है। मैं अनुमान लगा रहा हूं कि आप जिस चीज के बारे में चिंतित हैं, वह रिलीज से पहले एक डोडी प्रतिबद्ध है। हां, इसके परिणामस्वरूप खराब रिलीज हो सकती है जिसे ठीक करना महंगा हो सकता है। हालाँकि, रिलीज़ होने से ठीक पहले एक फीचर ब्रांच पर एक डोडी कमिटेड है। यदि आपको लगता है कि कोई अंतर है तो कृपया अपने तर्क साझा करें। इसका मुकाबला करने का एक तरीका (यदि यह प्रतिबद्धता मेनलाइन या एक फीचर शाखा के लिए थी) कंटीन्यूअस डिलिवरी का उपयोग करना है।
टॉम हावर्ड

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

4

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

यदि आप CI सर्वर पर लोड के बारे में चिंतित हैं, तो आप कई सर्वरों पर लोड को संतुलित करने में मदद करने के लिए CI के अलग-अलग उदाहरण या यहां तक ​​कि अलग-अलग दास स्थापित कर सकते हैं। सुनिश्चित करें कि जिस सर्वर पर आप हडसन / जेनकिन्स चला रहे हैं वह पर्याप्त है। मैंने Apache Tomcat का उपयोग किया है और मुझे यह सुनिश्चित करना था कि बिल्ड कतार को संसाधित करने के लिए इसमें पर्याप्त मेमोरी और प्रोसेसिंग पावर हो।

यह महत्वपूर्ण है कि आप सीआई का उपयोग करके क्या हासिल करना चाहते हैं और फिर इसे बहुत मैनुअल प्रयास या दोहराव के बिना लागू करने का तरीका समझें। आपके बाह्य सर्वर प्रबंधन को सरल बनाने में मदद करने वाले आपके CI सर्वर द्वारा निष्पादित अन्य बाहरी टूल या स्क्रिप्ट का उपयोग करने में कुछ भी गलत नहीं है।


मुझे लगता है कि टूलींग की कमी का मतलब है कि इस विभाग में कुछ प्लगइन्स / उत्पादों के लिए जगह है। अपना लिखना नहीं चाहूंगा।
टॉमासर

1
: वहाँ कि प्रत्येक शाखा के लिए निर्माण विन्यास स्वचालित रूप से बनाता जेनकींस के लिए उपयोगिता है entagen.github.com/jenkins-build-per-branch
Kolen

3

मैं देव + स्थिर शाखाएँ चुनूँगा। और अगर आप अभी भी कस्टम शाखाएँ चाहते हैं और लोड से डरते हैं, तो क्यों न इन कस्टम को क्लाउड में स्थानांतरित करें और डेवलपर्स को इसे स्वयं प्रबंधित करने दें, जैसे http://cloudbees.com/dev.cb यह वह कंपनी है जहां कोहसके अब है । एक्लिप्स टूलिंग भी है, इसलिए यदि आप एक्लिप्स पर हैं, तो आपके पास इसे देव एनव्यू में कसकर एकीकृत किया जाएगा।


क्या मैं एक ही समस्या होने पर क्लाउड पर कई शाखाओं के प्रबंधन की कमी का व्यापार करूंगा? मेरा मतलब है कि मैं अब लोड का प्रबंधन करने में सक्षम हो जाएगा, लेकिन अभी भी शाखाएं नहीं?
टॉमासर

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

ओह, समझ गया। ब्रांच के मालिक को बताएं कि चेरी को अपनी पसंद की नौकरियों को चुनना है और उन्हें अपनी कस्टम ब्रांच के लिए सेट करना है जैसा वह चाहती है। मुझे यह विचार पसंद है।
टॉमासर

1

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

  • प्रत्येक सुविधा शाखा के लिए नेक्सस में अलग स्नैपशॉट रिपोजिटरी बनाएं
  • समर्पित दासों पर स्थानीय भंडार साझा करें
  • अपस्ट्रीम रिपॉजिटरी के साथ रिपॉजिटरी-सर्वर-प्लगइन का उपयोग करें
  • एक निजी भंडार के साथ एक नौकरी के भीतर सभी का निर्माण

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

लेकिन जैसा कि टॉम ने अच्छी तरह से ऊपर कहा था, यह सुविधा शाखाओं की आवश्यकता को दूर करने और साफ-सफाई को एकीकृत करने के लिए देवों को सिखाने के लिए अच्छा होगा, लेकिन यह एक लंबी प्रक्रिया है और परिणाम कई विरासत प्रणाली भागों के साथ स्पष्ट नहीं है जिन्हें आप किसी भी अधिक स्पर्श नहीं करेंगे।

मेरे 2 सेंट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.