शाखाओं में बंटने से लगातार एकीकरण होता है?


18

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

मैं hgज्यादातर उपयोग करता हूं , लेकिन मैं तर्क देता हूं कि यह चर्चा किसी भी डीवीसीएस के लिए ठीक है।

हमारा वर्तमान वर्कफ़्लो प्रत्येक डेवलपर क्लोन है जो मास्टर रेपो है। हम अपने स्वयं के स्थानीय रेपो पर कोड लिखते हैं, परीक्षण चलाते हैं, और यदि सभी अच्छी तरह से मास्टर को धक्का देते हैं।

इसलिए हम जेन सर्वर जैसे जेन सर्वर को सेटअप करना चाहते हैं और भविष्य के प्रावधान प्रणाली (शेफ, कठपुतली, ansible, आदि) के साथ हमारे वर्कफ़्लो में सुधार करते हैं।

असली हिस्सा

ठीक है, ऊपर मॉडल प्रस्तुत करता है अच्छा काम करता है लेकिन शाखाएं सीआई को तोड़ सकती हैं। सुविधा शाखा को मूल के साथ सिंक करना चाहिए (लेख के अनुसार, यह developmentशाखा होगा ) CI और मर्जिंग को सुचारू बनाने के लिए, है ना?

बता दें कि एलिस और बॉब दो फीचर्स पर काम कर रहे हैं। लेकिन ऐलिस अगले दिन किया जाता है। बॉब की सुविधा में एक सप्ताह लगता है। जब बॉब किया जाता है, तब तक उनके बदलाव दिनांकित हो जाते हैं (हो सकता है कि ऐलिस ने कुछ वर्गों का नाम बदल दिया / नाम बदल दिया)।

एक समाधान है हर सुबह डेवलपर्स को master/originयह देखने के लिए खींचना चाहिए कि क्या कोई परिवर्तन है। यदि ऐलिस की शुरुआत हुई, तो बॉब को अपने कार्यक्षेत्र में खींचना और विलय करना चाहिए, ताकि उसकी सुविधा शाखा अद्यतित हो।

  1. क्या यह एक अच्छा तरीका है?
  2. क्या मास्टर रेपो (स्थानीय क्लोन नहीं) में ये शाखाएँ मौजूद होनी चाहिए? मतलब हर डेवलपर को GitHub / Bitbucket पर मास्टर रेपो का विशेषाधिकार होना चाहिए ताकि वे एक नई शाखा बना सकें? या यह स्थानीय स्तर पर किया जाता है?
  3. अंत में, लेख द्वारा प्रस्तुत मॉडल सीआई को तोड़ देना चाहिए यदि शाखाएं सिंक के साथ नहीं हैं origin/master। चूंकि हम रात का निर्माण करना चाहते हैं, क्या डेवलपर्स को काम छोड़ने से पहले खींचना और विलय करना चाहिए, और प्रत्येक फीचर शाखा पर सीआई रन भी हैं?

जवाबों:


12

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

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

प्रश्न 1 और 3 के रूप में: यह मुख्य विकास शाखा पर बिल्ड सुनिश्चित करने के लिए डेवलपर की जिम्मेदारी है कि जब वे इसमें अपनी सुविधा-शाखा को मर्ज न करें। वे कैसे करते हैं कि उनकी समस्या है, लेकिन दो संभावित तरीके हैं:

  • मुख्य विकास शाखा में नियमित आधार पर मुख्य विकास शाखा में किए गए परिवर्तन (जैसे दैनिक)
  • जब सुविधा हो जाती है, तो मुख्य विकास शाखा को सुविधा शाखा में मर्ज करें और मुख्य विकास शाखा पर मर्ज परिणाम को धक्का दें।

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


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

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

@WilliamPayne: मेरा मानना ​​है कि इस तरह की "अस्थिर" शाखा को अक्सर "विकसित" कहा जाता है
बार्ट वैन इनगेन शनाउ

