2012-04-18 37 views
30

पर पैरामीटर पास करना मैं एक सामान्य तैनाती समाधान के रूप में Capistrano का उपयोग करने की संभावना को देख रहा हूं। "सामान्य" से, मेरा मतलब रेल नहीं है। मैं जो दस्तावेज ढूंढ रहा हूं, उसकी गुणवत्ता से मैं खुश नहीं हूं, हालांकि, मुझे लगता है कि मैं उन लोगों को नहीं देख रहा हूं जो आपको लगता है कि आप रेल तैनात कर रहे हैं। तो मैं कुछ उदाहरणों के आधार पर कुछ हैक करने की कोशिश करूंगा, लेकिन शुरुआत से ही मुझे कुछ समस्याएं आ रही हैं।Capistrano

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

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

तो, मैं इन चीजों को कैसे पूरा करूं?

उदाहरण

मैं दूसरी रिलीज के पहले स्प्रिंट का परिणाम तैनात करने के लिए चाहते हैं। इसे गिट रिपोजिटरी में r2s1 के रूप में टैग किया गया है। साथ ही, मान लें कि उपयोगकर्ता "जॉन्डो" को सिस्टम को तैनात करने का कार्य मिलता है। भंडार तक पहुंचने के लिए, उसे यूआरएल [email protected]:app का उपयोग करना होगा। तो भंडार के लिए दूरस्थ यूआरएल उपयोगकर्ता आईडी पर निर्भर करता है।

कमांड लाइन प्राप्त करने के लिए वांछित फ़ाइलों इन किया जाएगा:

git clone [email protected]:app 
cd app 
git checkout r2s1 
+0

अरे, मुझे आशा है कि आप हमारे उत्तरों को अनदेखा नहीं करेंगे। कम से कम कृपया उन्हें टिप्पणी करें। :) – deadrunk

उत्तर

46

Jarrad है ने कहा है, Capistrano -श अन्य परियोजना प्रकारों को तैनात करने के लिए सहायक मॉड्यूल का एक अच्छा मूल सेट है, हालांकि यह दिन के अंत में आवश्यक नहीं है। यह सिर्फ एक पटकथा भाषा है और अधिकांश कार्यों को सिस्टम कमांड के साथ किया जाता है और लगभग शेल स्क्रिप्ट बनना समाप्त होता है।

पैरामीटर में पास करने के लिए, आप एक महत्वपूर्ण मूल्य जोड़ी देने के लिए कैप चलाने पर -s ध्वज सेट कर सकते हैं। पहले इस तरह एक कार्य बनाएँ।

desc "Parameter Testing" 
task :parameter do 
    puts "Parameter test #{branch} #{tag}" 
end 

फिर अपना काम शुरू करें।

cap test:parameter -s branch=master -s tag=1.0.0 

अंतिम भाग के लिए। मैं आपके सर्वर पर एसएसएच कुंजी का उपयोग करके पासवर्ड रहित पहुंच सेट अप करने की अनुशंसा करता हूं। लेकिन अगर आप इसे मौजूदा लॉग इन उपयोगकर्ता से ले जाना चाहते हैं।आप ऐसा कुछ कर सकते हैं।

desc "Parameter Testing" 
task :parameter do 
    system("whoami", user) 
    puts "Parameter test #{user} #{branch} #{tag}" 
end 

अद्यतन: संपादित Capistrano के नवीनतम संस्करण के साथ काम करने के लिए। कॉन्फ़िगरेशन सरणी अब उपलब्ध नहीं है।

वैश्विक पैरामीटर: टिप्पणियां देखें वैश्विक स्तर पर पैरामीटर का उपयोग करने के लिए सेट: शाखा, fetch (: शाखा, 'एक-डिफ़ॉल्ट-मान') का उपयोग करें। (और उन्हें -एस के साथ पास करें।)

+0

यह ठीक है, जहां तक ​​यह जाता है, लेकिन मैं कैपिस्ट्रानो को कैसे बता सकता हूं कि इसे किस टैग को देखना चाहिए? –

+1

-s पैरामीटर का उपयोग कर। इसलिए मेरे पास एक विशिष्ट टैग तैनात करने के लिए इस तरह की कमांडलाइन होगी। शाखा, # {विन्यास [: टैग]} टोपी उत्पादन तैनाती -s टैग = 2.1.3 आप capistano-ऐश का इस्तेमाल कर रही हैं, तो आप सिर्फ सेट करना है कि टैग चेकआउट चाहिए कमांडलाइन –

+2

पर सेट करें यह अब और काम नहीं करता है। Https://groups.google.com/forum/?fromgroups=#!topic/capistrano/1nFQPWf9EIo और अन्य स्थानों के अनुसार, 'कॉन्फ़िगरेशन' को बहिष्कृत कर दिया गया है:' # के लिए अपरिभाषित स्थानीय चर या विधि 'कॉन्फ़िगरेशन' # (नाम त्रुटि) '। अब आप चर नामों का उपयोग कर सकते हैं। यह कुछ महीने पहले कैसे काम किया ?? – jordanpg

0

चेक बाहर capistrano-ash एक पुस्तकालय है कि गैर रेल तैनाती के साथ मदद करता है के लिए। मैं इसे एक पाइरोसीएमएस ऐप को तैनात करने के लिए उपयोग करता हूं और यह बहुत अच्छा काम करता है।

# deploy from git repo 
set :repository, "[email protected]:mygitrepo.git" 
# tells cap to use git 
set :scm, :git 

