लंबे समय तक अप्रबंधित कोड के लिए गेट ब्रांचिंग रणनीति


15

हमारी टीम में, काम की व्यक्तिगत इकाइयों (कहानियों) के अलावा, हमारे पास काम की लंबी अवधि के विषय (महाकाव्य) हैं। एकाधिक कहानियाँ एक महाकाव्य बनाती हैं।

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

क्या इसे प्राप्त करने के लिए हमारे रेपो को प्रबंधित करने के बारे में कोई सुझाव हैं? मैंने "महाकाव्य शाखाओं" को शुरू करने पर विचार किया है, जहाँ हम बंद कहानियों को संबंधित करने के लिए संबंधित महाकाव्य शाखा में सीधे मर्ज करने के बजाय मास्टर में विलय कर देंगे, लेकिन मेरी चिंताएँ हैं:

  • मुझे मर्ज संघर्ष की चिंता है जो महाकाव्य शाखाओं को लंबे समय तक खुला रखने पर उत्पन्न हो सकती है
  • रात्रि के निर्माण के लिए सभी महाकाव्य शाखाओं को "रात्रिकालीन निर्माण" शाखा में विलय करने की आवश्यकता होगी। फिर से, मर्ज संघर्ष पैदा हो सकता है, और यह स्वचालित रूप से किया जाना है

जवाबों:


23

सरल सुझाव: ऐसा मत करो।

git शाखाएं कोड के लंबे समय तक चलने वाले कांटे के लिए नहीं हैं, जैसा कि चर्चा की गई है यहां है और https://blog.newrelic.com/2012/11/14/long-running-branches-considered-harmful/ । शाखाओं को सबसे अच्छा माना जाता है क्योंकि दिन-प्रतिदिन के स्तर पर व्यक्तिगत डेवलपर द्वारा कमिट आयोजित करने के लिए इस्तेमाल की जाने वाली क्षणिक चीजें। इसलिए यदि उनके पास एक ऐसा नाम है जो किसी परियोजना प्रबंधक से मिलता है (चलो अंत उपयोगकर्ता) तो आपको परवाह हो सकती है कि आप कुछ गलत कर रहे हैं।

अनुशंसित अभ्यास फीचर टॉगल के साथ निरंतर एकीकरण का उपयोग करना है या शाखा-दर-अमूर्त के करना है:

  • सभी कोड हर समय एकीकृत होते हैं (कम से कम हर दिन, अधिमानतः अधिक बार)
  • क्या हो जाता है तैनात स्पष्ट नियंत्रण में है।

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

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

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

2
लिंक किया गया ब्लॉग पोस्ट अब 5 साल पुराना है। मुझे टॉगल से नफरत है। लंबे समय तक शाखा लगाने में क्या गलत है, नियमित रूप से मुख्य से फीचर शाखा में वापस विलय करना, और दीर्घकालिक सुविधा शाखा में निरंतर एकीकरण जोड़ना?
जेसन केली

CI एक प्रक्रिया का नाम है, न कि एक उपकरण। यदि आपके पास एक से अधिक सुविधा शाखा हैं, तो वे आम तौर पर एक दूसरे के साथ निरंतर एकीकृत नहीं होंगे। जिसका अर्थ है कि समस्याओं को जल्द से जल्द ढूंढना।
सोरू

1

मुझे लगता है कि यह एक बहुत ही आम समस्या है और यह चुनने के लिए उबालता है कि पहले की बजाय सुविधाओं को कोडित किए जाने के बाद कौन सी विशेषताओं को रिलीज़ में शामिल किया जाए।

जैसे।

मेरे पास अपने उत्पाद के v2 के लिए A, B और C हैं। B और C संबंधित हैं, मैं B को तब तक जारी नहीं करना चाहता जब तक कि C भी समाप्त नहीं हो जाता।

मेरे पास तीन देव हैं जो सभी सुविधाओं पर एक ही समय में काम कर रहे हैं।

मेरे पास रिलीज डेट डी में एक सेट है

B समाप्त हो गया है और मर्ज हो गया है, A समाप्त हो गया है और मर्ज हो गया है। C में देरी हो रही है ... मैं क्या करूँ?

मैं नहीं मानता कि इस समस्या का कोई तकनीकी समाधान है। आप केवल शामिल ए के साथ उत्पाद का एक अप्रयुक्त संस्करण जारी करना चाहते हैं। जब तक आप विलय नहीं करते हैं और सुविधाओं के सभी संभावित संयोजनों का परीक्षण करते हैं, यह हमेशा एक संभावना होने वाली है।

समाधान एक अधिक मानवीय है। आपने अपनी रिलीज़ की तारीख को याद किया है और इसे वापस धक्का देना चाहिए।


1

यह एक कठिन समस्या है लेकिन एक है जो कई लोगों का सामना करती है। मैं एक प्रारंभिक बिंदु के रूप में Gitflow सेटअप का उपयोग करना पसंद करता हूं।

