如何配置 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 存储库进行部署?的主要内容,如果未能解决你的问题,请参考以下文章
ruby Capistrano部署策略支持git子模块(需要Capistrano v3.1.0或更高版本)
加速资产:使用 Rails 3.1/3.2 Capistrano 部署预编译