Ruby on Rails:随时随地管理Cron作业

时间:2018-10-10 14:15:04

标签: ruby-on-rails deployment cron

我正在尝试使用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文件中的等效任务,或者建议我该如何修改它?

0 个答案:

没有答案