Развертывание подкаталога Git в Capistrano
мой главный макет ветви выглядит так:
/
/клиента
/ server
то, что я хотел бы сделать, это только вытащить каталог /server в моем deploy.rb
, но я не могу найти никакого способа сделать это. Каталог / client огромен, поэтому настройка крючка для копирования / server в / не будет работать очень хорошо, ему нужно только потянуть рельсы приложение.
10 ответов:
без каких-либо грязных действий разветвления, но еще грязнее !
в моей конфигурации / развертывания.РБ :
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
архивировать только подкаталог РЕПО, затем использует до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, клонируя вниз полный репозиторий, удаляя неиспользуемые файлы и папки и перемещая нужную папку вверх по иерархии.
развернуть.РБ
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 (клиент и сервер) и добавить их в "супер-проект" (приложение). В этом "супер-проекте" вы можете добавить два репозитория в качестве подмодулей (проверьте в этом уроке).
другое возможное решение (немного грязный) - отдельные ветки для клиента и сервера, а затем вы можете вытащить из "сервер" филиал.
к сожалению, git не дает возможности сделать это. Вместо этого "git way" должен иметь два репозитория-клиент и сервер, а также клонировать тот, который вам нужен.
есть решение. Возьмите crdlo это патч для Капистрано и источник Капистрано из github. Удалите существующий камень Капистрано, appy патч, настройка.rb установите, а затем вы можете использовать его очень простую строку конфигурации
set :project, "mysubdirectory"
для установки подкаталога.единственная загвоздка в том, что, по-видимому, github не "поддерживает команду архивирования" ... по крайней мере, когда он это писал. Я использую свой собственный частный git repo над svn, и он отлично работает, у меня нет пробовал это с 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"
похоже, что он также не работает codebasehq.com поэтому я закончил тем, что сделал задачи capistrano, которые очищают беспорядок :-) возможно, на самом деле есть менее хакерский способ сделать это, переопределив некоторые задачи capistrano...
Я создал обрезанный, который работает с Capistrano 3.x на основе предыдущих anwers и другой информации, найденной в github:
# 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.
это работает для меня в течение нескольких часов.
# 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'
вы можете объявить переменную для каталога (здесь rails_app).
давайте посмотрим, насколько он надежен. Использование "до" довольно слабо.