हमारी तैनाती की रणनीति में सुधार करें


12

हमारे पास एक ईकॉमर्स ऐप है जिसे हम अपनी कंपनी में विकसित करते हैं। इसका एक यथोचित मानक LAMP अनुप्रयोग है जिसे हम लगभग 3 वर्षों से विकसित और बंद कर रहे हैं। हम एक परीक्षण डोमेन पर एप्लिकेशन विकसित करते हैं, यहां हम नई सुविधाओं को जोड़ते हैं और बग आदि को ठीक करते हैं। हमारी बग ट्रैकिंग और सुविधा विकास सभी एक होस्ट किए गए तोड़फोड़ समाधान (unfuddle.com) के भीतर प्रबंधित किए जाते हैं। जैसा कि बग्स में बताया गया है कि हम इन सुधारों को परीक्षण डोमेन पर बनाते हैं और फिर svn में परिवर्तन करते हैं जब हम खुश होते हैं कि बग को ठीक कर दिया गया है। हम नई सुविधाओं को जोड़ने के साथ इसी प्रक्रिया का पालन करते हैं।

यह हमारे सर्वर पर हमारे सिस्टम और एप्लिकेशन की सामान्य वास्तुकला को इंगित करने के लायक है। जब भी कोई नई सुविधा विकसित की जाती है तो हम अपने एप्लिकेशन (हमेशा एक सर्वर जिसे हम नियंत्रित करते हैं) का उपयोग करके इस अपडेट को सभी साइटों पर रोल आउट कर देते हैं। हमारे सिस्टम का उपयोग करने वाली प्रत्येक साइट अनिवार्य रूप से 95% कोडबेस के लिए समान फ़ाइलों का उपयोग करती है। हमारे पास प्रत्येक साइट के भीतर कुछ फ़ोल्डर्स होते हैं जिनमें उस साइट पर bespoke फाइलें होती हैं - css फाइलें / चित्र आदि। इसके अलावा प्रत्येक साइट के बीच के अंतर को प्रत्येक साइट डेटाबेस के भीतर विभिन्न कॉन्फ़िगरेशन सेटिंग्स द्वारा परिभाषित किया जाता है।

यह वास्तविक परिनियोजन पर ही मिलता है। जब हम किसी प्रकार का अपडेट रोल करने के लिए तैयार होते हैं, तब हम सर्वर पर एक कमांड चलाते हैं जो परीक्षण स्थल पर होती है। यह एक कॉपी कमांड (cp -fru / testite / / othersite /) करता है और संशोधित तिथि के आधार पर फाइलों को अपडेट करने वाले प्रत्येक vhost बल से गुजरता है। प्रत्येक अतिरिक्त सर्वर जिसे हम होस्ट करते हैं, में एक vhost है जिसे हम उत्पादन कोडबेस पर rsync करते हैं और हम उस सर्वर पर सभी साइटों पर प्रतिलिपि प्रक्रिया को दोहराते हैं। इस प्रक्रिया के दौरान हम उन फ़ाइलों को बाहर निकाल देते हैं जिन्हें हम अधिलेखित नहीं करना चाहते हैं, जब प्रतिलिपि पूरी हो गई है तो उन्हें वापस ले जाना। हमारी रोलआउट स्क्रिप्ट कई अन्य फ़ंक्शन करती है जैसे कि SQL कमांड को लागू करना प्रत्येक डेटाबेस को बदलने के लिए, फ़ील्ड / नई टेबल आदि को जोड़ना।

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

हमारे वर्तमान तरीकों को अनदेखा करना वास्तव में यह सुनना अच्छा होगा कि अन्य लोग उसी समस्या को कैसे देखते हैं।

संक्षेपित करते हुए ...

  • कई सर्वरों पर फाइलें बनाने का सबसे अच्छा तरीका svn के साथ सिंक में रहना है?
  • हमें फ़ाइल प्रतिकृति को कैसे रोकना चाहिए? सहानुभूति / कुछ और?
  • हमें अपने रेपो की संरचना कैसे करनी चाहिए ताकि हम नई सुविधाओं को समर्पित कर सकें और पुराने को ठीक कर सकें?
  • हमें रोलआउट / रोलबैक कैसे ट्रिगर करना चाहिए?

अग्रिम में धन्यवाद

संपादित करें:

मैं हाल ही में उपयोग के बारे में अच्छी बातें की एक बहुत कुछ पढ़ा है Phing और Capistrano कार्यों के इन प्रकार के लिए। क्या कोई उनके बारे में और अधिक जानकारी दे सकता है और इस तरह के कार्य के लिए वे कितने अच्छे होंगे?

जवाबों:


6

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

अब, जब आपको एक बग रिपोर्ट मिलती है, तो आप इस फिक्स को शाखा में भेजते हैं और इसे ट्रंक में पोर्ट करते हैं। जब आप तय किए गए बगों की संख्या से खुश होते हैं, तो आप रखरखाव रिलीज़ को टैग और तैनात कर सकते हैं।

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

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

एकमात्र राउटर मैं इसे लागू करते हुए देख सकता हूं कि आप एक ही सर्वर पर चलने वाले विभिन्न ग्राहकों के लिए कोड आधार की कई प्रतियाँ प्रकट करते हैं। मैं आपके कोड को व्यवस्थित करने का प्रयास करूंगा ताकि सभी ग्राहक एक ही फाइलों को चलाएं और प्रतियों का उपयोग न करें। मुझे नहीं पता कि यह आपके लिए कितना आसान होगा, लेकिन आपके द्वारा सामना की जाने वाली प्रतियों की संख्या को कम करने से आपके सिरदर्द में काफी कमी आएगी।

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


धन्यवाद। हाँ, हम PHP का उपयोग कर रहे हैं। मुझे स्वीकार करना चाहिए कि मैं निरंतर एकीकरण पर नहीं हूं, मैं इकाई परीक्षण के समान ही जानता हूं, लेकिन मुझे यह अधिक नहीं पता है। हम इकाई परीक्षण के लिए उत्सुक हैं, लेकिन हमारे कोडबेस में अभी भी कई विरासत प्रक्रियात्मक कोड हैं जो वास्तव में इकाई परीक्षणों के लिए उधार नहीं देते हैं। कुछ दिलचस्प विचार हालांकि, आपके पास विचारों को सुनने के लिए अच्छा होगा कि प्रतिकृति को रोकने के लिए हमारे कोड को बेहतर तरीके से कैसे व्यवस्थित किया जा सकता है।
अक्टूबर'09 को लूटता है

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

- मैं के साथ PHP और Phing हडसन का उपयोग कर के बारे में आज इस लेख देखा toptopic.wordpress.com/2009/02/26/php-and-hudson
robjmills

1

हमने पपेट (Reductive Labs के प्रमुख उत्पाद) का उपयोग शुरू किया। यह sys-admin नौकरियों को स्वचालित करने के लिए रूबी-आधारित ढांचा है। मैं कुछ हफ़्ते पहले कठपुतली था और यहाँ वीडियो लिंक हैं:

ल्यूक कोंग्स प्रस्तुति - कठपुतली परिचय

इसके अलावा, अगर आप सैन फ्रेंकोस्को में कठपुतली की प्रस्तुति को देखना चाहते हैं, तो यह लिंक है:

अन्य लोगों ने कठपुतली का इस्तेमाल कैसे किया, इस पर प्रस्तुतियाँ दी गईं

का आनंद लें।

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