ruby-on-rails - stop - rails deploy puma
Развертывание подкаталога Git в Капистрано (7)
К сожалению, git не дает возможности сделать это. Вместо этого «git way» должен иметь два репозитория - клиент и сервер и клонировать то, которое вам нужно.
Моя главная структура ветви выглядит так:
/ <- верхний уровень
/ client <- исходные файлы клиентских компьютеров
/ сервер <- Rails приложение
То, что я хотел бы сделать, это просто вытащить каталог / server в моем deploy.rb
, но я не могу найти способ сделать это. Каталог / client является огромным, поэтому настройка крюка для копирования / сервера в / не будет работать очень хорошо, ему нужно только вытащить приложение Rails.
Есть решение. Захватите патч crdlo для capistrano и источник capistrano от github. Удалите существующий capistrano gem, примените патч, setup.rb install, а затем вы можете использовать его очень простой set :project, "mysubdirectory"
строк конфигурации set :project, "mysubdirectory"
чтобы установить подкаталог.
Единственная проблема заключается в том, что, по-видимому, github не «поддерживает команду архива» ... по крайней мере, когда он это написал. Я использую свою собственную приватную git-репо над svn, и она отлично работает, я не пробовал ее с github, но я предполагаю, что, если достаточно людей жалуются, они добавят эту функцию.
Также посмотрите, можете ли вы заставить авторов capistrano добавить эту функцию в cap при соответствующей ошибке .
Без каких-либо грязных действий, но даже грязнее!
В моем 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 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).
Давайте посмотрим, насколько он прочен. Использование «before» довольно слабое.
Мы также делаем это с помощью Capistrano, клонируя полный репозиторий, удаляя неиспользуемые файлы и папки и перемещая нужную папку вверх по иерархии.
deploy.rb
set :repository, "[email protected]: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.
Я создал отрезанный, который работает с Capistrano 3.x, основанный на предыдущих анверах и другой информации, найденной в 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
Он также доступен как Gist на Github .
Для 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 .