विभिन्न git शाखाओं से तैनाती के लिए capistrano का उपयोग करना


125

मैं RoR एप्लिकेशन को लागू करने के लिए कैपिस्ट्रानो का उपयोग कर रहा हूं। कोडबेस एक गिट रिपॉजिटरी में है, और शाखा का व्यापक रूप से विकास में उपयोग किया जाता है। Capistrano deploy.rbयह सेटिंग्स के लिए फ़ाइल का उपयोग करता है , उनमें से एक को तैनात करने के लिए शाखा है।

मेरी समस्या यह है: मान लें कि मैं मास्टर से एक नई शाखा बनाता हूं । तैनाती फ़ाइल मास्टर शाखा को संदर्भित करेगी । मैं इसे संपादित करता हूं, इसलिए A को पर्यावरण के परीक्षण के लिए तैनात किया जा सकता है। मैं फीचर पर काम करना समाप्त करता हूं, और शाखा को मास्टर में विलय करता हूं । चूंकि से फाइल एक नवसिखुआ है, यह में विलय कर दिया और अब हो जाता है में मास्टर शाखा संदर्भ एक । फिर से संपादित करने का समय।deploy.rbdeploy.rb

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

इस प्रक्रिया को स्वचालित करने का सबसे अच्छा तरीका क्या होगा?

संपादित करें: पता चला है कोई पहले से ही वास्तव में किया था कि मैं क्या जरूरत है :

आज सुबह मेरे पास एक स्टेजिंग सर्वर के लिए एक git रिपॉजिटरी की एक शाखा को तैनात करने का अवसर था, लेकिन यह कैसे पता नहीं था। कैपिस्ट्रानो स्रोत कोड के माध्यम से एक त्वरित खोज से पता चला कि मैं :branch "branch_name"अपनी तैनाती स्क्रिप्ट में सेट का उपयोग कर सकता हूं। मैंने इसे आजमाया और यह काम आया। फिर मुझे लगा कि मुझे अपनी सभी शाखाओं में समान परिवर्तन करने की आवश्यकता होगी। बेशक, मैं एक आलसी आदमी हूं और सोचता हूं कि क्या बेहतर तरीका नहीं था।

यदि आप git से परिचित नहीं हैं, तो git ब्रांच कमांड का आउटपुट एक सूची के साथ शाखाओं की सूची है, जो आपके स्थानीय मशीन पर वर्तमान में जाँच की गई है। उदाहरण के लिए:

> git branch
* drupal_authentication
fragment_caching
master

इसलिए, मुझे लगा कि क्या होगा अगर मैंने अभी आउटपुट को पार्स किया है और वर्तमान के रूप में चिह्नित शाखा के लिए खोज की है:

set :branch, $1 if `git branch` =~ /\* (\S+)\s/m

अब मैं अपनी स्थानीय मशीन पर एकल, साझा, परिनियोजित स्क्रिप्ट से जो भी शाखा चालू कर सकता हूं, उसे तैनात करने में सक्षम हूं।


यह अद्यतन लिंक है: Capistrano
Wacko

जवाबों:


157

यह Capistrano> = 3.1 के साथ काम करता है:

इस पंक्ति को इसमें जोड़ें config/deploy.rb:

set :branch, ENV['BRANCH'] if ENV['BRANCH']

और फिर capistrano के साथ कॉल करें:

cap production deploy BRANCH=master

यह समाधान Capistrano <3.1 के साथ काम करता है:

# call with cap -s env="<env>" branch="<branchname>" deploy

set :branch, fetch(:branch, "master")
set :env, fetch(:env, "production")

4
अगर मस्टिस्टेज एक्सटेंशन का उपयोग करना है, तो सेट करने की कोई आवश्यकता नहीं है env, लेकिन यह मेरे लिए सिर्फ एक शाखा का उपयोग करके काम करता है
टॉम हैरिसन

जैसा कि @lulalala द्वारा कहा गया है कि मुझे इसके लिए लोअरकेस का उपयोग करने की आवश्यकता है ताकि इसके लिए निर्दिष्ट शाखा लाई जा सके।
जहान

@ जानी: धन्यवाद, लगता है कि उन्होंने बदल दिया है कि नए कैपिस्ट्रानो रिलीज में, मैंने अपने उत्तर को तदनुसार संपादित किया।
प्रात: काल

मुझे @ जानी की तुलना में सटीक विपरीत समस्या थी: मुझे ऊपरी-मामले में -एस था, यह तर्क प्राप्त करने के लिए कि जब यह प्राप्त करने के लिए भ्रूण (: var_name, 'default') का उपयोग करते समय तर्क से गुजरना नहीं होगा।
फ्रेडरिक स्ट्रक-शोइंग

