[Ruby on Rails] Créer des tâches automatisées avec Rake - Version imprimable +- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org) +-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38) +--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51) +--- Sujet : [Ruby on Rails] Créer des tâches automatisées avec Rake (/showthread.php?tid=4420) |
[Ruby on Rails] Créer des tâches automatisées avec Rake - Sephi-Chan - 21-10-2009 Rake est un outil plutôt génial écrit en Ruby qui permet d'écrire des tâches qui pourront être utilisées plus tard, dans un CRON par exemple. Il est un peu à Ruby ce que Make est au C. Rake est l'une des raisons (et une parmi tant d'autres) qui fait que développer avec Ruby on Rails sans avoir un accès à un terminal (typiquement le cas d'un serveur mutualisé), c'est moins drôle. Rails utilise déjà abondamment Rake, pour connaître les tâches disponible, il faut lancer la commande rake -T. Comme il y en a pas mal, je vous colle le rendu de cette commande : tâche disponible par défaut dans une application Ruby on Rails. Celles que j'utilise le plus souvent :
Vous l'aurez compris, dans nos jeux par navigateur, ce genre de tâches sont très pratique : les maintenances nocturnes, les opérations asynchrones (par exemple recharger les points d'actions des personnages toutes les 20 minutes, etc.). Tout d'abord, comment créer une tâche Rake dans une application Ruby on Rails ? C'est simple, c'est juste un fichier qui contient du Ruby. Les tâches sont placées dans le répertoire lib/tasks/. On leur donne l'extension .rake.
Voilà deux tâches Rake. Pour lancer une tâche, il suffit de lancer la commande rake nom_de_la_tâche. Par exemple rake nom_de_la_tâche. Comme on peut le voir, la seconde tâche diffère un peu dans sa déclaration. Elle implique en effet une dépendance : quand on lance la tâche "introduce", la tâche "hello_world" est d'abord exécutée. Notez qu'on peut définir plusieurs dépendances :
Maintenant qu'on sait définir une tâche, voyons un exemple concret. Dans mon travail, je vais être amené à écrire une tâche qui permettra d'automatiser la recherche de bande-annonces de films sur YouTube. Pour cela, la tâche va récupérer les titres des films qui passent dans la journée, envoyer des requêtes à l'API YouTube, lire les flux XML renvoyés et stocker les URLs en base. Le matin, quand l'un des administrateur du site arrivera, il va voir une page avec les vidéos que le système aura trouvé, les visionnera et les approuvera ou non. Et selon son approbation, la vidéo sera ajoutée au programme télé. Voilà ce à quoi pourrait ressembler la tâche (qui sera stockée dans un fichier nommé trailers.rake) :
La tâche en elle-même, c'est juste du Ruby (avec tous les apports sympas de Ruby on Rails, comme ActiveRecord, ActiveSupport, etc.), on peut donc inclure des librairies (open-uri et hrpicot dans notre cas) comme dans n'importe quel script. Notons que maintenant, quand on demande à rake de nous lister ses tâches, il a ajouté la nôtre !
Voilà donc, plus qu'à appeler cette tâche ! Vous savez comment faire ! Bien sûr, tout l'intérêt des tâches est de pouvoir être lancé automatiquement. Ici, nous allons utiliser un CRON, nous allons donc ajouter une ligne à l'un des fichiers contenant des crons (car il y en a moult sur un système Unix !), en l'occurrence /etc/crontab.
Grâce à cette ligne, le script se lancera quand il sera 2h00, tous les jours du mois, tous les mois et tous les jours de la semaine. Autrement dit, tous les jours à 2h du matin. On lancera la commande en lui transmettant la variable RAILS_ENV, qui représente l'environnement à utiliser : en l'occurrence l'environnement de production (il y a aussi development et test). Une telle variable sera ajoutée temporairement aux variables d'environnement du système et sera disponible dans le tableau associatif ENV[:RAILS_ENV]. Pour y accéder, on pourra faire ENV['RAIL_ENV']. Il existe un autre moyen de passer des arguments, mais je rencontre quelques problèmes quand je l'utilise avec mon shell Zsh (avec Bash, ça fonctionne). Je l'expliquerai quand j'en saurais plus. Notez toutefois que Rake est surtout intéressant pour les tâches automatisées, et donc il est rarement nécessaire de passer des arguments (puisque si ces arguments sont automatisables, ils peuvent être générée par la tâche) Voilà, j'espère que ça vous aura plu et si vous avez des questions, des critiques, des commentaires, etc. n'hésitez pas. Ça me prend du temps d'écrire tout ça, ça me fait plaisir d'avoir des feedbacks. :p Sephi-Chan RE: [Ruby on Rails] Créer des tâches automatisées avec Rake - Sephi-Chan - 23-10-2009 J'ai rajouté quelques notes à propos de passage d'arguments. En écrivant cette tâche pour le boulot, je me suis rendu compte que la version de Rails que j'utilisais n'incluait pas encore les dynamic scopes. J'ai donc eu plusieurs options : Les finders dynamiques :
La requête à base d'une chaîne de caractère avec des placeholders anonymes :
La requête à base d'une chaîne de caractère avec des placeholders nommés :
La requête avec une condition sous forme de hash :
|