Symfony2, Deploy и Cron

Пётр Сергеев — Nov 24, 2012    development, workflow

Слава роботам! Автоматизация в массы!

Мы, как и любые другие нормальные программисты, любим делать так, чтобы кнопок нажимать надо было меньше, а работы при этом делалось больше. Поэтому мы стараемся все автоматизировать. Одним из аспектов нашей работы является написание скриптов, которые в бэкграунде по расписанию будут делать какую-нибудь полезную или бесполезную работу, заказывать там пиццу в 2 часа дня, например. Для такой работы, ясное дело, служит Cron. Но какой нормальный программист любит лазить в кронтабы, держдать у себя в голове правила по которым чудесная комбинация из звездочек и цыферек * 2 * * * order-pizza превращается в ежедневное задание. Мы решили автоматизировать!

Положим у нас есть некоторый symfony2 таск, который запускается как app/console order:pizza, мы хотим задеплоить приложение через capifony и автоматически добавить таск в крон. Как же это можно сделать? Для всего есть gem! Для нашей задачи отлично подходит гем Whenever. Писался он под рельсы, но, поскольку писался добротно, то адаптировать его под свои нужны не составляет особого труда. Прежде всего, нужно этот гем поставить, при чем на сервере. Полагая, что руби в наличии имеется, выполняем gem install whenever. Полработы сделано. Переходим в наше приложение и венеризируем! Поскольку структура рельсов и симфони отличается, то укажем явно, где хотим создать специальный файл настроек schedule.rb wheneverize ./app

Скрипт создает файл schedule.rb, в котором в рубишном стиле можно писать всякие там команды. Подробнее об этом можно почитать на странице в гитхабе. Whenever предоставляет несколько видов команд для выполнения:

  • command
  • rake
  • runner
  • script

Все они, за исключением command, заточены под рубишные таски, поэтому напишем свой тип команд, возможности для этого есть.

job_type :symf_command, 'cd :path && app/console :task --env=:environment' 
# path и environment подставляются автоматически

every 1.day, :at => '3 pm' do
  symf_command "order:pizza"
end

Осталось немного - добавить все это дело в деплой. Таски для запуска whenever после деплоя уже прописаны в геме. Подключаем их в ваш deploy.rb файл и указываем специфичные для нас переменные.

require "whenever/capistrano"
set :whenever_command, "whenever --load-file app/config/schedule.rb --set environment=#{symfony_env_prod}"

В общем-то, все. Теперь таск по генерации задач крона будет добавлен в capifony после deploy:finalize_update Слава роботам!

Evercode Lab

Close