2013-01-21 6 views
13

के साथ परमाणु वेबसाइट अपडेट मैं एक परमाणु तरीके से एक लाइव वेबसाइट अपडेट करना चाहता हूं। यदि हमने पृष्ठों, छवियों और जावास्क्रिप्ट में कई बदलाव किए हैं, तो सभी परिवर्तन एक साथ डाउनटाइम, असंगतता, या 404 के साथ दिखाई देना चाहिए।गिट

यदि मैं बस बदली गई फ़ाइलों को वेबसाइट निर्देशिका में कॉपी करता हूं, तो कम से कम कुछ अनुरोध एक असंगत साइट देखेंगे। यदि मैं नई साइट को एक अलग निर्देशिका में कॉपी करता हूं, तो उसे पुरानी निर्देशिका का नाम बदलने के लिए नाम बदलें और इसे लाइव करने के लिए नई निर्देशिका का नाम बदलें, फिर एक संक्षिप्त पल के लिए हमें 404 मिलेंगे।

मैं कैसे एक परमाणु रास्ते में फ़ाइलों की एक निर्देशिका अद्यतन कर सकते हैं:

मैं वास्तव में दो प्रश्न हैं?

मैं इसे गिट के साथ कैसे समन्वयित कर सकता हूं? हम एक गिट पुल (या संभवतः धक्का) का उपयोग करके तैनाती करना चाहते हैं। गिट रेपो के भीतर साइट का पथ सर्वर पर पथ से अलग है, इसलिए कुछ चलने/नाम बदलने की आवश्यकता है, या तो गिट कमांड या ओएस कमांड का उपयोग करना।

उत्तर

21

आप सिम्लिंक का उपयोग करके कल्पना कर रहे हैं जो आप कर सकते हैं। एक सिमलिंक को दूसरे पर ले जाना एक परमाणु ऑपरेशन है, इसलिए आप किसी भी 404 त्रुटियों से बचने में सक्षम होना चाहिए।

आपका हुक deploy your site to a directory होगा, शायद commit hash के नाम पर रखा गया है। फिर यह उस पर एक सिमलिंक बना देगा, शायद स्टेजिंग कहा जाता है। फिर यह उस सिम्लिंक को उत्पादन सिम्लिंक पर ले जायेगा।

hash=`git rev-parse HEAD` 
git checkout-index -a -f --prefix=/srv/www/$hash/ 
ln -s /srv/www/$hash /srv/www/staging 
mv -T /srv/www/staging /srv/www/production 
+0

Capistrano एक ऐसा उपकरण है जो आपके कोड को परमाणु रूप से तैनात करने के लिए सिम्लिंक का उपयोग करता है। – user1158559

+1

यह एक अच्छा जवाब है। हालांकि, असंगत परिणाम होने का एक छोटा सा मौका है क्योंकि ब्राउज़र एक पृष्ठ का अनुरोध कर सकता है, साइट बदल सकती है, और फिर पृष्ठ एक छवि या सीएसएस फ़ाइल का अनुरोध कर सकता है जो अब वहां नहीं था। लेकिन सर्वर पक्ष पर इसके बारे में आप कुछ भी नहीं कर सकते हैं। – ccleve

+0

@ccleve यदि आप वास्तव में फैंसी प्राप्त करना चाहते हैं, तो आप प्रत्येक रखरखाव सत्र को एक ही रिलीज में लॉक करने या कुकीज़ के साथ खेलने के लिए प्रयास कर सकते हैं। – Zenexer

0

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

लेकिन मेरी विधि वर्कअराउंड की तरह लगता है।

2

ओवेन की तरह, आप तैनात अंतिम रिलीज के लिए एक सिम्लिंक का उपयोग कर सकते हैं। मैंने हाल ही में इस बारे में एक ब्लॉग पोस्ट लिखा है: http://bugfixer.endel.me/2013/08/04/simple-atomic-deployment-with-git

आप अपने रिमोट गिट सर्वर पर पोस्ट-प्राप्त हुक कॉन्फ़िगर कर सकते हैं जो नई रिलीज तैयार होने पर सिम्लिंक बनाता है।