Capistrano'yu farklı git dallarından dağıtmak için kullanma


125

Bir RoR uygulamasını dağıtmak için capistrano kullanıyorum. Kod tabanı bir git deposundadır ve dallanma, geliştirmede yaygın olarak kullanılmaktadır. Capistrano, deploy.rbayarları için dosyayı kullanır , bunlardan biri dağıtım yapılacak daldır.

En Yeni şube oluşturduğunuzu varsayalım: Benim sorun budur A dan usta . Konuşlandırma dosyası ana dala başvuracaktır . Bunu düzenlerim, böylece A , test ortamına dağıtılabilir. Ben özellikle ilgili çalışmalarımız ve birleştirme şube tamamladıktan A içine ustası . Yana deploy.rbgelen dosya A yeni olmasının, şimdi de birleşti ve alır deploy.rbiçinde usta şube referansları A . Tekrar düzenleme zamanı.

Bu, görünüşte gereksiz olan manuel düzenlemenin birçoğudur - parametre her zaman mevcut şube adıyla eşleşmelidir. Bunun da ötesinde, her seferinde ayarları düzenlemeyi unutmak kolaydır.

Bu süreci otomatikleştirmenin en iyi yolu ne olabilir?

Düzenleme: Birisinin tam olarak ihtiyacım olan şeyi zaten yaptığı ortaya çıktı :

Bu sabah, git deposunun bir dalını bir hazırlık sunucusuna dağıtma fırsatım oldu, ancak nasıl yapılacağı konusunda en ufak bir fikrim yoktu. Capistrano kaynak kodunda hızlı bir arama, :branch "branch_name"dağıtım betiğimde seti kullanabileceğimi ortaya çıkardı . Ben denedim ve işe yaradı. Daha sonra tüm şubelerimde benzer bir değişiklik yapmam gerektiğini düşündüm. Tabii ki, ben tembel bir herifim ve daha iyi bir yol olup olmadığını merak ettim.

Git'e aşina değilseniz, git branch komutunun çıktısı, yerel makinenizde halihazırda teslim alınmış olanı işaretleyen bir yıldız işaretine sahip dalların bir listesidir. Örneğin:

> git branch
* drupal_authentication
fragment_caching
master

Öyleyse, düşündüm ki, çıktıyı sadece ayrıştırıp güncel olarak işaretlenmiş dalı ararsam:

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

Artık yerel makinemde geçerli olan dalı tek, paylaşılan, dağıtım komut dosyasıyla dağıtabiliyorum.


Bu güncellenmiş bağlantı: Capistrano ile şubeleri dağıtmak
wacko

Yanıtlar:


157

Bu, Capistrano> = 3.1 ile çalışır:

bu satırı şuraya ekle config/deploy.rb:

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

ve ardından kapistrano'yu şu şekilde arayın:

cap production deploy BRANCH=master

Bu çözüm Capistrano <3.1 ile çalışır:

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

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

4
Mustistage uzantısı kullanıyorsanız, ayarlamaya gerek yoktur env, ancak bu benim için sadece bir dal kullanarak çalıştı
Tom Harrison

@lulalala tarafından belirtildiği gibi , belirtilen dalı alması için küçük harf -s kullanmam gerekiyor.
Cihan

@Jani: Teşekkürler, yeni capistrano sürümlerinde bunu değiştirdiler, cevabımı buna göre düzenledim.
wintersolutions

@Jani'den tam tersi bir problem yaşadım: -S'yi büyük harfle yazmam gerekiyordu, yoksa onu elde etmek için fetch (: var_name, 'default') kullanırken argüman kapağa geçmiyordu.
Frederik Struck-Schøning

1
'-s' (--set) seçeneği, 'Tarifler yüklendikten sonra bir değişken ayarla' anlamına gelir. ve 'S' (--set-önce) seçeneği 'Tarifler yüklenmeden önce bir değişken ayarla' anlamına gelir.
Ramon Caldeira

33

Capistrano 3.1.0+ kullanıldığında bunların hiçbiri artık benim için çalışmıyordu. Bunun yerine, yorumladıkları talimatlara göre:

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

Ama kullanmak istemezsin, yoksa seni askuyarır. Bunun yerine kullanmalısınız set. HEADen üstteki daldır; denildiği gibi 'kenar'. Eğer farklı bir dalını istiyorsanız, değiştirin HEAD: şube adı, örneğin birlikte master, stagingvb

Örneklerle bitirmek için, içinde /config/deploy/production.rbşu satırı ekleyebilirsiniz:

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

...veya

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

btw HEADvarsayılan ayardır, bu nedenle bunu dosyada gerçekten belirtmenize gerek yoktur. A'da daha iyi kullanılabilir /config/deploy/edge.rb.

In /config/deploy/staging.rb, bu çizgiyi şunları içerebilir:

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

...veya

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

Kaptın bu işi!

Umarım bu örnekler, capistrano'nun gelecekteki kullanıcılarına yardımcı olur


4
git rev-parse --abbrev-ref HEADHEAD'in hangi dalda olduğunu bulmak için kullanılır. çalıştırmak git rev-parse --abbrev-ref staging(neredeyse) her zaman çıktı verecektir staging. Sadece kullanabilirsin set :branch, 'staging'.
MiniGod

