capistrano를 사용하여 다른 git 브랜치에서 배포


125

Capistrano를 사용하여 RoR 응용 프로그램을 배포하고 있습니다. 코드베이스는 git 저장소에 있으며 분기는 개발에 널리 사용됩니다. Capistrano는 deploy.rb설정에 파일을 사용하며 그중 하나는 배포 할 분기입니다.

내 문제는 이것이다 : master 에서 새 분기 A 를 만든다고 가정 해 봅시다 . 배포 파일은 마스터 브랜치 를 참조 합니다. 나는 그것을 편집하여 A 를 테스트 환경에 배포 할 수 있습니다. 기능 작업을 마치고 분기 Amaster에 병합 합니다. A 의 파일 이 더 최신이므로 병합되고 이제 in master 브랜치가 A를 참조합니다 .deploy.rbdeploy.rb 합니다. 다시 편집 할 시간입니다.

겉보기에는 불필요한 수동 편집이 많이 필요합니다. 매개 변수는 항상 현재 브랜치 이름과 일치해야합니다. 또한 매번 설정을 편집하는 것을 잊기 쉽습니다.

이 프로세스를 자동화하는 가장 좋은 방법은 무엇입니까?

편집 : 누군가 내가 필요한 것을 이미 정확히했다고 밝혀 졌습니다 .

오늘 아침 나는 스테이징 서버에 git 저장소의 브랜치를 배포 할 기회가 있었지만 그 방법을 가장 잘 알지 못했습니다. 카피 스트라 노 소스 코드를 빠르게 검색 한 결과 :branch "branch_name"배포 스크립트에서 set 를 사용할 수 있음이 드러났습니다 . 나는 그것을 시도하고 작동했습니다. 그런 다음 모든 지점에서 비슷한 변경을해야한다고 생각했습니다. 물론 나는 게으른 잔디이고 더 좋은 방법이 없는지 궁금했다.

git에 익숙하지 않은 경우 git branch 명령의 출력은 로컬 머신에서 현재 체크 아웃 된 항목을 표시하는 별표가있는 분기 목록입니다. 예를 들면 :

> git branch
* drupal_authentication
fragment_caching
master

그래서 나는 방금 출력을 구문 분석하고 현재로 표시된 분기를 검색하면 어떻게 될까 생각했습니다.

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

이제 단일 공유 배포 스크립트에서 내 로컬 컴퓨터에 현재 브랜치를 배포 할 수 있습니다.


이 업데이트 된 링크입니다 : 카피 스트라 노에 배포 지점
미친

답변:


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
mustistage 확장, 설정할 필요를 사용하는 경우 env, 그러나 이것은 단지 지점을 사용하여 나를 위해 일한
톰 해리슨

@lulalala 에서 언급했듯이 지정된 분기를 가져 오려면 소문자 -s를 사용해야합니다.
Jahan

@Jani : 고마워, 그들이 새로운 카피 스트라 노 릴리스에서 그에 따라 내 대답을 편집했다고 변경 한 것 같습니다.
wintersolutions

@Jani와는 정반대의 문제가있었습니다. 대문자 -S를 사용해야했습니다. 그렇지 않으면 fetch (: var_name, 'default')를 사용하여 인수가 캡으로 전달되지 않습니다.
Frederik Struck-Schøning 2014 년

1
옵션 '-s'(-set)는 '레시피가로드 된 후 변수 설정'을 의미합니다. 옵션 'S'(-set-before)는 '레시피가로드되기 전에 변수 설정'을 의미합니다.
Ramon Caldeira 2014

33

Capistrano 3.1.0 이상을 사용하면이 중 어느 것도 더 이상 작동하지 않았습니다. 대신 주석이 달린 지침에 따라 :

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

그러나 사용하고 싶지 ask않거나 메시지가 표시됩니다. 대신 set. HEAD가장 높은 지점입니다. '가장자리'라고합니다. 다른 지점을 원하는 경우, 교체 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가 켜져 있는지 알아내는 데 사용됩니다. running git rev-parse --abbrev-ref staging은 (거의) 항상 출력 staging합니다. 그냥 사용할 수 있습니다 set :branch, 'staging'.
MiniGod 2014-12-05

27

다단계를 사용하면 실제로 다음과 같습니다.

cap production deploy -s branch=my-branch

이전 게시물 구문이 내 환경에서 작동하지 않습니다.


1
-s branch=foofoo레시피가로드 된 후 capistrano 변수 분기를 설정합니다.
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

또는 기본 분기 및 환경이있는 명령 줄에서 구성 할 수 있으며 사용할 환경 및 분기를 포함 할 수있는 cap 호출에 매개 변수를 전달할 수도 있습니다. 이것은 명시 적으로 전달 된 분기이거나 나열한 링크에 설명 된대로 현재 분기를 나타내는 매개 변수를 가질 수 있습니다.

#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 2014 년


8

이 명령은 더 이상 작동하지 않습니다.

cap deploy -s branch=your_branch

-sS플래그에 대한 지원 은 capistrano v3 +에서 제거되었습니다.
여기에서 더 많은 것을 읽을 수 있습니다. link
몇 가지 답변에서 언급되었지만 현재는 정확하지 않습니다.

무엇이 나를 위해 작동 :
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@"변수를 배포 프로세스에 필요한 적절한 값으로 바꿀 수있는 (버전 지정) 스크립트를 갖게 됩니다.



1

카피 스트라 노 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'의 무대 파일에 구성과에서 배포하는 그 단계에 대한 목표 지점을 설정합니다.

관련 지점 이름으로 2 단계 앱 testproduction구성은 다음과 같을 것입니다,

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

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

이 방법을 사용하면 단계별 분기에서 배포 할 수 있습니다. 따라서 필요한 추가 단계는 기본 브랜치의 최신 코드를 병합하거나 리베이스하는 것입니다.

방법 2 : 모든 분기에서 직접 배포 (태그 사용)

또 다른 접근 방식은 태그를 사용하여 배포하는 것입니다. 태그를 사용하여 배포하려면 branchconfig. 다음과 같이 'deploy.rb'에서

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

또한 연결된 태그 패턴이 일치하는 경우 조건부로 다른 단계에 배포하도록 CI를 구성합니다 (예 :) /.*-test$/.

이제 모든 지점에서 배포 할 수 있습니다.

  • 먼저 브랜치에서 태그를 생성하고

    git tag -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.