हम प्रत्येक वातावरण में हमारे कोड के किस संस्करण का ट्रैक रख सकते हैं?


14

मेरी टीम वर्तमान में काफी सरल शाखा / तैनाती प्रक्रिया का उपयोग करती है जो इस तरह दिखाई देती है:

                ┌────────┐ ┌────┐ ┌──────┐
 Environments:  │  DEV   │ │ QA │ │ PROD │
                └────────┘ └────┘ └──────┘

                     ▲       ▲       ▲
                     │       │       │

                ┌────────┐ ┌────┐ ┌──────┐
 Builds:        │  DEV   │ │ QA │ │ PROD │
                └────────┘ └────┘ └──────┘

                     ▲       ▲       ▲
                     │       │       │

                ┌────────┐ ┌────┐ ┌──────┐
 Branches:      │ master │ │ qa │ │ prod │
                └────────┘ └────┘ └──────┘

प्रत्येक वातावरण की अपनी शाखा होती है (हम git का उपयोग करते हैं ) और इसका स्वयं का निर्माण उस शाखा का उपयोग करता है। जब हम एक पर्यावरण से दूसरे वातावरण में बढ़ावा देना चाहते हैं, उदाहरण के लिए, DEV से QA तक, हम masterशाखा को qaएक नए QA बिल्ड में विलय कर देते हैं (जो तब QA वातावरण में स्वचालित रूप से तैनात हो जाता है)।

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

                ┌────────┐     ┌────┐     ┌──────┐
 Environments:  │  DEV   │ ──► │ QA │ ──► │ PROD │
                └────────┘     └────┘     └──────┘

                      ▲ 
                       \ 

                        ┌───────────────┐
 Builds:                │ release build │
                        └───────────────┘

                                ▲
                                │

                ┌────────┐ ┌─────────┐
 Branches:      │ master │ │ release │
                └────────┘ └─────────┘

एक वातावरण से दूसरे वातावरण में प्रचार करना अब स्रोत नियंत्रण में संभाला नहीं जाएगा; बल्कि, हम पहले से निर्मित बायनेरिज़ ("परिनियोजन पैकेज") ले लेंगे और नए वातावरण पर छोड़ देंगे।

यह नई प्रणाली हमें किसी भी वातावरण में किसी भी निर्माण को तैनात करने की अनुमति देगी, जिसके कई फायदे हैं। उदाहरण के लिए, यह DEV और QA में PROD बग फिक्स का परीक्षण करने के लिए तुच्छ है। हमारी वर्तमान प्रणाली एक शाखा को वापस लाए बिना ऐसा करने का एक आसान तरीका प्रदान नहीं करती है, जिसे हम स्पष्ट रूप से बचना चाहेंगे।

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

हम प्रत्येक वातावरण में किस कोड का ट्रैक रख सकते हैं?

कुछ विकल्प जिन पर हम विचार कर रहे हैं:

  • किस वातावरण में कौन सा कमिटमेंट है, इसका ट्रैक रखने के लिए git टैग का उपयोग करना
  • प्रत्येक परिनियोजन पैकेज में बिल्ड द्वारा उपयोग किए गए गिट कमिट को एम्बेड करना

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

@MichaelT हम अपने निर्माण के लिए MSBuild का उपयोग करते हैं और ऑक्टोपस हमारी तैनाती के लिए तैनात करते हैं। मुझे पूरा विश्वास है कि हम ऑक्टोपस को एक कस्टम पॉवर्सशेल परिनियोजन स्क्रिप्ट के साथ हमारे गिट रिपॉजिटरी में हेरफेर कर सकते हैं।
नाथन फ्रेंड

जवाबों:


14

Git टैग वही हैं जो आप वास्तव में रिलीज़ को निर्दिष्ट करने के लिए उपयोग करना चाहते हैं। कारण यह है कि वे आपके लिए अर्थ रखते हैं और राज्य द्वारा तैनात कोड और बिल्ड सर्वर के किसी भी जानकारी (जैसे बिल्ड नंबर) के बीच संबंध को जल्दी से पहचानने के लिए इस्तेमाल किया जा सकता है।

