2009-04-28 14 views
23

मैंने वाक्यांश को "तैनाती अनुप्रयोग" सुना है जो व्यक्तिगत रूप से परिवर्तित फ़ाइलों को सर्वर पर अपलोड करने से कहीं अधिक बेहतर/आसान/अधिक विश्वसनीय लगता है, लेकिन मुझे नहीं पता कि कहां से शुरू करना है।एक उपवर्तन भंडार से PHP अनुप्रयोगों को तैनात करना प्रारंभ कैसे करें?

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

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

+0

मुझे यह एक दिलचस्प सवाल है। मैं स्वचालित अद्यतनों को कभी भी लागू नहीं करूंगा लेकिन मैं जो चाहता हूं वह एक चेक आउट लाइव कॉपी की तरह है जो मैं स्विच कर सकता हूं और सब ... तो एक काम करने की प्रतिलिपि बनाने के बजाय और फिर वहां से लाइव सर्वर पर अपलोड करना सर्वर पर लाइव 'काम करने' की प्रतिलिपि बनाने के लिए। शायद यह होना चाहिए कि यह कैसे होना चाहिए लेकिन मैंने कभी कोशिश नहीं की है। – markus

+0

मुझे लगता है कि स्टैक ओवरफ्लो सुन रहा है, वही –

+1

एक हालिया पॉडकास्ट मैंने सुना है (आईटीसी से) इस मुद्दे पर ब्लॉग प्रविष्टि को http://timothyfitz.wordpress.com/2009/02/10/continuous-deployment पर भी संदर्भित किया गया है -मैट-इमू-कर-असंभव-पचास बार-एक-दिन/मैं सिर्फ कुछ हफ्ते एक मिनट को पसंद करता हूं, लेकिन फिर, वास्तव में मैं बस विकास कर रहा हूं। –

उत्तर

21

स्वचालित तैनाती + एक स्टेजिंग सर्वर पर परीक्षण चलाने के निरंतर एकीकरण के रूप में जाना जाता है। विचार यह है कि यदि आप परीक्षण में तोड़ने वाले किसी चीज की जांच करते हैं, तो आपको तुरंत अधिसूचित किया जाएगा। पीएचपी के लिए, आप Xinc या phpUnderControl

में देखना आप आम तौर पर नहीं स्वचालित रूप से हालांकि उत्पादन को तैनात करना चाहते हैं चाहते हो सकता है। सामान्य बात यह है कि कार्य को स्वचालित करने वाली कुछ स्क्रिप्ट लिखना है, लेकिन आपको अभी भी मैन्युअल रूप से प्रारंभ करने की आवश्यकता है। आप Phing या इसके लिए अन्य बिल्ड-टूल्स जैसे ढांचे का उपयोग कर सकते हैं (एक लोकप्रिय पसंद Capistrano है), लेकिन आप एक साथ कुछ शैल-स्क्रिप्ट को भी घुमा सकते हैं। व्यक्तिगत रूप से मैं बाद वाले को पसंद करता हूं।

स्क्रिप्ट खुद को, अलग अलग बातें कर सकता है आपके आवेदन और सेटअप के आधार पर है, लेकिन एक विशिष्ट प्रक्रिया होगी:

  • उत्पादन सर्वर पर ssh। शेष आदेश एसएसएच के माध्यम से उत्पादन सर्वर पर चलाए जाते हैं।
  • रन svn export svn://path/to/repository/tags/RELEASE_VERSION /usr/local/application/releases/TIMESTAMP
  • रोक सेवाएं (अपाचे, डेमॉन)
  • रन unlink /usr/local/application/current && ln -s /usr/local/application/releases/TIMESTAMP /usr/local/application/current
  • रन ln -s /usr/local/application/var /usr/local/application/releases/TIMESTAMP/var
  • रन /usr/local/application/current/scripts/migrate.php
  • शुरू सेवाओं

(मान लें कि आप /usr/local/application/current में अपने आवेदन किया है)

0

यह आपके आवेदन पर निर्भर करता है और परीक्षण कितने ठोस हैं।

जहां मैं काम करता हूं, सब कुछ समीक्षा के लिए भंडार में चेक किया जाता है और फिर जारी किया जाता है।

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

आप क्या बात कर रहे हैं ऐसा करने के लिए क्षेत्र में प्राथमिक जांच में डेवलपर्स के बीच सहयोग की अनुमति देने के लिए किसी प्रकार की माध्यमिक जांच में और बाहर की आवश्यकता होगी। हालांकि मुझे इसके बारे में कुछ भी पता नहीं है या यदि यह भी संभव है।

ब्रांचिंग और अन्य सुविधाओं के साथ भी समस्याएं हैं जिन्हें संभालने की आवश्यकता होगी।

+0

