การใช้ capistrano เพื่อปรับใช้จาก git สาขาต่างๆ


125

ฉันใช้ capistrano เพื่อปรับใช้แอปพลิเคชัน RoR โค้ดเบสอยู่ในที่เก็บ git และมีการใช้การแยกย่อยในการพัฒนา Capistrano ใช้deploy.rbไฟล์สำหรับการตั้งค่าซึ่งหนึ่งในนั้นเป็นสาขาที่จะปรับใช้

ปัญหาของฉันคือ: สมมติว่าฉันจะสร้างสาขาใหม่จากต้นแบบ ไฟล์ปรับใช้จะอ้างอิงสาขาหลัก ฉันแก้ไขเพื่อให้สามารถปรับใช้Aเพื่อทดสอบสภาพแวดล้อม ฉันเสร็จสิ้นการทำงานเกี่ยวกับคุณลักษณะและผสานสาขาเข้าต้นแบบ ตั้งแต่ไฟล์จากคือสดจะได้รับการรวมอยู่ในและตอนนี้ในโทสาขาการอ้างอิง ได้เวลาแก้ไขอีกครั้ง.deploy.rbdeploy.rb

นั่นเป็นการแก้ไขด้วยตนเองที่ดูเหมือนไม่จำเป็นจำนวนมาก - พารามิเตอร์ควรตรงกับชื่อสาขาปัจจุบันเสมอ ยิ่งไปกว่านั้นมันเป็นเรื่องง่ายที่จะลืมแก้ไขการตั้งค่าทุกครั้ง

อะไรคือวิธีที่ดีที่สุดในการทำให้กระบวนการนี้เป็นไปโดยอัตโนมัติ

แก้ไข:ปรากฎว่ามีคนทำสิ่งที่ฉันต้องการแล้ว :

เช้านี้ฉันมีโอกาสปรับใช้สาขาของที่เก็บ git ไปยังเซิร์ฟเวอร์การจัดเตรียม แต่ไม่ได้มีความคิดที่ชัดเจนที่สุดว่าจะทำอย่างไร การค้นหาอย่างรวดเร็วผ่านซอร์สโค้ด capistrano พบว่าฉันสามารถใช้ set :branch "branch_name"ในสคริปต์ปรับใช้ของฉันได้ ฉันลองแล้วและได้ผล จากนั้นฉันก็คิดว่าฉันจะต้องทำการเปลี่ยนแปลงที่คล้ายกันในทุกสาขาของฉัน แน่นอนว่าฉันเป็นคนขี้เกียจและสงสัยว่าไม่มีวิธีที่ดีกว่านี้

หากคุณไม่คุ้นเคยกับ git ผลลัพธ์ของคำสั่ง git branch คือรายการของสาขาที่มีเครื่องหมายดอกจันซึ่งทำเครื่องหมายรายการที่เช็คเอาต์ในเครื่องของคุณ ตัวอย่างเช่น:

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

จากนั้นเรียกคาปิสตราโนด้วย:

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
หากใช้ส่วนขยาย mustistage ไม่จำเป็นต้องตั้งค่าenvแต่สิ่งนี้ใช้ได้กับฉันเพียงแค่ใช้สาขา
Tom Harrison

ตามที่ระบุไว้โดย@lulalalaฉันจำเป็นต้องใช้ตัวพิมพ์เล็ก -s เพื่อที่จะดึงสาขาที่ระบุ
Jahan

@Jani: ขอบคุณดูเหมือนว่าพวกเขาเปลี่ยนไปในรุ่นใหม่ของ capistrano ฉันแก้ไขคำตอบตามนั้น
wintersolutions

ฉันมีปัญหาตรงข้ามกับ @Jani: ฉันต้องใช้ตัวพิมพ์ใหญ่ -S, ออเรลเซว่าอาร์กิวเมนต์จะไม่ผ่านไปยังขีด จำกัด เมื่อใช้การดึงข้อมูล (: var_name, 'default') เพื่อรับมัน
Frederik Struck-Schøning

1
option '-s' (--set) ย่อมาจาก 'Set a variable after the formula are loaded' และตัวเลือก 'S' (--set-before) หมายถึง 'ตั้งค่าตัวแปรก่อนโหลดสูตรอาหาร'
Ramon Caldeira

