Capistrano에서 Git 하위 디렉터리 배포
내 마스터 브랜치 레이아웃은 다음과 같습니다.
/ <-최상위
/ client <-데스크톱 클라이언트 소스 파일
/ server <-Rails 앱
내가하고 싶은 것은 내 deploy.rb
. / client 디렉토리는 방대하므로 / server를 /에 복사하는 후크를 설정하는 것은 잘 작동하지 않으며 Rails 앱을 풀다운하기 만하면됩니다.
더러워진 포크 동작 없이도 더러워졌습니다!
내 config / deploy.rb에서 :
set :deploy_subdir, "project/subdir"
그런 다음이 새로운 전략을 내 Capfile에 추가했습니다.
require 'capistrano/recipes/deploy/strategy/remote_cache'
class RemoteCacheSubdir < Capistrano::Deploy::Strategy::RemoteCache
private
def repository_cache_subdir
if configuration[:deploy_subdir] then
File.join(repository_cache, configuration[:deploy_subdir])
else
repository_cache
end
end
def copy_repository_cache
logger.trace "copying the cached version to #{configuration[:release_path]}"
if copy_exclude.empty?
run "cp -RPp #{repository_cache_subdir} #{configuration[:release_path]} && #{mark}"
else
exclusions = copy_exclude.map { |e| "--exclude=\"#{e}\"" }.join(' ')
run "rsync -lrpt #{exclusions} #{repository_cache_subdir}/* #{configuration[:release_path]} && #{mark}"
end
end
end
set :strategy, RemoteCacheSubdir.new(self)
Capistrano 3.0의 경우 다음을 사용합니다.
내 Capfile
:
# Define a new SCM strategy, so we can deploy only a subdirectory of our repo.
module RemoteCacheWithProjectRootStrategy
def test
test! " [ -f #{repo_path}/HEAD ] "
end
def check
test! :git, :'ls-remote', repo_url
end
def clone
git :clone, '--mirror', repo_url, repo_path
end
def update
git :remote, :update
end
def release
git :archive, fetch(:branch), fetch(:project_root), '| tar -x -C', release_path, "--strip=#{fetch(:project_root).count('/')+1}"
end
end
그리고 내 deploy.rb
:
# Set up a strategy to deploy only a project directory (not the whole repo)
set :git_strategy, RemoteCacheWithProjectRootStrategy
set :project_root, 'relative/path/from/your/repo'
모든 중요한 코드는 전략 release
메소드에 있습니다.이 방법 git archive
은 저장소의 하위 디렉토리 만 아카이브 하는 데 사용하고 --strip
인수를 사용 tar
하여 올바른 수준에서 아카이브를 추출합니다.
최신 정보
Capistrano 3.3.3부터 이제 :repo_tree
구성 변수를 사용할 수 있으므로이 답변은 쓸모 없게됩니다. 예를 들면 :
set :repo_url, 'https://example.com/your_repo.git'
set :repo_tree, 'relative/path/from/your/repo' # relative path to project root in repo
http://capistranorb.com/documentation/getting-started/configuration을 참조 하십시오 .
또한 Capistrano를 사용하여 전체 저장소를 복제하고 사용하지 않는 파일과 폴더를 삭제하고 원하는 폴더를 계층 구조 위로 이동합니다.
deploy.rb
set :repository, "git@github.com:name/project.git"
set :branch, "master"
set :subdir, "server"
after "deploy:update_code", "deploy:checkout_subdir"
namespace :deploy do
desc "Checkout subdirectory and delete all the other stuff"
task :checkout_subdir do
run "mv #{current_release}/#{subdir}/ /tmp && rm -rf #{current_release}/* && mv /tmp/#{subdir}/* #{current_release}"
end
end
프로젝트가 너무 커지지 않는 한 이것은 우리에게 잘 작동하지만 가능하다면 각 구성 요소에 대한 자체 저장소를 만들고 git 하위 모듈과 함께 그룹화하십시오.
두 개의 git 저장소 (클라이언트 및 서버)를 갖고이를 "수퍼 프로젝트"(앱)에 추가 할 수 있습니다. 이 "수퍼 프로젝트"에서 두 개의 저장소를 하위 모듈로 추가 할 수 있습니다 ( 이 자습서 확인 ).
또 다른 가능한 해결책 (좀 더 더러운)은 클라이언트와 서버에 대해 별도의 분기를 갖는 것입니다. 그런 다음 '서버'분기에서 가져올 수 있습니다.
해결책이 있습니다. capistrano에 대한 crdlo의 패치 와 github 에서 capistrano 소스를 가져옵니다. 기존 capistrano gem을 제거하고 패치를 적용하고 setup.rb를 설치 한 다음 그의 매우 간단한 구성 줄 set :project, "mysubdirectory"
을 사용하여 하위 디렉토리를 설정할 수 있습니다 .
유일한 문제는 github가 적어도 그가 작성했을 때 "아카이브 명령을 지원"하지 않는다는 것입니다. 나는 svn을 통해 내 개인 git repo를 사용하고 있으며 잘 작동하지만 github로 시도하지 않았지만 충분한 사람들이 해당 기능을 추가 할 것이라고 불평한다면 상상합니다.
또한 capistrano 작성자가이 기능을 관련 버그의 cap 에 추가하도록 할 수 있는지 확인하십시오 .
Capistrano 3의 경우 @Thomas Fankhauser 답변을 기반으로 :
set :repository, "git@github.com:name/project.git"
set :branch, "master"
set :subdir, "relative_path_to_my/subdir"
namespace :deploy do
desc "Checkout subdirectory and delete all the other stuff"
task :checkout_subdir do
subdir = fetch(:subdir)
subdir_last_folder = File.basename(subdir)
release_subdir_path = File.join(release_path, subdir)
tmp_base_folder = File.join("/tmp", "capistrano_subdir_hack")
tmp_destination = File.join(tmp_base_folder, subdir_last_folder)
cmd = []
# Settings for my-zsh
# cmd << "unsetopt nomatch && setopt rmstarsilent"
# create temporary folder
cmd << "mkdir -p #{tmp_base_folder}"
# delete previous temporary files
cmd << "rm -rf #{tmp_base_folder}/*"
# move subdir contents to tmp
cmd << "mv #{release_subdir_path}/ #{tmp_destination}"
# delete contents inside release
cmd << "rm -rf #{release_path}/*"
# move subdir contents to release
cmd << "mv #{tmp_destination}/* #{release_path}"
cmd = cmd.join(" && ")
on roles(:app) do
within release_path do
execute cmd
end
end
end
end
after "deploy:updating", "deploy:checkout_subdir"
불행히도 git은이를 수행 할 방법을 제공하지 않습니다. 대신 'git 방식'은 클라이언트와 서버라는 두 개의 저장소를 가지고 필요한 저장소를 복제하는 것입니다.
이전 답변 및 github에서 찾은 기타 정보를 기반으로 Capistrano 3.x에서 작동하는 snipped를 만들었습니다.
# Usage:
# 1. Drop this file into lib/capistrano/remote_cache_with_project_root_strategy.rb
# 2. Add the following to your Capfile:
# require 'capistrano/git'
# require './lib/capistrano/remote_cache_with_project_root_strategy'
# 3. Add the following to your config/deploy.rb
# set :git_strategy, RemoteCacheWithProjectRootStrategy
# set :project_root, 'subdir/path'
# Define a new SCM strategy, so we can deploy only a subdirectory of our repo.
module RemoteCacheWithProjectRootStrategy
include Capistrano::Git::DefaultStrategy
def test
test! " [ -f #{repo_path}/HEAD ] "
end
def check
test! :git, :'ls-remote -h', repo_url
end
def clone
git :clone, '--mirror', repo_url, repo_path
end
def update
git :remote, :update
end
def release
git :archive, fetch(:branch), fetch(:project_root), '| tar -x -C', release_path, "--strip=#{fetch(:project_root).count('/')+1}"
end
end
Github 에서 Gist로도 사용할 수 있습니다 .
Looks like it's also not working with codebasehq.com so I ended up making capistrano tasks that cleans the mess :-) Maybe there's actually a less hacky way of doing this by overriding some capistrano tasks...
This has been working for me for a few hours.
# Capistrano assumes that the repository root is Rails.root
namespace :uploads do
# We have the Rails application in a subdirectory rails_app
# Capistrano doesn't provide an elegant way to deal with that
# for the git case. (For subversion it is straightforward.)
task :mv_rails_app_dir, :roles => :app do
run "mv #{release_path}/rails_app/* #{release_path}/ "
end
end
before 'deploy:finalize_update', 'uploads:mv_rails_app_dir'
You might declare a variable for the directory (here rails_app).
Let's see how robust it is. Using "before" is pretty weak.
참고URL : https://stackoverflow.com/questions/29168/deploying-a-git-subdirectory-in-capistrano
'developer tip' 카테고리의 다른 글
std :: __ cxx11 :: string을 std :: string으로 변환 (0) | 2020.11.17 |
---|---|
Visual Studio에서 푸시되지 않은 나가는 커밋을 제거하는 방법은 무엇입니까? (0) | 2020.11.17 |
드롭 다운 목록 제어 (0) | 2020.11.17 |
n 개의 마지막 행에서 mysql 선택 (0) | 2020.11.17 |
Clojure XML 구문 분석 (0) | 2020.11.17 |