Menggunakan capistrano untuk menerapkan dari cabang git yang berbeda

125

Saya menggunakan capistrano untuk menyebarkan aplikasi RoR. Basis kode ada dalam repositori git, dan percabangan banyak digunakan dalam pengembangan. Capistrano menggunakan deploy.rbfile untuk pengaturannya, salah satunya adalah cabang untuk digunakan.

Masalah saya adalah ini: katakanlah saya membuat cabang A baru dari master . File penerapan akan mereferensikan cabang master . Saya mengeditnya, sehingga A dapat digunakan untuk menguji lingkungan. Saya selesai mengerjakan fitur tersebut, dan menggabungkan cabang A menjadi master . Karena deploy.rbfile dari A lebih baru, itu akan digabungkan dan sekarang deploy.rbdalam referensi cabang master A . Saatnya mengedit lagi.

Itu banyak dari pengeditan manual yang tampaknya tidak perlu - parameter harus selalu cocok dengan nama cabang saat ini. Selain itu, Anda dapat dengan mudah lupa mengedit pengaturan setiap saat.

Apa cara terbaik untuk mengotomatiskan proses ini?

Sunting: Ternyata seseorang telah melakukan apa yang saya butuhkan :

Pagi ini saya memiliki kesempatan untuk menerapkan cabang repositori git ke server pementasan tetapi tidak tahu caranya. Pencarian cepat melalui kode sumber capistrano mengungkapkan bahwa saya dapat menggunakan set :branch "branch_name"dalam skrip penerapan saya. Saya mencobanya dan berhasil. Saya kemudian berpikir bahwa saya perlu melakukan perubahan serupa di semua cabang saya. Tentu saja, saya orang yang malas dan bertanya-tanya apakah tidak ada cara yang lebih baik.

Jika Anda tidak terbiasa dengan git, output dari perintah git branch adalah daftar cabang dengan tanda asterisk yang saat ini diperiksa di mesin lokal Anda. Sebagai contoh:

> git branch
* drupal_authentication
fragment_caching
master

Jadi, saya pikir, bagaimana jika saya baru saja mem-parsing output dan mencari cabang yang ditandai sebagai saat ini:

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

Sekarang saya dapat menerapkan cabang apa pun yang ada di mesin lokal saya dari satu skrip penerapan bersama.

Toms Mikoss
sumber
Ini adalah tautan yang diperbarui: Menyebarkan cabang dengan Capistrano
wacko

Jawaban:

157

Ini bekerja dengan Capistrano> = 3.1:

tambahkan baris ini ke config/deploy.rb:

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

lalu panggil capistrano dengan:

cap production deploy BRANCH=master

Solusi ini bekerja dengan Capistrano <3.1:

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

set :branch, fetch(:branch, "master")
set :env, fetch(:env, "production")
resolusi musim dingin
sumber
4
Jika menggunakan ekstensi mustistage, tidak perlu disetel env, tetapi ini berfungsi untuk saya hanya menggunakan cabang
Tom Harrison
seperti yang dinyatakan oleh @lulalala saya perlu menggunakan huruf kecil -s agar dapat mengambil cabang yang ditentukan.
Jahan
@ Jani: Terima kasih, tampaknya mereka mengubahnya di rilis capistrano yang lebih baru, saya mengedit jawaban saya sesuai.
wintersolutions
Saya memiliki masalah kebalikan dari @Jani: Saya harus huruf besar -S, atau argumen tidak akan lolos ke cap, saat menggunakan fetch (: var_name, 'default') untuk mendapatkannya.
Frederik Struck-Schøning
1
opsi '-s' (--set) berarti 'Setel variabel setelah resep dimuat.' dan opsi 'S' (--set-before) berarti 'Tetapkan variabel sebelum resep dimuat.'
Ramon Caldeira
33

Menggunakan Capistrano 3.1.0+, semua ini tidak berfungsi lagi untuk saya. Sebaliknya, menurut instruksi mereka yang berkomentar:

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

Tapi, Anda tidak ingin menggunakan askatau itu akan meminta Anda. Sebaliknya Anda harus menggunakan set. HEADadalah cabang paling atas; 'edge' seperti namanya. Jika Anda ingin cabang yang berbeda, ganti HEADdengan nama cabang Anda, misalnya: master, staging, dll

Untuk menyimpulkan dengan contoh, di /config/deploy/production.rb, Anda mungkin menyertakan baris ini:

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

...atau

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

btw, HEADadalah pengaturan default, jadi tidak perlu benar-benar menyatakannya dalam file. Dapat digunakan lebih baik di a/config/deploy/edge.rb .

Di /config/deploy/staging.rb, Anda mungkin menyertakan baris ini:

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

...atau

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

Anda mengerti!

Saya harap contoh-contoh ini membantu pengguna capistrano di masa depan (^_^)

Eric Wanchic
sumber
4
git rev-parse --abbrev-ref HEADdigunakan untuk mengetahui cabang HEAD berada. menjalankan git rev-parse --abbrev-ref stagingakan (hampir) selalu menghasilkan staging. Anda bisa menggunakan set :branch, 'staging'.
MiniGod
27

Dengan multistage, sekarang:

cap production deploy -s branch=my-branch

Sintaks posting sebelumnya tidak berfungsi di lingkungan saya