ठीक है, आपके पास एक रिलीज टैग हो सकता है, और एक पोस्ट-प्रतिबद्ध हुक जो केवल उन संशोधनों को तैनात करता है जिन्हें स्थिर के रूप में टैग किया गया है। अर्थात। अपनी पसंद के अनुसार प्रतिबद्ध, शाखा, और टैग करें, लेकिन केवल स्थिर कीवर्ड का सामना करने पर ही तैनात करें। –

7

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

किसी भी तरह, यदि आप वास्तव में चाहते थे तो स्वचालित तैनाती प्राप्त करना मुश्किल नहीं होगा। आप एक के बाद चेक-इन हुक आवश्यकता होगी, और वास्तव में चरणों का होगा:

1) नवीनतम से एक निर्यात 2 चेक-इन करते हैं) उत्पादन सर्वर 3) अनपैक/नव config के लिए निर्यात अपलोड अपलोड किया गया निर्यात

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

यदि आप स्वचालित रूप से लाइव होने से पहले त्रुटियों को पकड़ने की आपकी क्षमता में भरोसा रखते हैं, तो आप उस प्रक्रिया को स्वचालित करने के लिए देख सकते हैं। यह मुझे जिबली-जिबब्ली देता है हालांकि।

+2

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

5

वेब प्रोजेक्ट्स को तैनात करने के लिए सबवर्जन का उपयोग करने पर एक उत्कृष्ट लेख है - यह आपके कई प्रश्नों का उत्तर देता है।

http://athleticsnyc.com/blog/entry/on-using-subversion-for-web-projects

+0

यह एक अच्छा लेख है! – Andrew

+0

वह लेख ज्यादातर सबवर्सन और संस्करण नियंत्रण के लाभों के बारे में है, और मुश्किल से तैनाती विधियों को छूता है। यद्यपि यह निश्चित रूप से पढ़ने के लायक है। वर्तमान में –

+1

