#281 Foreman
Ryan Bates à demandé il y a peu, via Twitter, quelle était la meilleure façon de gérer les processus en arrière-plan sur lesquels repose une application Rails pendant son développement. Plusieurs personnes ont recommandé Foreman. Nous allons donc vous le présenter dans cet épisode.
Par exemple, pour utiliser l'application GoVsGo de Ryan en développement, nous devons lancer un certain nombre de processus en arrière-plan. On a par exemple besoin de Beanstalkd, processus script/worker
et un serveur Faye. Nous devons lancer chacun d'eux chaque fois que nous voulons utiliser l'application. Il serait agréable d'avoir une solution simple permettant de gérer tous ces processus et c'est pour ça que Foreman est fait.
Installer et Utiliser Foreman
Foreman est fournit sous forme de gem et s'installe de manière classique.
$ gem install foreman
Foreman trouve la liste des processus à gérer dans un fichier Procfile
à la racine de l'application, nous devons donc le créer. Dans ce fichier, nous allons lister les processus que nous voulons voir gérés par Foreman. Chacun d'eux est définit par un nom, suivi par le catactère deux-points et du processus à lancer. Notre liste ressemble à ceci :
beanstalk: beanstalkd worker: ./script/worker faye: rackup faye.ru -s thin -E production
Une fois notre Procfile
écrit, nous pouvons vérifier sa validité en lançant la commande foreman check
.
$ foreman check valid procfile detected (beanstalk, worker, faye)
Si nous utilisons des tabulations au lieu d'espaces pour séparer le nom de la commande, nous allons voir des erreurs de dépréciation, nous devons donc garder cela en tête lors de l'écriture de notre Procfile
. Si notre fichier est considéré comme valide, nous pouvons tenter de lancer Foreman avec la commande foreman start
.
$ foreman start 20:06:35 beanstalk.1 | started with pid 23140 20:06:35 worker.1 | started with pid 23141 20:06:35 faye.1 | started with pid 23143 20:06:36 faye.1 | >> Thin web server (v1.2.11 codename Bat-Shit Crazy) 20:06:36 faye.1 | >> Maximum connections set to 1024 20:06:36 faye.1 | >> Listening on 0.0.0.0:9292, CTRL+C to stop 20:06:38 worker.1 | [2011-08-29 20:06:38 +0100] Working 1 jobs: [ Game.move ]
Lorsque nous le faisons, chaque processus spécifié dans notre Procfile
va être lancé et listé, suivi de ses affichages, dans le terminal. Si nous tapons CTRL+C
dans cette fenêtre de terminal, tous les processus sont stoppés.
Foreman a une page de manuel utile qui documente ses fonctionnalités et les différentes options que l'on peut lui passer. Si nous voulons lancer seulement un processus, nous pouvons directement passer son nom en paramètre.
$ foreman start faye 20:35:41 faye.1 | started with pid 23322 20:35:41 faye.1 | >> Thin web server (v1.2.11 codename Bat-Shit Crazy) 20:35:41 faye.1 | >> Maximum connections set to 1024 20:35:41 faye.1 | >> Listening on 0.0.0.0:9292, CTRL+C to stop
Si nous voulons démarrer plusieurs copies d'un même processus, nous pouvons le faire en passant l'option -c
. Par exemple, nous pouvons lancer 4 processus worker en appelant foreman start -c worker=4
.
$ foreman start -c worker=4 20:39:41 beanstalk.1 | started with pid 23366 20:39:41 worker.1 | started with pid 23368 20:39:41 worker.2 | started with pid 23370 20:39:41 worker.3 | started with pid 23372 20:39:41 worker.4 | started with pid 23374 20:39:41 faye.1 | started with pid 23376 20:39:42 faye.1 | >> Thin web server (v1.2.11 codename Bat-Shit Crazy) 20:39:42 faye.1 | >> Maximum connections set to 1024 20:39:42 faye.1 | >> Listening on 0.0.0.0:9292, CTRL+C to stop 20:39:46 worker.3 | [2011-08-29 20:39:46 +0100] Working 1 jobs: [ Game.move ] 20:39:46 worker.1 | [2011-08-29 20:39:46 +0100] Working 1 jobs: [ Game.move ] 20:39:46 worker.2 | [2011-08-29 20:39:46 +0100] Working 1 jobs: [ Game.move ] 20:39:47 worker.4 | [2011-08-29 20:39:47 +0100] Working 1 jobs: [ Game.move ]
Cela va lancer chaque processus une fois, sauf worker qui sera lancé quatre fois.
Exporter les Processus
Forman fournit une commande export
qui permet d'exporter la liste des processus dans un format utilisable sur un serveur de production. Les formats supportés sont pour l'instant inittab
et upstart
. Si nous lançons la commande foreman export upstart .
, Forman va écrire un certain nombre de fichiers de configuration upstart dans le dossier courant. Si nous regardons l'un d'eux de plus près, nous allons voir qu'il va lancer une commande pour démarrer beanstalkd
et gérer les logs.
start on starting govsgo-beanstalk stop on stopping govsgo-beanstalk respawn exec su - govsgo -c 'cd /Users/eifion/govsgo; export PORT=5000; beanstalkd >> /var/log/govsgo/beanstalk-1.log 2>&1'
C'est tout pour cet épisode sur Foreman. Il est plus court que d'habitude mais Foreman est une solution simple répondant parfaitement à un problème spécifique. Si vous avez besoin de lancer un certain nombre de processus pour faire fonctionner votre application Rails en développement, Foreman vaut la peine d'être considéré.