5

1 के जवाब में)

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

2)

अधिकतर, शाखाएँ रिपॉजिटरी को क्लोन करके मर्क्यूरियल में बनाई जाती हैं, इसलिए आपको मास्टर डिओ के लिए हर डेवलपर प्रतिबद्ध विशेषाधिकार देने की आवश्यकता नहीं है। आप शायद, हालांकि, डेवलपर्स को निरंतर एकीकरण सर्वर पर क्लोन रिपोज बनाने की क्षमता देना चाहते हैं, क्योंकि यह स्थानीय रूप से परीक्षण चलाने के लिए हमेशा संभव नहीं है। (मेरे पास एक बार एक सीआई सिस्टम था जहां 128 कोर क्लस्टर पर चलने के लिए यूनिट परीक्षणों में 8 घंटे लगते थे) - कहने की जरूरत नहीं है, डेवलपर्स ने स्थानीय स्तर पर परीक्षण नहीं चलाए।

3)

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


1
"अधिकतर, शाखाओं को रिपॉजिटरी द्वारा क्लोन करके मर्क्यूरियल में बनाया जाता है" - यह 2013 में सच हो सकता है, लेकिन इन दिनों, मर्क्यूरियल बुकमार्क कार्यात्मक रूप से सभी लेकिन नाम में गिट शाखाओं के बराबर हैं।
केविन

@ केविन: आप सबसे अधिक सही हैं। मैं फ़रवरी के बाद से जीआईटी (लगभग) विशेष रूप से उपयोग कर रहा हूं - एक महीने के बाद जब मैंने उपरोक्त प्रतिक्रिया लिखी ... तो मैं तब से विशेष रूप से अद्यतित नहीं हूं कि तब से मर्क्यूरियल में क्या बदलाव हुए हैं।
विलियम पायने

1

यहां बताया गया है कि आप यह कैसे कर सकते हैं: सुविधा शाखा।

  1. किसी भी नए कार्य (बगफ़िक्स, फ़ीचर आदि) के लिए एक नई शाखा शुरू करें (जैसे बगफ़िक्स-टिकट -123__thingie_reareaks)
  2. जब आप काम करते हैं, तो लगातार अपनी सुविधा शाखा में डिफ़ॉल्ट (या गिट में मास्टर) को अपडेट और मर्ज करते हैं । यह आपकी शाखा को डिफ़ॉल्ट शाखा में काम किए बिना अद्यतन करने में मदद करता है
  3. जब आपकी सुविधा तैयार हो जाती है और आपकी इकाई परीक्षण पास हो जाता है , तो अपनी शाखा में डिफ़ॉल्ट को एक बार फिर से खींचें और मर्ज करें, अपनी शाखा को बंद करें और इसे विलय के बिना धक्का दें , आपका इंटीग्रेटर नए सिर को नोटिस करेगा और यह एक बंद शाखा है, इसलिए वह / वह इसे एकीकृत करने का ध्यान रखेगा। यदि आपके पास कोई इंटीग्रेटर नहीं है, तो डिफ़ॉल्ट पर स्विच करें और अपनी सुविधा शाखा को डिफ़ॉल्ट में मर्ज करें

यहां महत्वपूर्ण बात यह है कि डिफ़ॉल्ट शाखा में आपके पास 0 संघर्ष होंगे जब आप इसमें अपनी सुविधा शाखा का विलय करते हैं, और आपके सभी परीक्षण पास हो जाते हैं

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


आप ऑर्थोगोनल चीजों को मिलाते और प्रतिस्थापित करते हैं। 0 मर्ज संघर्ष! = 0 दोषपूर्ण इकाई-परीक्षण, सफल मर्ज! = सफल कोड
आलसी बेजर

कुछ स्पष्टीकरण जोड़ा गया, यह उल्लेख करना भूल गए कि यूनिट परीक्षणों को भी पास होना चाहिए :)
dukeofgaming
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.