我有一些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
更新代码?
答案 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