如何配置 Capistrano 以从本地 Git 存储库进行部署?

Posted

技术标签:

【中文标题】如何配置 Capistrano 以从本地 Git 存储库进行部署?【英文标题】:How to Configure Capistrano to Deploy from Local Git Repository? 【发布时间】: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"

【问题讨论】:

【参考方案1】:

这很简单:

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

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

【讨论】:

+1。但是,在 capistrano v 2.12.0 中,我还必须这样做 set :local_repository, "." FWIW, :scip, :none 从第 3 章中消失了:github.com/capistrano/capistrano/issues/777【参考方案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 的强大功能

【讨论】:

以上是关于如何配置 Capistrano 以从本地 Git 存储库进行部署?的主要内容,如果未能解决你的问题,请参考以下文章

使用 capistrano 从不同的 git 分支进行部署

ruby Capistrano部署策略支持git子模块(需要Capistrano v3.1.0或更高版本)

加速资产:使用 Rails 3.1/3.2 Capistrano 部署预编译

如何使用 capistrano deploy 定位特定的提交 SHA

在 Capistrano 中部署 Git 子目录

如何配置 capistrano 以使用我的 rvm 版本的 Ruby