David Hersey
sumber
1
-s branch=fooset cabang variabel capistrano foosetelah resep dimuat
alvin
26

Saya dapat mengonfirmasi bahwa di bawah ini masih berfungsi di Cap 3.11.0 13/10/18 serta Cap 2:

Di deploy.rb / stage.rb:

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

Di baris perintah:

cap deploy BRANCH=featurex

Ini memberi Anda cabang default (yang bisa berbeda untuk lingkungan yang berbeda), dan kemampuan untuk mengubah cabang kapan pun Anda mau.

Paul Odeon
sumber
15

Sebagai alternatif, Anda dapat menyusunnya dari baris perintah di mana Anda memiliki cabang dan lingkungan default dan juga Anda dapat meneruskan parameter ke panggilan topi yang dapat mencakup lingkungan dan cabang yang akan digunakan. Ini bisa menjadi cabang yang diteruskan secara eksplisit atau Anda bisa memiliki parameter yang akan menunjukkan cabang saat ini seperti yang dijelaskan dalam tautan yang Anda daftarkan.

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

Contoh kode banyak dipinjam dari sini

naven87
sumber
3
Saya perlu menggunakan huruf kecil -sagar dapat mengambil cabang yang ditentukan
lulalala
Saya memiliki masalah yang berlawanan dari @lulula: Saya harus menggunakan huruf besar -S, atau jika argumen tidak akan lolos ke tutup, saat menggunakan fetch (: var_name, 'default') untuk mendapatkannya.
Frederik Struck-Schøning
10

Jika Anda menggunakan capistrano-multistage , Anda hanya perlu menjalankan

cap -s branch=$MY_BRANCH deploy

atau

cap -s branch=$MY_BRANCH production deploy

tanpa mengedit lebih lanjut ke Anda deploy.rb.

asimetris
sumber
2
Seharusnya branch=tidak branch-.
Jimothy
3
OptionParser :: AmbiguousOption: opsi ambigu: -s
giorgio
8

Perintah ini tidak akan berfungsi lagi:

cap deploy -s branch=your_branch

Dukungan untuk -sSbendera telah dihapus di capistrano v3 +.
Di sini Anda dapat membaca lebih lanjut tentang itu: tautan
Itu disebutkan dalam beberapa jawaban, tetapi saat ini tidak benar.

Apa yang berhasil untuk saya:
di deploy.rbadd file

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

lalu lari:

BRANCH=your_branch cap deploy

Juga harap perhatikan bahwa, untuk menjalankan perintah ini dengan sukses, Anda harus berada di cabang master.

SakyHank
sumber
3

Solusi ini harus bekerja dengan semua versi 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')

Pemakaian:

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

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

cap [staging] deploy
# => deploy default branch
Pablo Cantero
sumber
2

Saya menggunakan versi 3.3.5 dan ini berfungsi:

set :branch, 'develop'
David Rosa
sumber
1

Jawaban umum:

Jika Anda memiliki file pengaturan dengan konten yang dimodifikasi dari satu lingkungan ke lingkungan lainnya, Anda harus menjadikan baris itu sebagai "template" (dengan string yang mewakili nama variabel seperti @BRANCH_NAME@atau @ENV_NAME@).

Kemudian Anda akan memiliki skrip (berversi) yang dapat membaca file konfigurasi Anda, dan mengganti @BRANCH_NAME@variabel " " dengan nilai yang sesuai yang diperlukan oleh proses penerapan Anda.

VonC
sumber
1

Untuk pengguna 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
lfender6445.dll
sumber
1

Metode 1: Tetapkan cabang khusus tahap (mis. Pengujian, produksi) untuk penerapan

Letakkan branchkonfigurasi di file tahapan sebagai ganti 'deploy.rb' dan setel cabang target untuk tahap tersebut untuk diterapkan.

Untuk aplikasi dua tahap dengan nama cabang terkait testdan production, konfigurasinya akan terlihat seperti ini,

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

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

Metode ini memungkinkan untuk menyebarkan dari cabang khusus tahap. Jadi, hanya langkah tambahan yang diperlukan adalah menggabungkan atau mengubah basis kode terbaru dari cabang dasar.

Metode 2: Terapkan langsung dari cabang mana pun (menggunakan tag)

Pendekatan lain adalah menerapkan menggunakan tag. Untuk menerapkan menggunakan tag, setel branchkonfigurasinya. di 'deploy.rb' sebagai berikut,

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

Dan, konfigurasikan CI untuk menerapkan secara bersyarat ke tahapan yang berbeda jika pola tag terkait cocok (misalnya /.*-test$/).

Sekarang, penerapan dapat dilakukan dari cabang mana pun,

  • Pertama, buat tag dari cabang mana saja,

    git tag -a v0.1.0-test -m "Versi 0.1.0-test"

  • Dan, dorong

    git push origin v0.1.0-test

Catatan: Metode di atas didasarkan pada Capistrano 3.

Shakil
sumber
0
git rev-parse --abbrev-ref HEAD

akan mengembalikan cabang Anda saat ini.

Saya selalu mengatur gpshalih - alihgit push -u origin branch_name

$ which gpsh
gpsh: aliased to git push -u origin `git rev-parse --abbrev-ref HEAD`
TorvaldsDB
sumber