33

การใช้ Capistrano 3.1.0+ สิ่งเหล่านี้ไม่ได้ผลสำหรับฉันอีกต่อไป ตามคำแนะนำที่แสดงความคิดเห็นแทน:

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

แต่คุณไม่ต้องการใช้มิaskฉะนั้นจะแจ้งให้คุณทราบ แต่คุณควรใช้set. HEADเป็นสาขาที่มากที่สุดอันดับต้น ๆ 'edge' ตามที่เรียก หากคุณต้องการเป็นสาขาที่แตกต่างกันแทนที่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 }

คุณเข้าใจแล้ว!

ฉันหวังว่าตัวอย่างเหล่านี้จะช่วยให้ผู้ใช้ capistrano ในอนาคต (^_^)


4
git rev-parse --abbrev-ref HEADใช้เพื่อค้นหาว่า HEAD สาขาใดเปิดอยู่ ทำงานgit rev-parse --abbrev-ref stagingประสงค์ (เกือบ) stagingเอาท์พุเสมอ คุณสามารถใช้set :branch, 'staging'.
MiniGod

27

ด้วยหลายขั้นตอนตอนนี้:

cap production deploy -s branch=my-branch

ไวยากรณ์ของโพสต์ก่อนหน้าไม่ทำงานในสภาพแวดล้อมของฉัน


1
-s branch=fooตั้งค่าสาขาตัวแปรคาปิสตราโนเป็นfooหลังจากโหลดสูตรอาหารแล้ว
alvin

26

ฉันสามารถยืนยันได้ว่าด้านล่างยังคงใช้งานได้ใน Cap 3.11.0 13/10/18 เช่นเดียวกับ Cap 2:

ใน deploy.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เพื่อที่จะดึงสาขาที่ระบุ
lulalala

ฉันมีปัญหาตรงข้ามอย่างแน่นอนมากกว่า @lulula: ฉันต้องตัวพิมพ์ใหญ่ -S ออเรลเซอาร์กิวเมนต์จะไม่ส่งผ่านไปยังขีด จำกัด เมื่อใช้ fetch (: var_name, 'default') เพื่อรับมัน
Frederik Struck-Schøning

10

หากคุณใช้capistrano-multistageคุณจะต้องเรียกใช้เท่านั้น

cap -s branch=$MY_BRANCH deploy

หรือ

cap -s branch=$MY_BRANCH production deploy

โดยไม่ต้องแก้ไขไฟล์deploy.rb.


2
ที่ควรจะเป็นไม่ได้branch= branch-
Jimothy

3
OptionParser :: AmbiguousOption: ตัวเลือกที่ไม่ชัดเจน: -s
giorgio

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คอนฟิกูเรชันในไฟล์สเตจแทน 'deploy.rb' และตั้งค่าสาขาเป้าหมายสำหรับสเตจนั้นเพื่อปรับใช้

สำหรับแอปสองขั้นตอนที่มีชื่อสาขาที่เกี่ยวข้องtestและproductionการกำหนดค่าจะมีลักษณะดังนี้

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

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

วิธีนี้ช่วยให้สามารถปรับใช้จากสาขาเฉพาะสเตจ ดังนั้นขั้นตอนเพิ่มเติมที่จำเป็นเท่านั้นคือการรวมหรือสร้างรหัสใหม่ล่าสุดจากสาขาฐาน

วิธีที่ 2: ปรับใช้โดยตรงจากสาขาใดก็ได้ (โดยใช้แท็ก)

อีกวิธีหนึ่งคือการปรับใช้โดยใช้แท็ก เพื่อที่จะปรับใช้แท็กตั้งค่าbranchการกำหนดค่า ใน 'deploy.rb' ดังต่อไปนี้

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

และกำหนดค่า CI เพื่อปรับใช้ตามขั้นตอนต่างๆตามเงื่อนไขหากรูปแบบแท็กที่เกี่ยวข้องตรงกัน (เช่น/.*-test$/)

ตอนนี้การปรับใช้สามารถทำได้จากทุกสาขา

  • ขั้นแรกสร้างแท็กจากสาขาใดก็ได้

    แท็ก git -a v0.1.0-test -m "เวอร์ชัน 0.1.0-test"

  • และดัน

    git push origin 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`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.