1
विकल्प '-s' (--सेट) 'व्यंजनों के लोड होने के बाद एक चर सेट करें' के लिए है। और विकल्प 'S' (--set-before) का अर्थ है 'व्यंजनों को लोड करने से पहले एक चर सेट करें।'
रेमन कैलेडीरा

33

Capistrano 3.1.0+ का उपयोग करते हुए, इनमें से कोई भी अब मेरे लिए काम नहीं कर रहा था। इसके बजाय, उनके निर्देश के अनुसार टिप्पणी:

   ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

लेकिन, आप उपयोग नहीं करना चाहते हैं askया यह आपको संकेत देगा। इसके बजाय आपको उपयोग करना चाहिए setHEADसबसे ऊपर की शाखा है; 'किनारा' जैसा कि इसे कहा जाता है। आप एक अलग शाखा चाहते हैं, की जगह HEAD: अपनी शाखा का नाम, उदाहरण के साथ master, stagingआदि

उदाहरणों के साथ निष्कर्ष निकालने के लिए /config/deploy/production.rb, आप इस पंक्ति को शामिल कर सकते हैं:

   set :branch, proc { `git rev-parse --abbrev-ref master`.chomp }

... या

   set :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

btw, HEADडिफ़ॉल्ट सेटिंग है, इसलिए फ़ाइल में वास्तव में बताने की आवश्यकता नहीं है। एक में बेहतर इस्तेमाल किया जा सकता है/config/deploy/edge.rb

में /config/deploy/staging.rb, आप इस पंक्ति को शामिल कर सकते हैं:

   set :branch, proc { `git rev-parse --abbrev-ref staging`.chomp }

... या

   set :branch, proc { `git rev-parse --abbrev-ref test`.chomp }

तुम्हें नया तरीका मिल गया है!

मुझे आशा है कि इन उदाहरणों से भविष्य के उपयोगकर्ताओं को मदद मिलेगी


4
git rev-parse --abbrev-ref HEADयह जानने के लिए प्रयोग किया जाता है कि HEAD किस शाखा पर है। रनिंग git rev-parse --abbrev-ref stagingविल (लगभग) हमेशा आउटपुट staging। आप बस उपयोग कर सकते हैं set :branch, 'staging'
मिनीगॉड

27

मल्टीस्टेज के साथ, यह वास्तव में अब है:

cap production deploy -s branch=my-branch

पिछला पोस्ट सिंटैक्स मेरे वातावरण में काम नहीं करता है


1
-s branch=foofooव्यंजनों को लोड होने के बाद कैपिस्ट्रानो चर शाखा सेट करता है
एल्विन

26

मैं पुष्टि कर सकता हूं कि नीचे अभी भी कैप 3.11.0 13/10/18 और साथ ही कैप 2 में काम करता है:

In.rb / stage.rb:

set :branch, ENV['BRANCH'] || 'develop'

कमांड लाइन पर:

cap deploy BRANCH=featurex

यह आपको एक डिफ़ॉल्ट शाखा देता है (जो विभिन्न वातावरणों के लिए भिन्न हो सकती है), और जब आप चाहें तो शाखाओं को बदलने की क्षमता।


15

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

#call with cap -S env="<env>" branch="<branchname>" deploy
...

# Prevents error if not parameter passed, assumes that default 'cap deploy' command
# and should deploy the master branch to the production server
set(:env, ‘production’) unless exists?(:env)
set(:branch, ‘master’) unless exists?(:branch)

if !env.nil? && env == "production"
   role :web, "production_ip_address"
else   # add more as needed 
   role :web, "development_ip_address"
end

if !branch.nil? && branch == "current"
   set :branch, $1 if `git branch` =~ /\* (\S+)\s/m
elsif !branch.nil?
   set :branch, branch
else   # add more as needed 
   set :branch, "master"
end
...

कोड उदाहरण यहाँ से भारी उधार लिया गया है


3
मुझे इसके लिए लोअरकेस का उपयोग करने की आवश्यकता है -sताकि निर्दिष्ट शाखा लाने के लिए
लूलाला

मेरे पास @lulula की तुलना में सटीक विपरीत समस्या थी: मुझे ऊपरी-मामले में -S था, यह तर्क प्राप्त करने के लिए कि जब यह प्राप्त करने के लिए भ्रूण (: var_name, 'default') का उपयोग करते समय तर्क कैप से नहीं गुजरेगा।
फ्रेडरिक स्ट्रक-शोइंग

10

यदि आप कैपिस्ट्रानो-मल्टीस्टेज का उपयोग कर रहे हैं , तो आपको केवल चलाने की आवश्यकता है

cap -s branch=$MY_BRANCH deploy

या

cap -s branch=$MY_BRANCH production deploy

बिना किसी और को संपादित करने के लिए अपने deploy.rb


2
वह होना चाहिए branch=, नहीं branch-
जिमोथी

3
OptionParser :: AmbiguousOption: अस्पष्ट विकल्प: -s
जियोर्जियो

8