मुझे यकीन है कि मैं प्रश्न के अंतिम दो हिस्से को नहीं कर रहा हूँ:

यहाँ है कि परियोजना के लिए मेरे Capfile से एक टुकड़ा है। कुछ और विवरण प्रदान करें और मुझे मदद करने में खुशी होगी। उदाहरण के बाद

संपादित दिया:

set :repository, "#{scm_user}@gitsrv.domain:app" 

तब तैनाती विशेषाधिकार के साथ प्रत्येक व्यक्ति को उनके स्थानीय ~/.caprc फ़ाइल में निम्न जोड़ सकते हैं:

set :scm_user, 'someuser' 
+0

ठीक है, उदाहरण दिया गया। ध्यान दें कि मैं रिपॉजिटरी को एक निश्चित मान पर सेट नहीं कर सकता, जैसा कि आप अपने स्निपेट में करते हैं। –

+0

घर का '.caprc' होना अच्छा है, लेकिन अनिवार्य नहीं हो सकता है। मैं कमांड लाइन पर पैरामीटर पास करना चाहता हूं। –

9

मैं एनएनवी चर का उपयोग करने का सुझाव दूंगा।

Somethings इस (आदेश) की तरह:

$ GIT_REPO="[email protected]:app" GIT_BRANCH="r2s1" cap testing 

कैप config:

#deploy.rb: 
task :testing, :roles => :app do 
    puts ENV['GIT_REPO'] 
    puts ENV['GIT_BRANCH'] 
end 

और https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension पर एक नज़र डालें, हो सकता है इस दृष्टिकोण के रूप में अच्छी तरह से आप के लिए उपयोगी होगा।

+1

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

+0

मैं आखिरी टिप्पणी से सहमत हूं, मैं -s या-var = value के साथ एक कमांड लाइन पसंद करता हूं और फिर जैसे कुछ variables.include? (: Var) ... अन्य ... एंड' – Federico

3

जैसा कि जेमी पहले ही दिखाया गया है, आप -s ध्वज के साथ कार्यों को पैरामीटर पास कर सकते हैं। मैं आपको दिखाना चाहता हूं कि आप अतिरिक्त रूप से डिफ़ॉल्ट मान का उपयोग कैसे कर सकते हैं।

आप मूलभूत मूल्यों के साथ काम करना चाहते हैं, तो आप ||= के बजाय fetch उपयोग करने के लिए या nil के लिए जाँच:

namespace :logs do 
    task :tail do 
    file = fetch(:file, 'production') # sets 'production' as default value 
    puts "I would use #{file}.log now" 
    end 
end 

आप द्वारा इस कार्य को चला सकते हैं या तो (file के लिए डिफ़ॉल्ट मान production उपयोग करता है)

$ cap logs:tail 

या (file

के लिए मूल्य cron का उपयोग करता है
$ cap logs:tail -s file=cron 
6

अद्यतन। कैपिस्ट्रानो 3 कार्य को केवल पैरामीटर पास करने के संबंध में।

मुझे पता है कि यह प्रश्न काफी पुराना है लेकिन अभी भी कैपिस्ट्रानो कार्य को पास करने वाले पैरामीटर की खोज करते समय Google पर पहली बार पॉप अप करता है। दुर्भाग्य से, जेमी सदरलैंड द्वारा प्रदान की शानदार जवाब नहीं रह Capistrano 3. साथ वैध है इससे पहले कि आप अपना समय बर्बाद नीचे की तरह बनना परिणाम को छोड़कर इसे आज़मा रहे हैं:

cap test:parameter -s branch=master 

आउटपुट:

cap aborted! 
OptionParser::AmbiguousOption: ambiguous option: -s 
OptionParser::InvalidOption: invalid option: s 

और

cap test:parameter -S branch=master 

आउटपुट:

invalid option: -S 

Capistrano 3 के लिए मान्य जवाब @senz और ब्रैड डॉयर द्वारा प्रदान की आप इस सोने लिंक पर क्लिक करके पा सकते हैं: Capistrano 3 pulling command line arguments

पूर्णता के लिए नीचे दिए गए कोड के बारे में दो विकल्प आपके पास पता लगाने के लिए देखते हैं।

1 विकल्प:

आप कुंजी और मान के साथ कार्य पुनरावृति कर सकते हैं जैसा कि आप नियमित रूप से हैश के साथ कार्य करें:

desc "This task accepts optional parameters" 

task :task_with_params, :first_param, :second_param do |task_name, parameter| 
    run_locally do 
    puts "Task name: #{task_name}" 
    puts "First parameter: #{parameter[:first_param]}" 
    puts "Second parameter: #{parameter[:second_param]}" 
    end 
end 

यकीन है कि मानकों को जब आप टोपी फोन के बीच कोई जगह नहीं है बनाओ:

cap production task_with_params[one,two] 

2 विकल्प:

जबकि आप किसी भी कार्य को कहते हैं, आप पर्यावरण चर आवंटित और फिर उन्हें कोड से कॉल कर सकते हैं:

set :first_param, ENV['first_env'] || 'first default' 
set :second_param, ENV['second_env'] || 'second default' 

desc "This task accepts optional parameters" 
task :task_with_env_params do 
    run_locally do 
    puts "First parameter: #{fetch(:first_param)}" 
    puts "Second parameter: #{fetch(:second_param)}" 
    end 
end 

bellow तरह पर्यावरण चर, कॉल टोपी सौंपने के लिए:

cap production task_with_env_params first_env=one second_env=two 

आशा है कि बचत होगी आप कुछ समय

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