Сведения о вопросе

MAT

07:58, 21st August, 2020

Теги

Развертывание подкаталога Git в Capistrano

Просмотров: 469   Ответов: 10

Мой главный макет ветви выглядит так:

/ <-- верхний уровень

/client <-- исходные файлы desktop client

/server <-- Rails приложение

Все , что я хотел бы сделать, это просто снять каталог /server в моем deploy.rb, но я не могу найти никакого способа сделать это. Каталог /client огромен, поэтому настройка крючка для копирования /server в / не будет работать очень хорошо, ему нужно только снять приложение Rails.



  Сведения об ответе

baggs

04:33, 2nd August, 2020

Без каких-либо грязных раздвоений, но еще грязнее !

В моем 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)


  Сведения об ответе

screen

09:12, 24th August, 2020

Для 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'

Весь важный код находится в методе strategy release , который использует git archive для архивации только подкаталога РЕПО, а затем использует аргумент --strip для tar для извлечения архива на нужном уровне.

UPDATE

Начиная с 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 .


  Сведения об ответе

JUST___

15:49, 5th August, 2020

Мы также делаем это с 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.


  Сведения об ответе

SEEYOU

17:11, 14th August, 2020

Вы можете иметь два репозитория git (клиент и сервер) и добавить их в "super-project" (приложение). В этом "super-project" вы можете добавить два репозитория в качестве подмодулей (см. Этот учебник ).

Другое возможное решение (немного более грязное) состоит в том, чтобы иметь отдельные ветви для клиента и сервера, а затем вы можете вытащить из ветви 'server'.


  Сведения об ответе

LIZA

23:06, 5th August, 2020

Решение есть. Возьмите патч crdlo'S для capistrano и источник capistrano от github. Удалите существующий capistrano gem, приложите патч, установите setup.rb, а затем вы можете использовать его очень простую строку конфигурации set :project, "mysubdirectory" для установки подкаталога.

Единственный подводный камень заключается в том, что видимо github не "support the archive command" ... по крайней мере, когда он ее писал. Я использую свой собственный частный РЕПО git над svn, и это работает нормально, я не пробовал его с github, но я думаю, что если достаточное количество людей жалуются, они добавят эту функцию.

Также посмотрите, можете ли вы заставить авторов capistrano добавить эту функцию в cap при соответствующей ошибке .


  Сведения об ответе

COOL

00:27, 2nd August, 2020

Для 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"


  Сведения об ответе

park

23:42, 26th August, 2020

К сожалению, git не дает возможности сделать это. Вместо этого 'git way' должен иметь два репозитория-клиент и сервер, и клонировать один(Ы), который вам нужен.


  Сведения об ответе

repe

11:32, 20th August, 2020

Я создал snipped, который работает с 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

Он также доступен в виде Gist на Github .


  Сведения об ответе

LIZA

01:44, 11th August, 2020

Похоже, что он также не работает с codebasehq.com, поэтому я в конечном итоге сделал задачи capistrano, которые очищают беспорядок :-) возможно, на самом деле есть менее банальный способ сделать это, переопределив некоторые задачи capistrano...


  Сведения об ответе

appple

02:58, 25th August, 2020

Это работает на меня уже несколько часов.

# 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" довольно слабо.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться