2016-11-24 6 views
5

पृष्ठभूमि से हटा दिया जा रहा हैफ़ाइलें नष्ट कर दिया या Git संशोधनों के बीच संशोधित स्वचालित रूप से उदाहरणों

मैं एक सेटअप के साथ निम्नलिखित जेनकींस से शुरू हो रहा है -

  • फ़ाइलों Phing द्वारा तैयार किया जाता तैनात किया जाना, Git सर्वर से बात कर रही है और इसमें अलग बिल्ड सर्वर में आवश्यक Git संशोधनों के बीच एक git diff ले, एडब्ल्यूएस कोड तैनाती की भागीदारी के बिना, द्वारा (जहाँ तक मुझे लगता है कि)। फ़िंग बिल्ड जेनकींस द्वारा ट्रिगर किया गया है।
  • मैं केवल फाइलों गतिशील appspec.yml फ़ाइल में जोड़ने के लिए/संशोधित (संशोधन Git अंतर के आधार पर) जोड़ें। मैं एक रास्ता /home/jenkins/deployment/cd_deploy/codebase/ करने के लिए संशोधित केवल फाइलों जोड़े जाने के लिए/तैयार करने और मैं जेनकींस परियोजना के "उन्नत परियोजना विकल्प" के अंतर्गत पथ /home/jenkins/deployment/cd_deploy/ "कस्टम कार्यक्षेत्र का प्रयोग करें" के अंतर्गत विकल्प जो मूल रूप से बिल्ड सर्वर में स्थान जो की जरूरत है है निर्दिष्ट किया है एस 3 बाल्टी पर अपलोड किया गया। ध्यान दें कि मैं उदाहरणों कि दो Git संशोधनों के बीच नष्ट हो जाती हैं से फ़ाइलों को हटाने की आवश्यकता होगी।
  • जेनकिंस फिर एडब्ल्यूएस कोडित नियोजन को एप्लिकेशन नाम, तैनाती कोड कोड के तैनाती समूह के बारे में जानकारी के साथ ट्रिगर करता है।

समस्या

फ़ाइलें जो मैं गतिशील रूप से संशोधित किया जा रहा है/EC2 उदाहरणों में जोड़ा, जैसा कि मैंने उम्मीद है, तथापि, अजीब, फ़ाइलें हैं कि हटाए जाने के लिए appspec.yml फ़ाइल में जोड़ने के लिए हटा भी जा रहे हैं। मैंने सत्यापित किया कि मेरे ऐपस्पेक फ़ाइल के पहले इंस्टॉल हुक में लिखी गई फ़ाइलों को हटाने के लिए मेरे पास कोई तर्क नहीं है। मेरे पास पहले से इंस्टॉल करें Istall.sh फ़ाइल में पहले से ही हैक, और कोई अन्य हुक नहीं है। जैसे ही मैं ऐपपेक फ़ाइल से उस हुक को हटा देता हूं, विलोपन बंद हो जाता है।

version: 0.0 
os: linux 
files: 
{Pair of files dynamically generated} 
    - source: config/deployment_config.json 
    destination: /var/cake_1.2.0.6311-beta/deployment 
permissions: 
    - object: . 
    pattern: "**" 
    owner: sandeepan 
    group: sandeepan 
    mode: 777 
    type: 
     - file 
hooks: 
    BeforeInstall: 
    - location: beforeInstall.sh 

एडब्ल्यूएस Codedeploy किसी भी तरह मेरी Git होस्टिंग से बात कर (मैं gitlab और नहीं भी GitHub उपयोग कर रहा हूँ) और किसी भी तरह फ़ाइलों के बारे में जानकारी प्राप्त करने के हटाए जाने के लिए है - यहाँ मेरी appspec फ़ाइल है।

अद्यतन

मैं बाद में कहा कि यहां तक ​​कि केंद्रीय निर्माण से appspec.yml फ़ाइल से पूरी तरह से हुक खंड को दूर करने, और हटाने इसी .sh फ़ाइलें, यानी beforeInstall.sh, afterInstall.sh आदि के बाद सर्वर (जहां एस 3 बंडल तैयार किया गया है), ताकि मेरा कोई भी तर्क और इसका कोई भी संदर्भ उदाहरणों पर जा रहा न हो, जो फ़ाइलों को हटाया जाना है, वे अभी भी स्वचालित रूप से हटाए जा रहे हैं।

अद्यतन 2

