为什么capistrano总是使用git clone

时间:2012-07-28 03:17:57

标签: ruby-on-rails git capistrano

我有一些capistrano部署的基本问题。首先,我需要知道当git repo已经存在时,capistrano是否正在使用git clone,即使是第二个或第三个。如果它使用git pull会有任何问题吗?我在我的capfile中添加了set :deploy_via, :remote_cache。我问这个是因为我尝试在服务器的路径中添加一个新文件,而不是在git repo中添加,因为它是服务器特定的文件。下次我使用capistrano部署时,文件消失了。即使已经创建了一个git repo,似乎capistrano正在使用git clone。为什么cant capistrano不能使用git pull更新代码?

1 个答案:

答案 0 :(得分:6)

Capistrano在每个版本的realeases中创建一个新的子目录,如下所示

horse:releases xxx$ ls -lart
total 0
drwxrwxr-x  22 xxx  staff  748 Jun 26 20:08 20120626180809
drwxrwxr-x  22 xxx  staff  748 Jun 26 20:11 20120626181103
drwxrwxr-x  22 xxx  staff  748 Jun 26 20:29 20120626182908
drwxrwxr-x  22 xxx  staff  748 Jun 26 20:34 20120626183442
drwxrwxr-x  22 xxx  staff  748 Jun 26 20:35 20120626183525
drwxrwxr-x   8 xxx  staff  272 Jun 27 13:11 .
drwxrwxr-x  22 xxx  staff  748 Jun 27 13:11 20120627111102
drwxrwxr-x   5 xxx  staff  170 Jun 27 13:11 ..

然后简单地将符号链接设置为当前版本,如此

horse:deployed xxx$ ls -lart
total 8
drwxrwxr-x  4 xxx  staff  136 Jun 26 19:51 ..
drwxrwxr-x  7 xxx  staff  238 Jun 26 20:22 shared
drwxrwxr-x  8 xxx  staff  272 Jun 27 13:11 releases
lrwxrwxr-x  1 xxx  staff   70 Jun 27 13:11 current -> /Users/xxx/RailsDeployment/server/deployed/releases/20120627111102

这样,在服务器上回滚部署非常简单,因为您只需要将符号链接更改回上一个(工作)部署,但是每次使用git clone时都会创建一个新的完整子目录git pull。

如果您想拥有特定于服务器的文件,则必须在config / deploy.rb文件中添加capistrano部署任务,以便从app目录外的其他位置(通常是共享子文件夹)复制它。这样做的原因是部署应该是完全自动的,并记录自动过程中的所有必要步骤,而不是依赖于手动放在那里的服务器上的文件,因为这是snowflake server的第一步。因此,如果您需要的文件不是git存储库的一部分,通常包含生产密码,则需要更改config / deploy.rb以将此文件复制到您需要的位置。要查看如何执行此操作,请查看deploy.rb中的copy_db_credentials任务:

namespace :deploy do
  desc "cause Passenger to initiate a restart"
  task :restart do
    run "touch #{current_path}/tmp/restart.txt" 
  end
  desc "Copies database credentials"
  task :copy_db_credentials do
    run "cp #{shared_path}/credentials/database.yml #{current_path}/config/database.yml"
  end

  desc "reload the database with seed data"
  task :seed do
    run "cd #{current_path}; rake db:seed RAILS_ENV=#{rails_env}"
  end
end
after :deploy, "deploy:copy_db_credentials"
after "deploy:update_code", :bundle_install
desc "install the necessary prerequisites"
task :bundle_install, :roles => :app do
  run "cd #{release_path} && bundle install"
end