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.
[caption id="attachment_170" width="300" caption="Tworzenie nowego projektu"][/caption]
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?
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ę.