Nous vous présentons aujourd'hui Whenever, une gem qui permet de gérer ses crons par projets, et en Ruby.
Un projet rails à généralement besoin de tâches qui se répètent dans un intervalle de temps. Faire des sauvegardes, mettre à jour des caches, lire des rss, ...
Dans ce cas, on utilise généralement un cron, qui permet d'executer des commandes à une fréquence donnée, comme des tâches rake, par exemple. Le seul inconvénient est que quand on déploie son projet sur sa plateforme de production, il n'est pas simple de déployer ses tâches cron... sans whenever.
Whenever est une gem qui permet de créer ses tâches cron directement dans son projet rails, avec une syntaxe ruby très simple.
Vous trouverez son dépot github ici.
Pour l'installation, rien de compliqué, gem install whenever. Ensuite, il n'y a plus qu'à taper "wheneverize path/to/my/project/", ce qui crée un "config/schedule.rb"
La configuration de whenever se fait à partir du fichier schedule.rb.
exemple de schedule.rb
every 3.hours do runner "MyModel.some_process" rake "my:rake:task" command "/usr/bin/my_great_command" end every 1.day, :at => '4:30 am' do runner "MyModel.task_to_run_at_four_thirty_in_the_morning" end every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot runner "SomeModel.ladeeda" end every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday runner "Task.do_something_great" end every '0 0 27-31 * *' do command "echo 'you can use raw cron syntax too'" end
Au déploiement, il suffit d'une ligne pour ensuite mettre à jour ses crons: whenever --update-crontab
Les lignes relatives au projet sont à ce moment là ajoutées en bas, avec un commentaire précisant leur projet d'appartenance.

Rejoignez la communauté des créatifs du web !
- Partagez vos créations
- Gagnez en visibilité
- Créez votre blog facilement
> En savoir plus
le 05/01/12| #1
Merci pour cet article, whenever est effectivement très pratique :)
Nous avons rencontré pas mal de problèmes avec les tâches rake lorsque RVM était installé en production (de mémoire pas de soucis avec rbenv). Nous avons réglé ça en ajoutant cette ligne dans schedule.rb :
set :job_template, "bash -l -c 'source ~/.rvm/scripts/rvm && :job'"
Sauf erreur, l'utilisation du runner permet d'économiser pas mal de ressources car l'environnement Rails n'est pas chargé entièrement à chaque fois.