我在生产中有一个 Rails 3.2.14 旧版应用程序,它运行良好。我正在将此应用程序迁移到新服务器,并将在切换时从生产中迁移数据库。到目前为止,我已经启动了该应用程序并且它正在工作(大部分情况下)。但是当我使用 Capistrano 部署到该服务器时,无论何时 gem 似乎都没有运行(尽管它在原始生产服务器上运行并更新了 crontab)。
我使用 gem 0.7.3、capistrano 2.12.0、Ruby 1.9.3p194 来保持环境相同。
这是我在 Capistrano 中的 deploy.rb 的样子(并且可以在旧服务器上随时执行:
require "bundler/capistrano"
set :whenever_command, "bundle exec whenever"
require "whenever/capistrano"
server "72.14.181.80", :web, :app, :db, primary: true
set :application, "appname"
set :user, "deploy"
set :deploy_to, "/home/#{user}/#{application}"
set :use_sudo, false
set :rails_env, "production"
set :scm, "git"
set :repository, "git@github.com:username/#{application}.git"
set :branch, "master"
default_run_options[:pty] = true
ssh_options[:forward_agent] = true
after "deploy", "deploy:cleanup" # keep only the last 5 releases
after "deploy:update", "gps_listener:restart"
namespace :deploy do
task :start do ; end
task :stop do ; end
task :restart, :roles => :app, :except => { :no_release => true } do
run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
end
desc "reload the database with seed data"
task :seed do
run "cd #{current_path}; bundle exec rake db:seed RAILS_ENV=#{rails_env}"
end
end
namespace :gps_listener do
task :start do
run "#{sudo} start app-gps"
end
task :stop do
run "#{sudo} stop app-gps"
end
task :restart do
run "#{sudo} stop app-gps && sleep 1 && #{sudo} start app-gps"
end
end
task :after_update_code do
run "ln -nfs #{deploy_to}/shared/config/database.yml #{release_path}/config/database.yml"
run "cd #{current_path}; RAILS_ENV=#{rails_env} bundle exec rake gps:listen"
end
有趣的是,当我部署到我们的旧生产服务器时,任何时候都会使用 rake 任务执行和更新 crontab。但是,如果我在 deploy.rb 中切换 IP 并部署到我们的新服务器,它将不会执行,并且 Capistrano 输出不会显示任何我能看到的可疑内容。
有什么地方可以调试吗?我想保持两台服务器的 Capistrano/Rails 配置相同。只是不确定问题是什么。也许我忽略了一些东西。
还应该注意的是,当我在 app/current 目录中的新服务器上时,我可以运行以下命令,它将正确更新我的 crontab:
RAILS_ENV=production bundle exec whenever -w