2017-02-04 9 views
13

में समकक्ष संकलित प्रतिबद्धता बनाएं, मैं जेकिल का उपयोग कर साइट्स बना रहा हूं, जो ईआरबी, एसएएसएस, & सी संकलित करता है। सादा एचटीएमएल & सीएसएस में।प्रत्येक प्रतिबद्धता के लिए, एक अलग रेपो या शाखा

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

इस बारे में जाने का सबसे अच्छा तरीका क्या है?

मेरे पास पहले से ही a solution है, लेकिन मुझे आशा थी कि किसी के पास अधिक सुरुचिपूर्ण हो।

उत्तर

1

_site/ में एक Git रेपो प्रारंभ, तो एक Git बाद प्रतिबद्ध हुक, .git/hooks/post-commit जोड़ें:

echo -n "Add commit to compiled version? (y/N) " 
read answer < /dev/tty 
if [ "$answer" != "y" ]; then exit; fi 

message=$(git log -1 --pretty=%B) 

git stash --all 
bundle exec jekyll build 

cd _site 
    git add --all 
    git commit -m "$message" 
cd .. 

git stash pop 

अब, हर बार जब आप के लिए प्रतिबद्ध है, तो आप के लिए कहा जाएगा कि क्या आप को जोड़ने के लिए करने के लिए एक प्रतिबद्ध चाहते हैं संकलित संस्करण।

5

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

आपके लिए सही कीवर्ड "निरंतर एकीकरण" है।

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

बिल्ड स्क्रिप्ट जिसे आप सीआई सॉफ्टवेयर में कॉन्फ़िगर करते हैं, निर्माण कलाकृतियों को तैनात करने के लिए ज़िम्मेदार है, उस मामले में आपके संकलित संस्करण, एस 3 बाल्टी जैसे आपके लक्ष्य सिस्टम में। आप अपने कलाकृतियों की एक प्रोग्रामिक प्रतिबद्धता को एक अलग गिट रेपो में भी कर सकते हैं।

यहाँ एक नज़र: https://jenkins.io/doc/

+0

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

2

आपका समाधान एक ही रेपो "स्रोत करता है" और "वितरण करता है" (_site संकलित संस्करण) है, जो है नहीं सबसे अच्छा अभ्यास में मिश्रण होगा (और Git रेपो बेकार के आकार में वृद्धि होगी)

मैं एक अलग रेपो "site" है कि मैं एक पथ _site/ कहा जाता है में अपने वर्तमान रेपो के लिए एक submodule के रूप में जोड़ना होगा, बना सकेगी।

cd /path/to/current/repo 
git rm -R _site 
git submodule add -- /url/repo/site _site 

इस तरह, हर बार जब आप बंडल कार्यकारी Jekyll निर्माण के साथ अपने वितरण का निर्माण, यह एक अलग रेपो में किया जाता है (_site में) है, जहां आप जोड़ सकते हैं, के लिए प्रतिबद्ध है, और भी अपने इच्छित स्थान के लिए सीधे धक्का झसे आज़माओ।
फिर आप अपने मुख्य रेपो पर वापस जाएं, जहां आप gitlink (special entry in the index) जोड़ते हैं और स्रोत के सटीक संस्करण और वितरण (सटीक साइट) के सटीक संस्करण के बीच एक मजबूत लिंक स्थापित करते हैं।

+0

आह, मैं अपने समाधान में उल्लेख करना भूल गया कि मैंने 'गिट इनिट _साइट /' का उपयोग किया, इसलिए वास्तव में एक अलग भंडार में काम किया जा रहा था। मुझे ऐसा लगता है कि, अगर कुछ भी, * स्रोत * सबमिशन होना चाहिए। – Zaz

+0

@Zaz बिल्कुल: केवल 'गिट इनिट' का उपयोग करके इसे एक सबमिशन नहीं बनाया जाएगा, केवल एक नेस्टेड गिट रेपो, जो खराब है, जैसा कि मैंने http://stackoverflow.com/a/41968295/6309 में विस्तृत किया है। – VonC

+0

मेरे पास '.gitignore' में' _site/'है, क्या मैं इस सेटअप के साथ पैर में खुद को शूट कर सकता हूं? – Zaz

2

आप