लिंक टूटा हुआ है। ;-(उनके पर एक नया संस्करण नहीं मिला - जाहिर है - [पुन: डिजाइन ब्लॉग] (http://blog.athleticsnyc.com/)। लिंक मिला? –

1

बात इस तरह की है कि तुम क्या "सतत एकीकरण" कहेंगे है। एटलसियन बांस (लागत), सन हडसन (फ्री) और क्रूज़ कंट्रोल (फ्री) सभी लोकप्रिय विकल्प हैं (मेरी वरीयता के क्रम में) और PHPUnit आउटपुट को संभालने के लिए समर्थन है (क्योंकि PHPUnit समर्थन JUnit आउटपुट)।

तैनाती सामान पोस्ट बिल्ड ट्रिगर के साथ किया जा सकता है। इस धागे पर कुछ अन्य लोगों की तरह, मैं चेकइन (और परीक्षण उत्तीर्ण) पर स्वचालित तैनाती करने से पहले बहुत सावधानी बरतता हूं।

1

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

Alias /uploads /home/user/uploads/ 

यदि आपके पास सर्वर का अधिक नियंत्रण नहीं है तो आपके लिए कम विकल्प हैं।

मुझे एक स्क्रिप्ट मिली है जिसे मैं किसी दिए गए स्क्रिप्ट को dev/live sites (वे दोनों एक ही सर्वर पर चलाते हैं) पर तैनात करने के लिए उपयोग करते हैं।

#!/bin/sh 

REV=2410 
REVDIR=$REV.20090602-1027 

REPOSITORY=svn+ssh://[email protected]/var/svn/website.com/trunk 
IMAGES=$REVDIR/php/i 
STATIC1=$REVDIR/anothersite.co.uk 

svn export --revision $REV $REPOSITORY $REVDIR 

mkdir -p $REVDIR/tmp/templates_c 
chown -R username: $REVDIR 
chmod -R 777  $REVDIR/tmp $REVDIR/php/cache/ 
chown -R nobody: $REVDIR/tmp $REVDIR/php/cache/ $IMAGES 
dos2unix $REVDIR/bin/*sh $REVDIR/bin/*php 
chmod 755 $REVDIR/bin/*sh $REVDIR/bin/*php 

# chmod -x all the non-directories in images 
find $IMAGES -type f -perm -a+x | xargs -r chmod --quiet -x 
find $STATIC1 -type f -perm -a+x | xargs -r chmod --quiet -x 

ls -l $IMAGES/* | grep -- "-x" 

rm dev && ln -s $REVDIR dev 

मैंने संशोधित संख्या, और दिनांक/समय चेक-आउट निर्देशिका नाम के लिए उपयोग किया है। मध्य में chmod भी छवियों पर अनुमतियों को ठीक कर देता है ठीक है क्योंकि वे हमारे समर्पित छवि सर्वर से भी जुड़े हुए हैं।

आखिरी चीज जो होती है वह पुरानी सिम्लिंक है .../वेबसाइट/dev/नई चेक आउट निर्देशिका से जुड़ जाती है। अपाचे कॉन्फ़िगरेशन के बाद इसमें एक दस्तावेज़-रूट है .../वेबसाइट/dev/htdocs/

एक मिलान भी है .../वेबसाइट/लाइव/htdocs/docroot, और फिर, 'लाइव' एक और सिम्लिंक है। यह मेरी दूसरी स्क्रिप्ट है जो लाइव सिम्लिंक को हटा देगी, और जो भी देव बिंदुओं के साथ इसे प्रतिस्थापित करेगी।

#!/bin/sh 
# remove live, and copy the dir pointed to by dev, to be the live symlink 
rm live && cp -d dev live 

मैं केवल हर कुछ dats साइट का एक नया संस्करण धक्का कर रहा हूँ, तो आप एक दिन (मेरी एपीसी कैश के कुछ संस्करणों की तुलना में अधिक नहीं करना चाहते हैं यह कई बार उपयोग किया जा करने के लिए नहीं चाहते हो सकता है साइट के आसपास), लेकिन मेरे लिए, मुझे यह लगता है कि यह मेरी खुद की तैनाती के लिए बहुत अधिक समस्या मुक्त है।

1

जांच fredistrano, यह एक Capistrano क्लोन महान काम करता है (से थोड़ा सा भ्रामक स्थापना लेकिन सभी चलाता है के बाद महान)

http://code.google.com/p/fredistrano/

4

मेरी webdev कंपनी हम हाल ही में Webistrano है, जो करने के लिए एक वेब जीयूआई है का उपयोग शुरू किया लोकप्रिय Capistrano उपकरण।

हम एक केंद्रीकृत इंटरफ़ेस के साथ उपयोग करने में आसान, तेजी से तैनाती उपकरण, उत्तरदायित्व (जो संस्करण को तैनात करते हैं), पिछले संस्करणों के लिए रोलबैक और अधिमानतः मुफ़्त में चाहते थे। Capistrano रेल अनुप्रयोगों पर रूबी के लिए एक परिनियोजन उपकरण के रूप में जाना जाता है, लेकिन मुख्य रूप से रेल अनुप्रयोगों के लिए केंद्रीकृत और लक्षित नहीं है। वेबिस्ट्रानो इसे जीयूआई, जवाबदेही के साथ बढ़ाता है, और PHP परिनियोजन के लिए बुनियादी समर्थन जोड़ता है ('शुद्ध फ़ाइल' प्रोजेक्ट प्रकार का उपयोग करें)।

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

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

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

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

1

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

एक स्वचालित तैनाती प्रक्रिया की मूल बातें इस प्रकार है:

  1. आपका कोड उत्पादन के लिए तैयार है, तो यह रिलीज के संस्करण से टैग किया गया है: v1.0.0
  2. मान लिया जाये कि आप पहले से ही है अपनी तैनाती स्क्रिप्ट को कॉन्फ़िगर किया गया है, आप अपनी स्क्रिप्ट चलाते हैं, जो आपने अभी बनाया टैग निर्दिष्ट करते हैं।
  3. स्क्रिप्ट SSH के अपने उत्पादन सर्वर जो निम्न निर्देशिका संरचना है के लिए खत्म हो:

    /your-application 
        /shared/ 
         /logs 
         /uploads 
        /releases/ 
         /20120917120000 
         /20120918120000 <-- latest release of your app 
          /app 
          /config 
          /public 
          ...etc 
        /current --> symlink to latest release 
    
    Your Apache document root should be set to /your-application/current/public 
    
  4. स्क्रिप्ट वर्तमान दिनांक के साथ रिलीज निर्देशिका में एक नया निर्देशिका बनाता है। उस निर्देशिका के अंदर, आपका कोड आपके द्वारा निर्दिष्ट टैग पर अपडेट किया गया है।

  5. फिर मूल सिम्लिंक हटा दिया गया है और नवीनतम रिलीज को इंगित करते हुए एक नया सिम्लिंक बनाया गया है।

रिलीज के बीच रखने की आवश्यकता साझा की गई निर्देशिका में होती है, और उन साझा निर्देशिकाओं में सिम्लिंक बनाए जाते हैं।

+0

मैंने एक PHP ऐप परिनियोजन में सिम्लिंक के लिए एक आपत्ति सुनाई: ऐप तैनाती के दौरान वर्ग फ़ाइलों के एक सेट की आवश्यकता के बीच में हो सकता है। इसके परिणामस्वरूप उपयोगकर्ताओं की एक छोटी संख्या के लिए असंगत परिवर्तनों का उपयोग किया जा रहा है (और PHP प्रत्येक के लिए पहले और बाद के राज्यों के बारे में नहीं जान पाएगा फ़ाइल एक ही पथ पर हैं)। क्या रिलीज पथ पर सीधे इंगित करने के लिए अपाचे vhost कॉन्फ़िगरेशन फ़ाइल की पुन: पीढ़ी को स्क्रिप्ट करना सुरक्षित होगा, और उसके बाद एक शानदार 'रीलोड' करें? – halfer

संबंधित मुद्दे