Automated Continuous Integration voor Ruby en Rails
Geplaatst door Matthijs Langenberg ma, 26 maa 2007 18:27:00 GMT
Een veelgebruikte techniek binnen extreme programming is het doorlopend uitvoeren van integratietesten, dit wordt continuous integration genoemd.
Hierbij wordt frequent de volledige testcyclus doorlopen, welke stappen als het compilen van de applicatie, het uitvoeren van geautomatiseerde testen en het packagen van een applicatie kan bevatten. In Rails terminologie zou je kunnen denken aan het uitvoeren van een rake taak zoals rake test
of rake spec
, maar ook het genereren van een rubygem.
Een geautomatiseerde versie van dit proces is bekend als Automated Continuous Integration dit houdt in dat een versiebeheersysteem continu gecontroleerd wordt op wijzigingen en wanneer er een wijziging gedetecteerd wordt het volledige build proces automatisch uitgevoerd wordt. Wanneer er tijdens de integratietest een fout optreedt (een unit test faalt bijvoorbeeld) dan is het mogelijk om elke ontwikkelaar automatisch op de hoogte te stellen d.m.v. een email, sms of een instant message.
De volledige test suite wordt automatisch bij elke commit uitgevoerd en zodoende wordt continu de gezondheid van je applicatie(s) gecontroleerd.
Bij Newminds maken wij hiervoor gebruik van CruiseControl.rb. Dit is een Continous Integration tool geschreven in Rails waarin het mogelijk is om applicaties geschreven in o.a. Ruby, Rails, Java en C++ automatisch te compilen en te testen wanneer er een commit op de centrale subversion repository is gedaan.
In dit artikel beschrijf ik hoe je zelf CruiseControl.rb op kunt zetten, hoe we een standaard Ruby project erin opnemen en wil ik laten zien hoe de functionaliteit op basis van plugins uit te breiden is.
De installatie van CruiseControl.rb
Voordat CruiseControl.rb te gebruiken is moet het volgende op uw systeem aanwezig zijn:
- Ruby 1.8.4 of nieuwer
- Subversion client 1.3.2 of nieuwer
Download CruiseControl.rb op deze pagina, de laatste versie is op het moment van schrijven 1.0.0.
Pak het binnengehaalde archief uit op een locatie naar keuze, aangezien het een rails applicatie is heb ik het uitgepakt de map waar al mijn Rails projecten staan.
Nadat CruiseControl.rb op het systeem geplaatst is wordt het tijd om een project toe te voegen zodat deze automatisch gecontroleerd wordt, laten we hiervoor het bekende ‘Rake’ gebruiken.
De publieke subversion repository waar Rake op te vinden is staat hier en is op de volgende manier toe te voegen:
cd cruisecontrolrb-1.0.0
ruby cruise add Rake -u svn://rubyforge.org/var/svn/rake
CruiseControl.rb zal zelf een checkout doen van het Rake project en deze in projects/Rake/work
plaatsen.
Tevens is een file genaamd cruise_config.rb
in projects/Rake
geplaatst, deze file bevat de configuratie voor het Rake project en wordt gebruikt om bijvoorbeeld email adressen voor email notificatie in te stellen of om aan te geven welke rake taak of shell script er uitgevoerd moet worden om de integratie test uit te doen.
Nu we het Rake project toegevoegd hebben kunnen we de webserver van CruiseControl.rb starten door simpelweg het volgende commando in te voeren.
ruby cruise start
Ga nu naar http://localhost:3333
waar je het dashboard van CruiseControl.rb ziet.
Het dashboard geeft een overzicht van de status van alle projecten weer, naast informatie over de laatste build is er ook te zien wie de laatste checkin heeft gemaakt.
In het dashboard zie ik Build 581 FAILED staan, wanneer ik hierop klik en het build log bekijk zie ik dat ik de flexmock gem mis.
[CruiseControl] Invoking Rake task "test"
/opt/local/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- flexmock (LoadError)
Nadat ik sudo gem install flexmock
in mijn terminal ingevoerd heb en op de ‘build now’ knop op het dashboard klik zie ik dat de build geslaagd is! Wanneer een rake developer nu een commit doet op de rake repository zal het volgende uitgevoerd worden:
- CruiseControl.rb detecteerd dat er een update gedaan is;
- Automatisch wordt de lokale versie geupdate;
rake test
wordt uitgevoerd.
Het is mogelijk om CruiseControl.rb automatisch een notificatie per mail te sturen wanneer een van de testen van een project faalt, open config/site_config.rb
(of maak deze aan wanneer deze nog niet bestaat) en pas de ActionMailer::Base.smtp_setttings aan naar wens.
Open daarna projects/rake/cruise_config.rb
en stel project.email_notifier.emails
juist in.
Na het herstarten van de webserver zal bij een fout tijdens de build een email notificatie verstuurd worden naar de email adressen die ingesteld zijn in projects/Rake/cruise_config.rb
.
CruiseControl.rb en plugins
CruiseControl.rb is een zeer flexibel framework en wanneer je additionele functionaliteit wenst, bijvoorbeeld het sturen van een SMS, is dit gemakkelijk d.m.v. plugins toe te voegen.
Het idee dat het breken van de test suite, door het maken van een niet test-driven wijziging, onmiddellijk gevolgen heeft (bijv. email naar alle ontwikkelaars), zal ontwikkelaars aansporen zorgvuldiger te werken met kleinere iteraties. Om de ‘gevolgen’ nog iets extremer te maken heb ik een SpeechNotifier plugin geschreven: wanneer een build faalt zal er gebruikt gemaakt worden van de ingebouwde text-to-speech functie van de mac om daarvan een mededeling te geven aan het hele kantoor.
builder_plugins/installed/speech_notifier.rb
class SpeechNotifier
def build_finished(build)
if build.failed?
`say Project #{build.project.name} build #{build.label} failed!`
end
end
def build_fixed(build, previous_build)
`say Project #{build.project.name} build #{build.label} has been ixed!`
end
end
Project.plugin :speech_notifier
Voor verdere configuratie mogelijkheden van CruiseControl.rb verwijs ik u graag door naar de officiele documentatie.