पुन: प्रयोज्य बिट्स में हमारे कोड को तोड़ने के बाद, हम परीक्षण और तैनाती कैसे करते हैं?


9

हमने एक डेवलपर के साथ शुरुआत की, और एक svn रेपो जिसमें हमारे सभी कोड हैं:

^/foo/trunk/module-a
^/foo/trunk/module-b
^/foo/trunk/module-b/submodule-b1
^/foo/trunk/website1

(उस समय यह एक बड़ा सुधार था)। इसके बाद थोड़ा बढ़ने का मौका मिला, हमें परिपत्र निर्भरता, धीमी गति से परीक्षण, और सामान्य कठिनाइयों के साथ समस्या फिर से शुरू हो गई कोड का उपयोग करना (जैसे कि वेबसाइट 1 की सुविधा सेट अन्यथा सामान्य मॉड्यूल-में crept था)।

कोड आधार को संशोधित करना चाहते हैं, और हमसे अपेक्षा करते हैं कि हम शीघ्र ही git में चले जाएँगे (और कहीं पढ़ा होगा कि git svn Mega-repos को पसंद नहीं करता है), हमने बहुत अधिक दानेदार संरचना में परिवर्तन किया है:

^/module-a/trunk/
^/module-b/trunk/
^/module-b/trunk/sumbmodule-b1
^/earlier-sub-sub-sub-module-c/trunk
etc. (about 120 such modules)

यह वैचारिक रूप से बहुत अच्छा था। अधिक मॉड्यूलर कोड, बहुत तेजी से परीक्षण-सूट, दस्तावेज़ के लिए आसान, आदि। हमने अपने कुछ अधिक सामान्य घटकों को खोल दिया, और सभी मॉड्यूल pip install -e .को स्थापित करने योग्य बनाया ( developmentवर्चुअन में उन्हें स्थापित करने के लिए )।

हमने एक ^/srv/trunkरिपॉजिटरी बनाई जिसमें रनटाइम एनवायरनमेंट के फोल्डर स्ट्रक्चर, यानी। ^/srv/trunk/libमॉड्यूल के /srv/trunk/srcलिए ^/foo/trunk, ^/srv/trunk/wwwवेबसाइटों आदि के अवशेषों के लिए।