आज मैंने पाया कि फ़ाइलें जो Git संशोधनों के बीच में संशोधित कर रहे हैं भी स्वचालित रूप से हटा कर रहे हैं। मुझे गतिशील रूप से appspec.yml फ़ाइल तैयार करने के लिए तर्क था। मैंने कुछ फाइलें जोड़ने के लिए संशोधित नहीं किया। तो, कुछ फाइलें थीं जो गिट diff में थीं, लेकिन ऐपस्पेक फ़ाइल में नहीं थीं। नतीजतन, वे हटा रहे हैं लेकिन फिर से दिखाई नहीं दे रहे हैं। तैनाती से पहले कोड परिनियोजन स्वचालित रूप से एक सफाई कर रहा है, ऐसा लगता है। मैं इसे कैसे रोकूं? मैं अपना कस्टम क्लीनअप तर्क जोड़ना चाहता हूं।

अद्यतन beforeInstall.sh की 3

सामग्री -

OUTPUT="$(w | grep -Po '(?<=load average:)[^,]*')" 
rm -f /var/cake_1.2.0.6311-beta/deployment/deployment_config.json 
path="$PWD" 
php $path"/deployment-root/"$DEPLOYMENT_GROUP_ID"/"$DEPLOYMENT_ID"/deployment-archive/beforeInstall.php" ${OUTPUT} 

/usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn_hiphop_error /mnt/log/hiphop/error_`(date +'%Y%m%d')`.log #Just run a nagios check, so that counter corresponds to the line in the log corresponding to current timestamp/instant. Do not care about output. Note that we are not even looking for error hinting keywords (and hence not using -p because it needs to be used alongwith), because all we need to care about here is incrementing the nginx counter. 

/usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn_nginx_access /mnt/log/nginx/access_`(date +'%Y%m%d')`_`(date +'%H')`.log #Just run a nagios check, so that counter corresponds to the line in the log corresponding to current timestamp/instant. Acceptable http codes are also not being read from deployment_config.json. 
printf "\n `date +%Y-%m-%d:%H:%M:%S` End of beforeInstall.sh" >> /var/cake_1.2.0.6311-beta/deployment/deployment.log 
exit 0 

और beforeInstall.php की सामग्री है जो ऊपर से कहा जाता है -

<?php 
file_put_contents('/var/cake_1.2.0.6311-beta/deployment/deployment.log', "\n ".date("Y-m-d H:i:s")." - Load print ".$argv[1], FILE_APPEND); 
$loadData = json_encode(array("load" => intval($argv[1]), "access_error_check_day" => date("Ymd"), "access_error_check_hour" => date("H"))); //error_check_day -> day when nagios error check was last run. We will accordingly check log files of days in between this day and the day of afterinstall (practically this can include a span of 2 days). 

file_put_contents("/var/cake_1.2.0.6311-beta/deployment/serverLoad.json",$loadData); //separate from deployment_config.json. serverLoad.json is not copied from build server. 
file_put_contents('/var/cake_1.2.0.6311-beta/deployment/deployment.log', "\n ".date("Y-m-d H:i:s")." loadData to config ".$loadData, FILE_APPEND); 
?> 
+0

अपनी स्थापित स्क्रिप्ट से पहले पोस्ट करें। मुझे लगता है कि आप उन्हें हटा रहे हैं। – mttdbrd

+0

@mttdbrd कृपया प्रश्न के 3 खंड अपडेट करें। –

+0

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

उत्तर

2

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

इस तरह, प्रत्येक 'संशोधन' को तैनात करने से पहले, कोडडिएबल पहले पिछले संशोधन द्वारा तैनात की गई किसी भी फाइल को साफ़ करेगा। मुझे समझाने दो।

File A 
File B 
File C 

और फिर अगले तैनाती केवल शामिल इन फ़ाइलों:

File A 
File C 

कोड नियोजित होगा पहला सफाई 3 फ़ाइलें

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

File A 
File C 

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

उदाहरण के लिए, कि पिछले परिदृश्य में, यदि आप पहले से था फ़ाइलें ए, बी और सी मैन्युअल, फिर फ़ाइलें एक की तैनाती है, क्योंकि यह एक साफ करने के लिए पता नहीं & बी नाकाम रहे हैं होता है, अपलोड की गई बी और सी पहले, और फिर यह आपको फ़ाइलों को ए और बी

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

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

ऐप स्पेक से सभी फ़ाइलों को छोड़कर (यानी।कोई फाइल निर्दिष्ट नहीं है) और प्रतिलिपि बनाने के लिए पहले से इंस्टॉल करें और/या AfterInstall चरणों का उपयोग करना एक ऐसा दृष्टिकोण है जो कुछ परिदृश्यों के लिए काम कर सकता है।

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

+0

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

+1

उत्तर में उस दृष्टिकोण को जोड़ा गया ... प्रतिक्रिया के लिए धन्यवाद। –

+0

महान जवाब! स्पष्ट स्पष्टीकरण। – mttdbrd

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