Ruby 在我更改存储库URL后,Capistrano部署失败
我有一个从Git存储库通过capistrano进行的简单部署。起初我正在部署FormGithub,一切都很好。但后来我把我的存储库移到了BitBucket,现在我得到了Ruby 在我更改存储库URL后,Capistrano部署失败,ruby,deployment,capistrano,Ruby,Deployment,Capistrano,我有一个从Git存储库通过capistrano进行的简单部署。起初我正在部署FormGithub,一切都很好。但后来我把我的存储库移到了BitBucket,现在我得到了 fatal: Could not parse object '9cfb...'. 一旦我改变,问题就消失了 set :deploy_via, :remote_cache 到 但这并不能解决问题,只能绕过它。有什么办法可以让capistrano直接删除旧缓存吗?我得说我不确定,因为我还没有测试过,但这应该可以: cap dep
fatal: Could not parse object '9cfb...'.
一旦我改变,问题就消失了
set :deploy_via, :remote_cache
到
但这并不能解决问题,只能绕过它。有什么办法可以让capistrano直接删除旧缓存吗?我得说我不确定,因为我还没有测试过,但这应该可以:
cap deploy:cleanup -s keep_releases=0
因为它会擦除服务器上的每个版本(缓存)
显然,您还需要删除
共享/缓存副本
,因为根据下面的评论,上面的Capistrano调用似乎不会清除该副本。Capistrano 2.X
使用新地址删除并重新克隆回购协议:
cd $deploy_to/shared
rm -rf cached-copy
git clone ssh://git@example.org/new/repo.git cached-copy
修改您的config/deploy.rb
以使用新的回购协议:
set :repository, "ssh://git@example.org/new/repo.git"
set :scm, :git
set :deploy_via, :remote_cache
再次部署:
cap deploy
Capistrano 3.X
$deploy\u to/repo
目录config/deploy.rb
(与2.X相同)cap部署
我在
deploy.rb
中解决了这个问题:
namespace :deploy do
task :cope_with_git_repo_relocation do
run "if [ -d #{shared_path}/cached-copy ]; then cd #{shared_path}/cached-copy && git remote set-url origin #{repository}; else true; fi"
end
end
before "deploy:update_code", "deploy:cope_with_git_repo_relocation"
它会使部署速度稍慢,因此,一旦您确信所有部署目标都已赶上进度,就应该删除它。最简单的方法就是将repo url更改为Web服务器上共享/缓存副本目录中.git/config中的新url。然后,您可以像往常一样进行正常部署。取决于您的版本Capistrano 3不同于它以前的版本:
在这里阅读我的原始答案以及如何解决类似问题Capistrano 2及以下版本 SSH连接到服务器并更新部署文件夹的
/shared/cached copy/.git/config
中的repo,或者只删除/shared/cached copy
Capistrano 3及以上
SSH连接到服务器,并在部署文件夹的/repo/config
中更新repo
选中您需要更改/shared/cached copy文件夹中的git源文件
cd /var/www/your-project/production/shared/cached-copy
git remote remove origin
git remote add origin git@bitbucket.org:/origin.git
尝试cap production deploy如果您需要执行大量回购,您可能需要为其添加任务 对于capistrano 3,您可以在deploy.rb中添加此任务
desc "remove remote git cache repository"
task :remove_git_cache_repo do
on roles(:all) do
execute "cd #{fetch(:deploy_to)} && rm -Rf repo"
end
end
然后在每个阶段运行一次:
cap testing remove_git_cache_repo
以下是Capistrano3版本的内容。在每台服务器上执行答案建议的操作可能会很乏味 所以把这个放到
deploy.rb
中,然后运行capdeploy:fix\u repo\u origin
namespace :deploy do
desc 'Fix repo origin, for use when changing git repo URLs'
task :fix_repo_origin do
on roles(:web) do
within repo_path do
execute(:git, "remote set-url origin #{repo_url}")
end
end
end
end
对于Capistrano 3.0+
desc "remove remote git cache repository"
task :remove_git_cache_repo do
on roles(:all) do
execute "cd #{fetch(:deploy_to)} && rm -Rf repo"
end
end
这并没有完全解决问题,但一旦我删除了
共享/缓存副本
,它现在就可以部署了。它对我也不起作用,但Jakub在这里的评论起了作用。你只需在共享/缓存副本
目录中将origin remote的url更改为新的repo地址即可。答案仅删除服务器上的所有版本(包括当前)。最佳答案(如果远程缓存处于活动状态)是Jakub Arnold的。由于Capistrano 3,你必须删除/repo
,而不是共享/缓存副本
。编辑:看,我认为这是更好的答案。如果你删除所有版本,如果你的新部署失败并且你无法回滚,那么你基本上处于糟糕状态。我还认为值得注意的是,手动克隆repo是错误的只需将主机添加到已知主机即可。如果已经添加了主机,则部署将起作用(因此本质上与第一次设置capistrano时相同,签出repo anywhere只是为了添加主机)@KennyLövrin是的,在任何地方克隆repo都会使您的主机进入已知主机,但是如果您有:删除缓存集,您需要缓存副本目录中的某些内容,否则capistrano将不会部署。请记住,capistrano 3.1使用共享/repo
而不是共享/缓存副本,所以这个答案几乎正确t、 应该更新。在capistrano 3.2.1中,我解决了删除$deploy\u to/repo
文件夹的问题,因为我在shared
中找不到任何repo
文件夹。这是一个更好的解决方案。假设/repo/config
路径到您的
(开头不清楚)