Как управлять задачами cron с помощью Capistrano для NodeJS проектов

Как управлять задачами в Cron с помощью Capistrano для NodeJS проектов Я уже рассказывал о том как доставлять NodeJS проект на сервер с помощью Capistrano, теперь я расскажу как можно управлять задачами cron с помощью все того же Capistrano.

Для начала нам понадобится whenever — это замечательная библиотека для удобной работы с задачами крона. Библиотека написана на Ruby, но так как у вас уже стоит Capistrano это не должно быть проблемой. Устанавливаем:

gem install whenever 

Чтобы создать структуру для работы с whenever, вызываем в кроне вашего проекта следующую команду:

wheneverize . 

В проект будет добавлен один единственный файл config/schedule.rb, именно в нем будут описаны все задачи для исполения кроном. Для примера хочу показать как с помошью whenever можно запускать CoffeeScript файлы.

job_type :coffee, "cd :path && /usr/local/bin/coffee :task :output"

every 2.hours do
  coffee "import.coffee"
end

То есть, каждые 2 часа из папки проекта будет запущен файл import.coffee. Больше примеров по работе с whenever можно посмотреть здесь.

Теперь нам осталось обновить config/deploy.rb, который мы разобрали в прошлый раз, и добавить в него два новых этапа, это task :update_crontab и task :clear_crontab. Результат:

set :application, "simonenko.su"
set :node_file, "server.coffee"
set :host, "178.79.189.200"
set :repository, "git@github.com:meritt/simonenko.su.git"
set :user, "root"
set :admin_runner, "www"

set :scm, :git
set :branch, "master"
set :deploy_via, :remote_cache
set :deploy_to, "/usr/www/#{application}"
set :keep_releases, 4

role :app, host

namespace :deploy do
  desc "Start application with forever"
  task :start, :roles => :app, :except => { :no_release => true } do
    run "forever start -c coffee #{current_path}/#{node_file}"
  end

  desc "Stop application"
  task :stop, :roles => :app, :except => { :no_release => true } do
    run "forever stop #{current_path}/#{node_file}"
  end

  desc "Restart application"
  task :restart, :roles => :app, :except => { :no_release => true } do
    stop
    sleep 1
    start
  end

  desc "Install npm modules"
  task :npm_install do
    run "cd #{release_path} && npm link"
  end

  desc "Update node_modules symlink"
  task :npm_update_symlink do
    run "rm -rf #{release_path}/node_modules"
    run "ln -s #{shared_path}/node_modules #{release_path}/node_modules"
  end

  desc "Update access to application"
  task :final_options, roles => :app do
    run "chown -R #{admin_runner}:#{admin_runner} #{deploy_to}"
    run "chmod 777 #{release_path}/cache"
  end

  desc "Clear cron jobs"
  task :clear_crontab, :roles => :app do
    run "cd #{current_path} && whenever --clear-crontab #{application}"
  end

  desc "Update cron jobs"
  task :update_crontab, :roles => :app do
    run "cd #{current_path} && whenever --update-crontab #{application}"
  end

  task :symlink_configs, :roles => :app do
    %w[app_config.yml].each do |f|
      run "ln -sf #{shared_path}/config/#{f} #{release_path}/config/#{f}"
    end
  end

  desc "Create folders for nodejs application"
  task :setup_for_nodejs, :roles => :app do
    run "mkdir -p #{deploy_to}"
    run "mkdir -p #{shared_path}/node_modules"
    run "chown -R #{admin_runner}:#{admin_runner} #{deploy_to}"
  end

end

before 'deploy:setup', 'deploy:setup_for_nodejs'

after "deploy:finalize_update", "deploy:cleanup", "deploy:symlink_configs", "deploy:update_crontab", "deploy:final_options"

after "deploy:update_code", "deploy:npm_update_symlink", "deploy:npm_install", "deploy:clear_crontab"

Думаю доставка ваших приложений с whenever будет еще проще, ведь теперь вы можете удаленно управлять кроном.

Что ещё почитать?

← Что нового в ECMAScript 5Асинхронное подключение Google Anal →