यह कमांड अब काम नहीं करेगी:

cap deploy -s branch=your_branch

-sSझंडों के समर्थन को capistrano v3 + में हटा दिया गया था।
यहां आप इसके बारे में अधिक पढ़ सकते हैं: लिंक
यह कुछ उत्तरों के जोड़े में उल्लेख किया गया था, लेकिन वर्तमान में यह सही नहीं है।

मेरे लिए क्या काम करता है:
में deploy.rbफ़ाइल जोड़ने

set :branch, ENV['BRANCH'] || :master

फिर भागो:

BRANCH=your_branch cap deploy

कृपया यह भी ध्यान दें कि, इस कमांड को सफलतापूर्वक चलाने के लिए, आपको मास्टर ब्रांच पर होना चाहिए।


3

यह समाधान Capistrano के सभी संस्करणों के साथ काम करना चाहिए।

def branch_name(default_branch)
  branch = ENV.fetch('BRANCH', default_branch)

  if branch == '.'
    # current branch
    `git rev-parse --abbrev-ref HEAD`.chomp
  else
    branch
  end
end

set :branch, branch_name('master')

उपयोग:

BRANCH=. cap [staging] deploy
# => deploy current branch

BRANCH=master cap [staging] deploy
# => deploy master branch

cap [staging] deploy
# => deploy default branch


1

सामान्य उत्तर:

यदि आपके पास वातावरण से पर्यावरण में संशोधित सामग्री के साथ एक सेटिंग फ़ाइल है, तो आपको उस लाइन को "टेम्पलेट" (स्ट्रिंग जैसे @BRANCH_NAME@या वैरिएबल नाम का प्रतिनिधित्व करने वाले स्ट्रिंग @ENV_NAME@) के रूप में बनाना चाहिए ।

तब आपके पास आपकी कॉन्फ़िगरेशन फ़ाइल को पढ़ने में सक्षम एक (संस्करण) स्क्रिप्ट होगी, और @BRANCH_NAME@आपकी तैनाती प्रक्रिया द्वारा आवश्यक उचित मूल्य द्वारा " " चर को प्रतिस्थापित करेगी ।


एक ही तरह के मुद्दे पर भी देखें: stackoverflow.com/questions/1429256/… , stackoverflow.com/questions/487753/… , stackoverflow.com/questions/6009/…
VonC

1

Capistrano 3 उपयोगकर्ताओं के लिए:

desc "prompt for branch or tag"
task :git_branch_or_tag do
  on roles(:all) do |host|
    run_locally do
      execute :git, 'tag'
      tag_prompt = "Enter a branch or tag name to deploy"
      ask(:branch_or_tag, tag_prompt)
      tag_branch_target = fetch(:branch_or_tag, 'master')
      set(:branch, tag_branch_target)
    end
  end
end

before 'deploy:updated',  :git_branch_or_tag

1

विधि 1: परिनियोजन के लिए चरण विशिष्ट शाखा (जैसे परीक्षण, उत्पादन) सेट करें

branch। तैनात.आरबी ’के बजाय स्टेज फाइलों में कॉन्फ़िगरेशन डालें और उस चरण के लिए लक्ष्य शाखा को वहां से तैनात करें।

संबंधित शाखा के नाम के साथ दो चरण के ऐप testऔर production, कॉन्फ़िगरेशन इस तरह दिखेगा,

# app_root/config/deploy/test.rb
...
set :branch, "test"
...

# app_root/config/deploy/production.rb
...
set :branch, "production"
...

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

विधि 2: किसी भी शाखा से सीधे तैनात करें (टैग का उपयोग करके)

एक अन्य दृष्टिकोण टैग का उपयोग करके तैनात करना है। टैग का उपयोग करके तैनात करने के लिए, branchकॉन्फ़िगरेशन सेट करें । निम्नानुसार '

set :branch, `git describe --tags $(git rev-list --tags --max-count=1)`.chomp

और, संबंधित टैग पैटर्न (उदाहरण /.*-test$/) से मेल खाने पर सीआई को सशर्त रूप से विभिन्न चरणों में तैनात करने के लिए कॉन्फ़िगर करें ।

अब, किसी भी शाखा से एक तैनाती की जा सकती है,

  • सबसे पहले, किसी भी शाखा से एक टैग बनाएं,

    git टैग -a v0.1.0-test -m "संस्करण 0.1.0-परीक्षण"

  • और, धक्का

    git पुश ओरिजिनल v0.1.0-test

नोट: उपरोक्त विधियाँ Capistrano 3 पर आधारित हैं।


0
git rev-parse --abbrev-ref HEAD

आप जिस वर्तमान शाखा में हैं, उसे वापस कर देंगे।

मैं हमेशा के gpshबजाय सेटgit push -u origin branch_name

$ which gpsh
gpsh: aliased to git push -u origin `git rev-parse --abbrev-ref HEAD`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.