अनुरोध किया जैसा कि मैंने अपने संकलित कोड स्टोर करने के लिए एक ही रेपो उपयोग करने के लिए आपको सलाह नहीं देते।क्योंकि इसे स्रोत कोड के किसी भी राज्य से प्राप्त किया जा सकता है और यह जानकारी के अनजान लचीलापन होगा।

इसलिए, इस मामले में आप सीआई उपकरण के रूप में Git उपयोग करना चाहते हैं। आपको संकलित साइट के लिए एक और रेपो बनाना चाहिए और हर बार आपको इसकी आवश्यकता होती है।

मैं तुम्हें कोड के "उत्पादन" राज्य के लिए शाखा चयन करने के लिए सुझाव देते हैं। और जब आप उस शाखा में आते हैं - कोड का पुनर्निर्माण किया जाना चाहिए। आइए इसे "उत्पादन" नाम दें।

  1. निर्मित कोड के लिए अलग गिट रेपो बनाएं।
  2. इस कोड को अपने src repo में पोस्ट-प्रतिबद्ध हुक में रखें। यह उत्पादन शाखा में सभी कामों को संभालेगा, कोड को अस्थायी निर्देशिका में चेकआउट करेगा, निर्माण करेगा और परिवर्तन करेगा।
srcDir='../srcWorkTree' 
buildedRepo='../buildedRepo' 

if [ `git rev-parse --abbrev-ref HEAD` == "production" ]; then 
    echo "making builded code commit..." 
    mkdir -p $srcDir 
    # http://stackoverflow.com/questions/4479960/git-checkout-to-a-specific-folder 
    git checkout-index -a -f --prefix=$srcDir/ 

    bundle exec jekyll build --source $srcDir --destination $buildedRepo 

    cd $buildedRepo 
    git add -A 
    commitInfo=$(git log -1 --pretty="%h %B") 
    git commit -m "autobuild for $commitInfo" 
    # git push 
fi 

एक और प्रकार

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

मुझे लगता है कि इस रेपो क्योंकि आप सर्वर पर परिवर्तन करने के लिए संभावना नहीं होना चाहिए "नंगे" है।

हुक के बाद प्राप्त होता है:

#!/bin/sh 

siteDir='/var/www/site' 
tmpSrcDir='/var/www/site' 

echo "**** [builder's post-receive hook]" 

while read oldrev newrev refname 
do 
    if [ $refname = refs/heads/production ] 
    then 
     GIT_WORK_TREE=$tmpSrcDir git checkout --detach $newrev 

     bundle exec jekyll build --source $tmpSrcDir --destination $siteDir 
    fi 
done 

exit 0 

और कुछ टिप्पणियां

मैं देख रहा हूँ, आप अपने builded साइट स्टोर करने के लिए submodule उपयोग करने के लिए tryed। मैं इसकी सिफारिश नहीं करता हूं। कोई समझ नहीं है क्योंकि आपका स्रोत कोड निर्मित कोड पर निर्भर नहीं है।

2

मैं बस एक और विकल्प सुझाऊंगा: संकलित संस्करणों को गिट में स्टोर न करें, उन्हें कहीं और स्टोर करें।

आपको एक उदाहरण के रूप में हमारे कार्यप्रवाह देने के लिए:

  • जब हम एक विशेष के लिए प्रतिबद्ध है, हम हमारे सीआई प्रक्रिया है जो एक .tar.gz संग्रह का उत्पादन के माध्यम से इसे चलाने के परीक्षण करने के लिए की जरूरत है, और हम अपने तैनाती का उपयोग एक स्टेजिंग सर्वर पर परीक्षण करने के लिए उपकरण;

  • जब हम एक एक रिलीज़ संस्करण के लिए प्रतिबद्ध का चयन करें, हम को टैग इस Git में प्रतिबद्ध है, हम इसे बाहर सीआई प्रक्रिया के माध्यम से चलाने के लिए, .tar.gz संस्करण संख्या के साथ चिह्नित और हमारे तैनाती पर कुछ releases/ निर्देशिका में संग्रहीत किया जाता है सर्वर।

हम अपने releases/ फ़ोल्डर का बैकअप है, लेकिन हम इसे ढीला करना चाहिए, हम भी स्रोत से किसी विशेष निर्माण (टैग के आधार पर) के पुनर्निर्माण कर सकते हैं।

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