और अंत में (पेरफोर्स से एक विचार लेना, जिसे मैंने बहुत समय पहले काम किया था [ https://www.perforce.com/perforce/r12.1/manuals/cmdref/client.html] ) हमने एक "vcs- बनाया "टेक्स्ट फ़ाइल" प्राप्त करें जो सभी संबंधित रिपॉजिट्स को सूचीबद्ध करती है और जहां उन्हें देव वातावरण में जांचा जाना चाहिए, और ऐसा करने के लिए संबंधित कमांड। उदाहरण के लिए vcs-fetc लाइन:

svn srv/lib/module-a ^/module-a/trunk

या तो कारण होगा (पहली बार)

cd /srv/lib && svn co ^/module-a/trunk module-a

या (बाद में)

cd /srv/lib/module-a && svn up

और इसी तरह जीथब रिपोज (हमारे अपने और परिवर्तित / अनलॉग्ड वेंडर पैकेज) दोनों के लिए।

हमने उत्पादन वातावरण बनाने के लिए उसी vcs-fetch प्रक्रिया का उपयोग किया है, लेकिन हम जल्दी से पता लगा रहे हैं कि हमारे पास यह जानने का कोई तरीका नहीं है कि vcs-fetch करने के बाद किस संस्करण का उपयोग उत्पादों में किया जाता है।

मेगा-रेपो के साथ, हम ट्रंक से ठेस को अद्यतन करने से पहले केवल संशोधन संख्या को नोट कर सकते थे, और वापस जाना एक सरल svn -r nnn up .दूर था। Svn और git (और hg में एक मॉड्यूल) - और ~ 120 रेपो दोनों में कोड के साथ, यह स्पष्ट नहीं है कि यह कैसे करना है?

मैंने http://12factor.net/ को आज पढ़ा , और पहला कारक "वन कोडबेस" है, इसलिए मैं सोच रहा हूँ कि क्या मैं यहाँ सही रास्ते से हट रहा हूँ?

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

इस बिंदु पर मैं सोच रहा हूँ कि क्या मैं गलत दिशा में चल रहा हूँ, या अगर मैं अभी सही रास्ते पर नहीं चल पाया हूँ ..? (मैं जो कुछ भी पढ़ रहा हूं वह "आपके ऐप" के बारे में बात कर रहा है, और मुझे नहीं पता कि यह 14 वेबसाइटों को एक ही कोड आधार से चलाने का अनुवाद कैसे करता है ...)


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

यदि आप कृपया KLOC (कोड की 1000 लाइनें) और कोड के बाइट उपायों के अनुमानों को शामिल करते हैं, तो हम आसानी से "2000 कोड की कोड लाइनों। 50 किलोबाइट्स स्रोत कोड।" या "40 KLOC, 2 GB XML"। । ऐसा लगता है कि आपको सिर्फ git करने के लिए माइग्रेट करने की आवश्यकता है और git में आयात कार्य हैं। आप गिट बुक पढ़कर शुरुआत कर सकते हैं ।
निकल्स

1
@ Programmer400 कोडबेस है: .py 670 kloc, .js: 135kloc, .less: 25kloc, .html: 130kloc। इतना बड़ा, लेकिन विशाल नहीं। मैंने जो पढ़ा है, वह वास्तव में इस आकार के रेपो को पसंद नहीं करता है, इसलिए मुझे लगता है कि हमें स्विच करने से पहले छोटे रिपोज में विभाजित होना पड़ेगा ..?
thebjorn

जवाबों:


2

ऐसा लगता है कि आप शाखाएँ याद कर रहे हैं (या 'टैग' या 'रिलीज़' शाखाएँ)।

अपने एसवीएन रिवर्नम का उपयोग करने के बजाय एक संदर्भ के रूप में निर्धारित करें कि आप किस संस्करण को स्थापित कर रहे हैं, आपको उस जारी किए गए संशोधन पर एक शाखा बनाना चाहिए। आप तब उस शाखा का नाम तैनात करते हैं।

यह शाखा को आसान बनाता है, भले ही कोई परिवर्तन न हो इसलिए प्रत्येक मॉड्यूल एक ही रिलीज़ नंबर रखता है, हालांकि आपके ओएसएस पैकेज बिना किसी परिवर्तन के शाखा नहीं हो सकते हैं, इसलिए अगली सबसे अच्छी बात निर्भरता की एक स्क्रिप्ट रखना है - इसलिए संस्करण 5 आपके उत्पाद के लिए OSS मॉड्यूल X v2 और इतने पर की आवश्यकता है।

आप संस्करणों को संदर्भित करना बंद करने के लिए अपनी स्क्रिप्ट को बदलेंगे और इसके बजाय शाखा नामों के साथ काम करेंगे (हालांकि वे कुछ भी हो सकते हैं, एक निश्चित नामकरण सम्मेलन पर निर्णय लेने के लिए सबसे अच्छा है, जैसे रिलीज़_1_1_3)

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


1

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

मैं उन सभी को विभाजित करने के लिए हूँ, कुछ स्तर पर, विशेष रूप से यदि आपके पास कई टीम और अलग-अलग रिलीज़ साइकल हैं, जैसा कि @ Ext3h उल्लेख है।

चूंकि मुझे यकीन नहीं है कि आपके मॉड्यूल कितने अलग-थलग हैं, या आप अपने संस्करण को कितना विस्तृत करना चाहते हैं, मैं कुछ विकल्प सुझाऊंगा।


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

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

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

हालाँकि, मैंने इस पैटर्न का बड़े पैमाने पर उपयोग नहीं किया है, इसलिए मुझे नहीं पता कि यह आपके जैसे बड़े प्रोजेक्ट के लिए कितनी बड़ी समस्या हो सकती है।


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

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

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

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