programing

Capistrano를 사용하여 다른 깃 분기에서 배치

muds 2023. 8. 19. 10:55
반응형

Capistrano를 사용하여 다른 깃 분기에서 배치

저는 Capistrano를 사용하여 RoR 애플리케이션을 배포하고 있습니다.코드베이스는 깃 저장소에 있으며, 분기는 개발에 널리 사용됩니다. 피스트노사용법라카사법▁cap를 사용합니다.deploy.rb파일 설정, 그 중 하나가 배포할 분기입니다.

제 문제는 이것입니다. 마스터에서 새로운 지점 A를 만든다고 가정해 보겠습니다.배포 파일이 마스터 분기를 참조합니다.저는 A를 테스트 환경에 배포할 수 있도록 편집합니다.기능 작업을 마치고 A 지점마스터로 병합합니다.그 이후로deploy.rbA의 파일이 더 신선하고, 병합되고, 이제.deploy.rb마스터 분기 참조 A에서.다시 편집할 시간입니다.

수동 편집이 불필요해 보이는 경우가 많습니다. 매개 변수는 항상 현재 지점 이름과 일치해야 합니다.게다가 매번 설정을 편집하는 것을 잊기 쉽습니다.

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

편집: 누군가가 이미 제가 필요로 하는 작업을 수행한 것으로 나타났습니다.

오늘 아침 저는 Git 저장소의 분기를 스테이징 서버에 배포할 기회가 있었지만 방법을 전혀 몰랐습니다.카피스트라노 소스 코드를 빠르게 검색해보니 세트를 사용할 수 있었습니다.:branch "branch_name"내 배포 스크립트에서.제가 해봤는데 효과가 있었어요.그런 다음 모든 지점에서 유사한 변경을 해야 한다고 생각했습니다.물론, 저는 게으른 놈이고 더 좋은 방법이 없을까 생각했습니다.

git에 익숙하지 않은 경우 git branch 명령 출력은 로컬 컴퓨터에서 현재 체크아웃된 분기를 나타내는 별표와 함께 분기 목록입니다.예:

> git branch
* drupal_authentication
fragment_caching
master

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

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

이제 단일 공유 배포 스크립트를 통해 로컬 시스템에 현재 있는 모든 지점을 배포할 수 있습니다.

이것은 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")

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 }

그건 그렇고.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 }

알겠어요!

이러한 사례들이 향후 카피스트라노 사용자들에게 도움이 되길 바랍니다(^_^).

아래의 내용이 Cap 2 뿐만 아니라 Cap 3.11.0 13/10/18에서도 여전히 작동함을 확인할 수 있습니다.

deploy.rb / stage.rb에서:

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

명령줄에서:

cap deploy BRANCH=featurex

이렇게 하면 기본 분기(환경에 따라 다를 수 있음)와 원하는 때에 분기를 변경할 수 있습니다.

다단계에서는 다음과 같은 기능이 있습니다.

cap production deploy -s branch=my-branch

이전 게시 구문이 사용자 환경에서 작동하지 않는 경우

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

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

여기서 크게 차용한 코드 예제

카피스트라노 멀티스테이지를 사용하는 경우, 당신은 단지 실행하기만 하면 됩니다.

cap -s branch=$MY_BRANCH deploy

또는

cap -s branch=$MY_BRANCH production deploy

당신의 더 이상의 편집 없이.deploy.rb.

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

cap deploy -s branch=your_branch

『 』에 대한 지원-sSCapistrano v3+에서 플래그가 제거되었습니다.
여기에서 자세한 내용을 읽을 수 있습니다. 링크
몇 가지 답변에서 언급되었지만, 현재는 정확하지 않습니다.

것: 나게맞것는:
deploy.rb add

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

그런 다음 실행:

BRANCH=your_branch cap deploy

또한 이 명령을 성공적으로 실행하려면 마스터 분기에 있어야 합니다.

버전 3.3.5를 사용하고 있으며 다음 작업을 수행하고 있습니다.

set :branch, 'develop'

이 솔루션은 모든 버전의 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단계 파일에서 'deploy.dll' 대신 구성하고 배포할 단계의 대상 분기를 설정합니다.

이름이 결된단가이진 2계앱경우.test그리고.production다음과 표시됩니다.

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

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

이 방법을 사용하면 단계별 분기에서 배포할 수 있습니다.따라서 기본 분기에서 최신 코드를 병합하거나 기본 코드를 재배치하는 추가 단계만 필요합니다.

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

또 다른 접근 방식은 태그를 사용하여 배포하는 것입니다.태그를 사용하여 배포하려면branch설정합니다.다음과 같이 'deploy.dll'로 표시됩니다.

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을 기반으로 합니다.

일반적인 답변:

경우 을 "템플릿과 같은 .@BRANCH_NAME@또는@ENV_NAME@).

구성을 읽을 수 "" " 그다음구버파을성있수읽를는을다을생고 (" "전런된를하" "니합체교" "성트립" "스크일" "를▁the)" "(합니" "다ed체" "▁then▁able을" "런)" "그▁""를 대체합니다.@BRANCH_NAME@배포 프로세스에 필요한 적절한 값에 따라 달라집니다.

카피스트라노 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
git rev-parse --abbrev-ref HEAD

사용자가 정확히 있는 현재 분기를 클릭합니다.

상설정니다합항▁the를 설정합니다.gpshgit push -u origin branch_name

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

언급URL : https://stackoverflow.com/questions/1524204/using-capistrano-to-deploy-from-different-git-branches

반응형