विकास -> नया सामान
मास्टर पर काम किया जा रहा है -> तैयार सामान की आवश्यकता है परीक्षण उत्पादन -> सामान जो उत्पादन के लिए प्रकाशित किया गया है।

छोटी (छोटी) विशेषताओं में, मैं विकास से एक शाखा बनाता हूं, वहां काम करते हैं फिर शाखा को विकास में वापस मिलाते हैं।

प्रमुख (दीर्घकालिक) विशेषताओं में मैं विकास से एक शाखा बनाता हूं, उस शाखा से छोटी शाखाएं बनाता हूं, फिर वापस पहली शाखा में विलय कर देता हूं। एक बार जब प्रमुख विशेषता पूरी हो जाती है तो विकास शाखा में वापस चली जाती है।

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

किसी भी समय मास्टर को विकास में विलय कर दिया जाना चाहिए, और विकास को किसी भी दीर्घकालिक उप शाखाओं में विलय कर दिया जाना चाहिए।

मास्टर हमेशा (सिद्धांत में) उत्पादन के लिए तैयार होना चाहिए। विकास हमेशा (सिद्धांत में) उत्पादन के लिए तैयार होना चाहिए। केवल एक कारण है कि यह परीक्षण करने के लिए परीक्षकों के लिए सुविधाओं का एक ठोस सेट प्रदान करने के लिए एक अंतर है।

तैयार होने पर, परीक्षण में मास्टर की एक प्रतिबद्धता को उत्पादन में मिला दिया जाता है और उत्पादन में तैनाती उस शाखा से होती है। HOTFIXs जिन्हें आपातकाल में करने की आवश्यकता होती है, तब मास्टर में विलय किए बिना उत्पादन शाखा पर जगह ले सकता है (जिसमें कई अन-परीक्षणित परिवर्तन हो सकते हैं)।

मेरा सामान्य पेड़ जैसा दिखता है

 LongTerm -> Development -> Master -> Production    
 LongTerm <- Development      |            |  
     |       Development -> Master         |  
 LongTerm <- Development -> Master         |  
             Development <- Master         |  
                            Master -> Production  

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

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


"प्रमुख (दीर्घकालिक) विशेषताओं में मैं विकास से एक शाखा बनाता हूं" - क्या आपको उत्पादन शाखा से नई सुविधा (विकास) शाखाएं नहीं बनानी चाहिए? उत्पादन शाखा के रूप में देखना रिलीज-तैयार कोड है।
रोबोट्रॉन

नहीं, उत्पादन पहले से ही जारी है, मास्टर उत्पादन से आगे है और विकास मास्टर से आगे है। योग को टैक्स जोड़ने के लिए एक नई सुविधा जैसे कि यदि आपके पास पहले से ही आदेश हैं तो कोड पर काम नहीं करने पर व्यर्थ का टैक्स लगाएं।
coteyr

लेकिन अगर आप देव से शाखा करते हैं और बाद में वापस विलय करते हैं तो वह शाखा (और फलस्वरूप बाद में उत्पादन और उत्पादन) बाद में शाखा द्वारा दूसरों तक किए गए सभी देव परिवर्तनों को शामिल नहीं करेगा? उन परिवर्तनों में से कुछ में QA अनुमोदन नहीं हो सकता है। शायद प्रबंधन जारी करने के लिए अलग-अलग तरीकों के बारे में बात कर रहे थे।
रोबोट्रॉन

हाँ, यह बात होगी। मास्टर में एक विशिष्ट SHA पर QA परीक्षण, लेकिन आप उसके लिए तैयार नहीं हो सकते।
coteyr

"क्यूए मास्टर में एक विशिष्ट एसएचए पर परीक्षण करता है" -> क्यूए एक स्टैंडअलोन के रूप में प्रत्येक नई सुविधा का परीक्षण करता है? चलिए मैं आपको एक विशिष्ट परिदृश्य पर चलता हूं जो मेरी टीम का चेहरा है: कहते हैं कि आपके पास एक ही कोडबेस पर 2 लंबी चलने वाली परियोजनाएं हैं: प्रोजेक्ट ए पिछले महीने के लिए क्यूए में है और एक और महीने के लिए क्यूएआईडी होगा। प्रोजेक्ट बी पिछले 6 महीनों से विकास में था और अब क्यूए के लिए तैयार है। प्रोजेक्ट ए को मास्टर में विलय कर दिया गया है और निश्चित रूप से कई सूक्ष्म व्यापार नियम त्रुटियों के कारण तैयार नहीं है। हम प्रोजेक्ट B को कैसे संभालते हैं? A और B को परस्पर क्रिया की जाँच करने के लिए एक साथ परीक्षण करना होगा (B विलय के दौरान टकराव का कारण नहीं बनेगा)।
रोबोट्रॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.