Beheer van ontwikkelomgeving met Foreman

Gepubliceerd op 20 Jan 2012 door Rene

De ontwikkeling van een applicatie vereist tegenwoordig meer dan enkel een teksteditor en een rails server. Door het gebruik van bijvoorbeeld verschillende databases, achtergrondtaken of afhandeling van e-mail is het noodzakelijk bij de ontwikkeling de beschikking te hebben over software die hiertoe in staat is.

Nu is het hebben van deze software enkel een preconditie die vastgelegd kan worden bij het project en daarmee ook niet echt een probleem. Wanneer verschillende projecten verschillende verzamelingen software vereisen ontstaat de behoefte om de ontwikkelaar hierin te ondersteunen. De Rubygem Foreman komt hierbij bijzonder goed van pas!

Procfile

De Foreman gem heeft als insteek het starten van de applicatie eenvoudiger te maken door de precondities op het gebied van software die gestart moet worden vast te leggen in een Procfile. Dit bestand bevat enkel een naam en een uitvoerregel.

Een Rails project dat gebruik maakt van mongoDB voor opslag van gegevens, Redis voor snelle toegang tot key-value opslag, Resque voor de uitvoer taken in de achtergrond, Resque scheduler voor het periodiek starten van taken en Post Office voor het beschikbaar stellen van een mailserver in de ontwikkelomgeving heeft een volgend Procfile:

web:            bundle exec unicorn
mongodb:        mongod --quiet --dbpath=db/mongo/
redis:          redis-server /opt/local/etc/redis.conf
worker:         bundle exec rake environment resque:work QUEUE=*
scheduler:      bundle exec rake resque:scheduler QUEUE=*
post_office:    post_office --smtp 10025 --pop3 10110

Foreman

Normaal gesproken zou het een hele klus zijn om alle software te starten om zo aan ontwikkeling te beginnen. Met Foreman kunnen we aan de slag na het uitvoeren van één commando:

$ foreman start

Vervolgens worden de verschillende onderdelen van Procfile gestart en wordt het resultaat daarvan weergegeven:

my_project git:(master) foreman start
10:39:42 web.1          | started with pid 5873
10:39:42 mongodb.1      | started with pid 5874
10:39:42 redis.1        | started with pid 5877
10:39:42 worker.1       | started with pid 5878
10:39:42 scheduler.1    | started with pid 5881
10:39:42 post_office.1  | started with pid 5883
10:39:42 mongodb.1      | Fri Jan 20 10:39:42 [initandlisten] MongoDB starting : pid=5874 port=27017 dbpath=db/mongo/
10:39:42 web.1          | I, [2012-01-20T10:39:46.316708 #5873]  INFO -- : listening on addr=0.0.0.0:8080 fd=12
10:39:42 web.1          | I, [2012-01-20T10:39:46.317231 #5873]  INFO -- : worker=0 spawning...

Afhankelijkheden

Het is mogelijk dat bepaalde software afhankelijk is van andere. Zo zal in bovenstaand voorbeeld Resque niet werken zonder Redis. Foreman biedt op dit moment nog geen ondersteuning aan om aan te geven welke processen van elkaar afhankelijk zijn.

Een door ons voorgesteld concept voegt deze ondersteuning toe door in de Procfile gebruik te maken van het sluisteken. De onderdelen uit het eerdere voorbeeld worden dan beschreven als:

web:            bundle exec unicorn
mongodb:        mongod --quiet --dbpath=db/mongo/
redis:          redis-server /opt/local/etc/redis.conf
| worker:       bundle exec rake environment resque:work QUEUE=*
| scheduler:    bundle exec rake resque:scheduler QUEUE=*
post_office:    post_office --smtp 10025 --pop3 10110

De onderdelen die afhankelijk zijn van Redis worden op deze manier pas na enkele seconden gestart. Een versie van Foreman met ondersteuning voor dit concept is te downloaden vanaf Github.

Reacties

blog comments powered by Disqus