我正在尝试使用Whenever
将更改(包括使用Mina
进行Cron作业的规范)推送到使用实时服务器的服务器。
我一直在使用文章here作为指南,以了解我需要在当前deploy.rb
中添加哪些内容以在服务器上设置cron作业
文章建议:
# Whenever tasks in config/deploy.rb
desc "Update cron jobs"
task :update_cron_jobs => :environment do
queue "bundle exec whenever --update-crontab --set 'path=#{app_root_directory}/current/'"
queue %[echo "-----> Updated Whenever cron jobs."]
end
这里有一些诱杀装置: 1)我们需要将标识符设置为唯一的名称(通常我们选择我们的应用名称)。 这很重要,因为“无论何时”的默认行为是使用当前路径,对于Mina部署而言,每次部署时都是唯一的。 因此,如果您未设置标识符,则每次调用:update_cron_jobs时,服务器中都会创建重复的cron作业,因为无论何时无法识别其先前生成的cron作业。 (我们的生产服务器之一以这种方式死亡... :() 每次通过Mina进行部署时,Mina会将代码推送到新文件夹/ releases /中,然后,如果部署成功,Mina会将符号{{app_root_directory} / current链接到新的发布文件夹。 符号链接就像指向另一个位置的快捷方式或指针。 2)实际上,无论何时从/ releases /文件夹执行命令行,因此我们要显式设置生成的cron作业的路径(--set'path =#{app_root_directory} / current /')。 这将产生更一致和稳定的cron作业。 3)确保在Mina部署脚本中正确设置#{app_root_directory}。
完成任务后,我们可以轻松地将其添加到Mina部署脚本中。 只需在您的config / deploy.rb中添加一行invoke:update_cron_jobs,如下所示: desc“将当前版本部署到服务器。”
task :deploy => :environment do
deploy do
invoke :'git:clone'
invoke :'deploy:link_shared_paths'
invoke :'bundle:install'
invoke :'rails:db_migrate'
invoke :'rails:assets_precompile'
invoke :'update_cron_jobs' # <-- NEW LINE
to :launch do
queue "mkdir -p #{deploy_to}/#{current_path}/tmp"
queue "touch #{deploy_to}/#{current_path}/tmp/restart.txt"
end
end
end
当我尝试实施这些更改时,我遇到许多错误/问题:
queue "bundle exec whenever --update-crontab --set 'path=#{app_root_directory}/current/'"
我假设应该对此进行自定义,在我的情况下,我将使用已经定义的:deploy_to
变量(set :deploy_to, "/home/#{fetch(:user)}/app"
)
queue "bundle exec whenever --update-crontab --set 'path=#{fetch(:deploy_to)}/current/'"
进行了上述更改后,我收到一条错误消息,指示queue
不是可识别的命令。
有人可以共享deploy.rb
文件中的等效任务,或者建议我该如何修改它?