Serwer continuous integration w Rubym – Integrity

Jeśli zawsze chciałeś mieć serwer Continuous integration, a właśnie teraz masz przerwę na kawę, to świetny moment by go zainstalować i zacząć używać w swoim projekcie. Jeśli nie wiesz dlaczego potrzebujesz serwera Continuous Integration (a potrzebujesz), poczytaj o tym na wikipedii, lub obejrzyj prezentację twórcy Integrity z tegorocznego EuRuKo.

Potrzebne bedą:

  • przerwa na kawę
  • ruby
  • git
  • jakiś stary komputer (może być też ten na którym pracujesz i tak, może być nowy)

O Integrity słów kilka

Integrity to zgrabna aplikacja napisana w Sinatrze, pełniąca rolę serwera Continuous Integration. Potrafi ona pobrać kod z repozytorium gita i uruchomić na nim dowolne komendy. Gotowi? Zatem zaczynamy.

Instalacja Integrity

Integrity, do zarządzania zależnościami korzysta z bundlera. Jeśli jeszcze z niego nie korzystaliście, po prosty zainstalujcie go i podążajcie za poleceniami. Pewnie w krótce przyjrzymy się mu bliżej w osobnym poście.

gem install bundler

Integrity najlepiej pobrać z githuba i użyć ostatniej stabilnej wersji (v22):

git clone git://github.com/integrity/integrity
git checkout -b deploy v22

Następnie każemy bundlerowi zainstalować wszystykie potrzebne gemy i idziemy wstawić wodę na kawę/herbatę/yerba matę.

bundle install
bundle lock

Przygotujemy bazę danych.

rake db

Na chwilę obecną dostaniemy jakieś ostrzeżenia odnośnie datamappera, nie przeszkadzają nam one jednak uruchomić Integrity.

bundle exec rackup

Wystarczy teraz zajrzeć pod adres: http://localhost:9292/ i utworzyć swój pierwszy projekt.

Tworzenie nowego projektu

Tworzenie nowego projektu

Po podaniu nazwy, adresu repozytorium i komendy do wykonania (spec spec), jesteśmy gotowi przeprowadzić pierwszy build, natykamy się tu jednak na komunikat:

Integrity/.bundle/environment.rb:126:in `gem': rspec is not part of the
bundle. Add it to Gemfile. (Gem::LoadError)

Oznacza to, że wszystkie potrzebne gemy musimy dorzucić do bundlera. Otwieramy zatem plik Gemfile i dopisujemy na jego końcu następującą linijkę:

gem "rspec"

Jeśli twoje testy wymagają innych gemów, musisz je również podać w pliku Gemfile. Następnie każemy bundlerowi zainstalować brakujący gem i idziemy zalać wrzątkiem kawę/herbatę/yerba matę.

bundle install --relock

Restartujemy naszą aplikację i odpalamy build jeszcze raz. Wszystkie testy przechodzą, a build nabiera zielonego koloru. Mamy działający serwer continuous integration. Prawda że szybko?

Integrity - wygląd aplikacji

Skąd Integrity wie, że testy przechodzą?

Integrity korzysta z prostej zasady, że jeżeli unixowy program zakończył się bez błędów, to zwracana jest wartość 0, a jeśli błędy wystąpiły, wynik jest od zera różny. Ponieważ większość, jeśli nie wszystkie narzędzia do testowania w Rubym (test unit, rspec, cucumber) są zgodne z tymi założeniami, Integrity „wie”, czy testy znalazły błedy, czy też nie. Dzięki temu możliwe jest dodanie dowolnych narzędzi o ile zwracają one odpowiedni kod na wyjściu.

Co dalej?

Następnymi krokami powinno być uruchomienie Integrity na swoim ulubionym web serwerze i zautomatyzowaniu procesu. Buildy mogą być przygotowywane zarówno cyklicznie (np co godzinę), jak i z wykorzystaniem Post-Receive Hook. Można również rozważyć ustawienie powiadomień na wypadek wystąpienia błędów. Jak to wszystko zrobić opisane zostało na stronie Integrity, ale to już temat do samodzielnego zgłębienia w czasie kolejnej przerwy na kawę.



Komentarze

  1. hosiawak 28.07.2010

    Comment Arrow

    My korzystamy z TeamCity ( http://www.jetbrains.com/teamcity/ ) – dosyć rozbudowany serwer do CI, powiadamia nas mailem i twitterem po każdym „git push” czy testy przechodzą. Używamy w sumie od niedawna, bardzo fajna rzecz. Muszę przyjrzeć się Integrity, wygląda na pewno na prostsze do ustawienia, dzięki za info.


  2. Seban 29.07.2010

    Comment Arrow

    W Implix mamy cruisecontrol.rb z małymi poprawkami. Generuje nam trochę więcej raportów: rcov, flay, roodi, standardowy stats + doc.
    Integrity może używać tylko gita i dlatego u nas nie było brane pod uwagę. Chociaż względem cruise’a jest prostsze.
    TeamCity jest rewelacyjne – to wielki kombajn do CI. @hosiawak kożystacie z pre-tested commits moze?




O autorze

Aleksander Dąbrowski

Od 2008 zawodowo programuje w Ruby i Railsach. Jest maniakiem prostych i eleganckich rozwiązań, nie boi się usuwania brzydkiego kodu. Uwielbia dzielić się wiedzą, a w wolnych chwilach naprawia samochody.