जबकि यह वह उत्तर है जिसकी आप तलाश कर रहे हैं, यह केवल आधी समस्या को हल करता है। दूसरा "हे, यहाँ .[wje]arसर्वर पर तैनात है, यह किस निर्माण से आया है?" हम जानते हैं कि आपके पास देव और qa या उत्पादों पर तैनात एप्लिकेशन के विभिन्न संस्करण कभी नहीं होंगे। सही?

प्रश्न के उस हिस्से का समाधान बिल्ड सर्वर को जानकारी को प्रकट करने के लिए है। मावेन और svn उदाहरण से आ रहा है कि मेरे सामने है:

<manifestEntries>
    <Specification-Title>${project.name}</Specification-Title>
    <Specification-Version>${project.version}</Specification-Version>
    <Build-Number>${build.number}</Build-Number>
    <Build-Id>${build.id}</Build-Id>
    <Svn-Revison>${svn.revision}</Svn-Revison>
</manifestEntries>

यह मावेन-युद्ध-प्लगइन संग्रह कॉन्फ़िगरेशन में है। लेकिन आप इसे अन्य प्लगइन्स में भी पा सकते हैं। हडसन में तब मावेन बिल्ड इनवोकेशन का हिस्सा है:

-Dbuild.number=${BUILD_NUMBER}
-Dsvn.revision=${SVN_REVISION}
-Dbuild.id=${BUILD_ID}

जो उन परिभाषित करता है कि तब मावेन उठाता है। और फिर इसकी सिर्फ MANIFEST.MF फ़ाइल में देखने की बात है जिसे सर्वर पर तैनात किया गया है यह देखने के लिए कि यह क्या संस्करण है।

एक git प्लगइन है , जिसमें पर्यावरण चर का एक समान सेट शामिल है:

  • GIT_COMMIT - करंट की SHA
  • GIT_BRANCH - रिमोट रिपॉजिटरी का नाम (उत्पत्ति के लिए चूक), इसके बाद वर्तमान में उपयोग की जाने वाली शाखा का नाम, जैसे "मूल / मास्टर" या "मूल / फू"

इन दो प्रथाओं का संयोजन आपको आसानी से बिल्ड की पहचान करने की अनुमति देता है (क्योंकि बिल्ड नंबर आगे बढ़ते हैं, और शा चेकसम के विपरीत अर्थ होते हैं) और विशिष्ट गिट प्रतिबद्ध है कि यह से बनाया गया है।


3

एक पूरी तरह से अलग दृष्टिकोण पूरी तरह से विचार को खारिज करना होगा versions। आपके पास केवल "एक संस्करण" है जिसमें एक अलग विन्यास योग्य व्यवहार है। फर्क सिर्फ इतना होगा, कि आपके पास एक सामान्य कोडबेस है - यहां तक ​​कि उत्पादन में भी आप प्रगति पर काम करेंगे : लेकिन सक्रिय नहीं।

अंतर केवल आपके उत्पाद में सक्षम की जा रही सुविधाओं के विभिन्न सेटों को उबालता है।

डे- / सक्रियण सुविधा टॉगल के माध्यम से किया जाता है ।

अपसाइड: पूरी रिलीज प्रक्रिया सरल है: आप हमेशा अपने सॉफ़्टवेयर का एक एकीकृत संस्करण वितरित कर रहे हैं। हर सुविधा हमेशा उपलब्ध रहती है master। कोई अतिरिक्त शाखाओं की जरूरत नहीं है।

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

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

शायद यह आपके लिए काम करे।


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

1
प्रश्न को अलग से पूछा जाना चाहिए: बग एक विशेष कॉन्फ़िगरेशन वाला "अब" है, यदि हां, तो आप इसे ठीक कर सकते हैं। अगर नहीं - बग मायने रखता है? आप हमेशा काम (और एकीकृत कोड) को आगे बढ़ाते हैं।
थॉमस जंक

-1

हम संस्करण को मैनिफ़ेस्ट फ़ाइल में डालने के लिए मावेन का उपयोग करते हैं। तब एप्लिकेशन को संस्करण दिखाई देता है यदि इसका वेब ऐप है, या वेब सेवाओं के लिए / संस्करण समापन बिंदु है।

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