当前位置:  开发笔记 > 运维 > 正文

在Capistrano中部署Git子目录

如何解决《在Capistrano中部署Git子目录》经验,为你挑选了3个好方法。

我的主分支布局是这样的:

/ < - 顶级

/ client < - 桌面客户端源文件

/ server < - Rails app

我想做的只是拉下我的/ server目录deploy.rb,但我似乎找不到任何办法./ client目录很大,因此设置一个钩子来复制/服务器到/将无法正常工作,它只需要拉下Rails应用程序.



1> thodg..:

没有任何脏的分叉动作,但更脏!

在我的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)


哦,我多么希望能给你送几品脱的啤酒.谢谢!!
完善.正是我需要的.谢谢!

2> 小智..:

对于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仅用于存档repo的子目录,然后使用该--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.


我还需要复制并粘贴原始的"fetch_revision"方法.(https://github.com/capistrano/capistrano/blob/master/lib/capistrano/git.rb)
:repo_tree实际上是在3.3.3而不是3.1中添加的.对于那些看到这个并且它不适合他们的人.

3> Thomas Fankh..:

我们还通过克隆整个存储库,删除未使用的文件和文件夹并在层次结构中向上移动所需的文件夹,与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子模块将它们组合在一起.


为了更有效的方法.有人创建了一个添加部署策略"copy_subdir"的gem.仅归档repo中的子目录并将其复制到远程服务器.https://github.com/yyuu/capistrano-copy-subdir
推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有