【问题标题】:How to Configure Capistrano to Deploy from Local Git Repository?如何配置 Capistrano 以从本地 Git 存储库进行部署?
【发布时间】:2011-07-28 18:54:15
【问题描述】:

我需要对下面的 deploy.rb 文件进行哪些更改才能使其从本地 git 存储库部署我的应用程序?如果我不能从本地仓库部署,我可以让 capistrano 使用工作副本吗?

set :application, "my_app"
set :repository, "."
set :local_repository, "file:///path/to/application/.git"
set :deploy_to, "/data/www/apps/#{application}"
set :deploy_via, :copy
set :copy_cache, true
set :user, "dane"
set :use_sudo, false

set :scm, :git # Should I change this to :none
set :branch, "master"

【问题讨论】:

    标签: ruby-on-rails git capistrano


    【解决方案1】:

    这很简单:

    set :scm, :none
    set :repository, "."
    set :deploy_via, :copy
    

    只需从项目的根目录运行 Capistrano。

    【讨论】:

    【解决方案2】:

    deploy_via, :copy 已在版本 3 中删除。

    https://github.com/capistrano/capistrano/issues/695

    在大多数情况下,您应该将代码放在 github 或 bitbucket 等在线存储库中,然后您只需在 deploy.rb 文件中设置这一行:

    set :repo_url, 'git@bitbucket.org:my_account/my_project.git'
    

    虽然如果您碰巧在要部署的远程服务器上也有一个存储库,那么您可以将 deploy.rb 文件中的该行更改为:

    set :repo_url, 'file:///home/deploy/bare_repo/my_project.git'
    

    请记住,三个正斜杠很重要,因为 file:// 告诉 capistrano 您正在查找文件,并且前面的斜杠需要指向根路径,类似于 /home/deploy/bare_repo/my_project.git

    【讨论】:

      【解决方案3】:
      set :repository, 'file:///path/to/your/git_repository'
      set :local_repository, "file://."
      set :scm, :git
      # set :deploy_via, :copy # you must comment it
      

      【讨论】:

        【解决方案4】:

        为我运行的 Capistrano 3 解决方案:

          before :deploy, :deploy_from_local_repo
        
          task :deploy_from_local_repo do
            set :repo_url,  "file:///tmp/.git"
            run_locally do
              execute "tar -zcvf /tmp/repo.tgz .git"
            end
            on roles(:all) do
              upload! '/tmp/repo.tgz', '/tmp/repo.tgz'
              execute 'tar -zxvf /tmp/repo.tgz -C /tmp'
            end
          end
        

        在部署之前,您要将 tar.gz 文件上传到服务器,解压缩并最终将 :repo_url 重置为文件模式。

        注意删除之前的回购:

        task :remove_repo do
          on roles(:all) do
            execute "rm -r #{repo_path}"
          end
        end
        

        【讨论】:

        • 这对我有用,除了我收到错误refs/stash does not point to a valid object!,直到我将 tar 命令更改为tar -zcvf /tmp/repo.tgz --exclude=.git/refs/stash .git。谢谢!
        【解决方案5】:

        我使用了@Ariejan 和@HungYuHei 的组合答案,这对我有用。

        set :deploy_via, :copy
        set :use_sudo, false    
        set :scm, "git"
        set :repository, "."
        set :local_repository, "."
        set :branch, "master"
        

        如果您使用本地副本(并且在 Github 上没有项目),那么在您的 deploy.rb 中禁用 :check_revision 任务也是明智之举,该任务检查远程是否与本地 git 同步。

        【讨论】:

        • 我收到以下fatal: No remote configured to list refs from.
        【解决方案6】:

        通常通过副本部署非常慢。 但是只有当 scm 不是 none 时 copy_cache 才可用(同步使用 scm) 这意味着从工作副本部署只能通过缓慢的副本来完成。 我设法从本地存储库中找到了一个快速的复制部署设置。 您仍然需要在本地提交更改,但不需要推送它们。

        set :scm, "git"
        set :local_repository, "file://."
        set :deploy_via, :copy
        # cache only seems to work if use scm
        set :copy_cache, true
        set :copy_via, :scp
        set :copy_exclude, [".zeus*", ".bundle", ".git", "tmp/*", "doc", "log/*", "fixtures/*"]
        

        不幸的是,它有时会神秘地中断:

        fatal: Could not parse object 'c438b9d1242cb311be43d681e3f89bc486d748ed'.`
        

        即使没有 scm 用于从工作副本部署到工作,理想情况下也应该实现本地缓存同步。添加到 capistrano 的强大功能

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-24
          • 2011-01-18
          相关资源
          最近更新 更多