27

Çok aşamalı, aslında şimdi:

cap production deploy -s branch=my-branch

Önceki yazı sözdizimi ortamımda çalışmıyor


1
-s branch=fookapistrano değişken dalını footarifler yüklendikten sonra ayarlar
alvin

26

Aşağıdakilerin hala Başlık 3.11.0 13/10/18 ve Kapak 2'de çalıştığını doğrulayabilirim:

Deploy.rb / stage.rb içinde:

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

Komut satırında:

cap deploy BRANCH=featurex

Bu size varsayılan bir dal (farklı ortamlar için farklı olabilir) ve istediğiniz zaman dalları değiştirme olanağı sağlar.


15

Alternatif olarak, varsayılan bir şubeye ve ortama sahip olduğunuz komut satırından yapılandırabilirsiniz ve ayrıca kullanılacak ortamı ve şubeyi içerebilecek parametreleri sınır çağrısına geçirebilirsiniz. Bu açıkça aktarılan bir dal olabilir veya listelediğiniz bağlantıda açıklandığı gibi geçerli dalı gösteren bir parametreniz olabilir.

#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
...

Kod örneği buradan çokça ödünç alındı


3
-sBelirtilen şubeyi getirmesi için küçük harf kullanmam gerekiyor
lulalala

@Lulula'dan tam tersi bir problem yaşadım: -S'yi büyük harfle yazmam gerekiyordu, aksi takdirde, onu elde etmek için fetch (: var_name, 'default') kullanırken argümanın kapağa geçmemesi gerekiyordu.
Frederik Struck-Schøning

10

Capistrano çok aşamalı kullanıyorsanız , yalnızca

cap -s branch=$MY_BRANCH deploy

veya

cap -s branch=$MY_BRANCH production deploy

başka bir düzenleme yapmadan deploy.rb.


2
Öyle olmalı branch=, değil branch-.
Jimothy

3
OptionParser :: AmbiguousOption: belirsiz seçenek: -s
giorgio

8

Bu komut artık çalışmayacak:

cap deploy -s branch=your_branch

-sSCapistrano v3 + 'da bayrak desteği kaldırıldı.
Buradan daha fazlasını okuyabilirsiniz: link
Birkaç cevapta bahsedilmişti, ancak şu anda doğru değil.

Ne benim için çalışıyor:
in deploy.rbdosya eklenti

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

o zaman koş:

BRANCH=your_branch cap deploy

Ayrıca, bu komutu başarıyla çalıştırmak için ana dalda olmanız gerektiğini lütfen unutmayın.


3

Bu çözüm, Capistrano'nun tüm sürümleriyle çalışmalıdır.

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')

Kullanımı:

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

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

cap [staging] deploy
# => deploy default branch

2

3.3.5 sürümünü kullanıyorum ve bunu çalıştırıyorum:

set :branch, 'develop'

1

Genel cevap:

İçeriği ortamdan ortama değiştirilmiş bir ayar dosyanız varsa, bu satırı bir "şablon" ( @BRANCH_NAME@veya gibi değişken adını temsil eden bir dizeyle) yapmalısınız @ENV_NAME@.

Ardından, yapılandırma dosyanızı okuyabilen ve " @BRANCH_NAME@" değişkenini dağıtım işleminizin ihtiyaç duyduğu uygun değerle değiştirebilen (sürümü belirlenmiş) bir komut dosyanız olacaktır .



1

Capistrano 3 kullanıcıları için:

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

Yöntem 1: Dağıtım için aşamaya özel şubeyi (ör. Test, üretim) ayarlayın

branchYapılandırmayı 'deploy.rb' yerine aşama dosyalarına koyun ve o aşamanın dağıtılacağı hedef dalı ayarlayın.

İlişkili şube adı ile iki aşamalı bir uygulama için testve productionyapılandırma aşağıdaki gibi görünecektir,

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

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

Bu yöntem, aşamaya özel dallardan konuşlandırmayı sağlar. Bu nedenle, gerekli olan tek ek adım, en son kodu temel şubeden birleştirmek veya yeniden oluşturmaktır.

Yöntem 2: Doğrudan herhangi bir şubeden dağıtın (etiketi kullanarak)

Diğer bir yaklaşım, etiket kullanarak dağıtmaktır. Etiketi kullanarak dağıtmak için branchyapılandırmayı ayarlayın . 'deploy.rb'de aşağıdaki gibi,

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

Ayrıca, ilişkili etiket kalıbı eşleşirse (ör. /.*-test$/) CI'yı farklı aşamalara koşullu olarak dağıtılacak şekilde yapılandırın .

Artık herhangi bir şubeden dağıtım yapılabilir,

  • Öncelikle herhangi bir şubeden bir etiket oluşturun,

    git tag -a v0.1.0-test -m "Sürüm 0.1.0-test"

  • Ve itin

    git itme kaynağı v0.1.0-testi

Not: Yukarıdaki yöntemler Capistrano 3'e dayanmaktadır.


0
git rev-parse --abbrev-ref HEAD

tam olarak bulunduğunuz şubeye geri dönecektir.

Her zaman gpshyerine koyarımgit push -u origin branch_name

$ which gpsh
gpsh: aliased to git push -u origin `git rev-parse --abbrev-ref HEAD`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.