1. CruiseControl.rb
serwer Continuous Integration
napisany w Ruby.
Szybki do zainstalowania, prosty w
użyciu i łatwy do hackowania
2. Co to jest Continuous Integration ?
"Continuous Integration (CI) jest praktyką
tworzenia oprogramowania w której cały zespół
często integruje swoją pracę zazwyczaj każdy
programista integruje przynajmniej raz dziennie
prowadząc do wielokrotnych integracji w ciągu
dnia.
Każda integracja jest weryfikowana przez
automatyczny build (zawierający testy) aby wykryć
błędy integracji tak szybko jak to jest możliwe."
-- Martin Fowler
3. Po co mi to ?
PRZECIW: ZA:
- mamy testy - i cruise z nich korzysta
- wykonuje je przy każdym - napewno?
commit
- każdy w moim zespole - taaaak, a świstak siedzi i
sprawdza czy jego kod nie ...
powoduje problemów z
innymi częściami
Z MOJEGO DOŚWIADCZENIA:
- jestem leniwy, kiedy testy trwaja 15 minut nie chce mi się ich
wykonywać przy każdej zmianie
- do tego przez te 15 min zajmują mase ramu i wciągają kilka
rdzeni CPU, niech jakaś inna maszyna się tym zajmuje
4.
5. CruiseControl.rb - wymagania
wersja 1.4.0, June 30, 2009
- napisana na Railsach 1.2.3
- Ruby 1.8.7
wersja master na github, November 12, 2010
- napisana na Railsach 2.3.2
- Ruby 1.8.7
- Ruby 1.9.1 (przy niewielkim wysiłku ~10minut można odpalić)
dla potrzeb prezentacji skorzystam z 1.4.0
6. CruiseControl.rb - instalacja
:~/workspace$ tar -zxvf cruisecontrol-1.4.0.tgz
:~/workspace$ cd cruisecontrol-1.4.0
:~/workspace/cruisecontrol-1.4.0$
:~/workspace/cruisecontrol-1.4.0$ ./cruise add cc-rails -r
/home/lowang/workspace/cc-rails/ -s git
Adding project 'cc-rails' (this may take a while)...
cruise data root = '/home/lowang/.cruise'
Project 'cc-rails' added.
7. CruiseControl.rb - uruchomienie
:~/workspace/cruisecontrol-1.4.0$ ./cruise start
cruise data root = '/home/lowang/.cruise'
=> Booting WEBrick...
cruise data root = '/home/lowang/.cruise'
=> Rails application started on http://0.0.0.0:3333
=> Ctrl-C to shutdown server; call with --help for options
Builder for project 'cc-rails' started
Logging to: /home/lowang/workspace/cruisecontrol-1.4.0/log/cc-
rails_builder.log
Build 543f9a2 started
Build 543f9a2 FAILED
8. FAIL ? przecież u mnie działa!
:~/workspace/cc-rails$ rake test
(in /home/lowang/workspace/cc-rails)
Loaded suite /home/lowang/.rvm/gems/ruby-1.9.2-
p136/gems/rake-0.8.7/lib/rake/rake_test_loader
Started
.
Finished in 0.138515 seconds.
1 tests, 1 assertions, 0 failures, 0 errors, 0
skips
Test run options: --seed 26288
10. "use the right tool for the job",
czyli tym młotkiem tego
gwoździa nie wbijesz...
ruby 1.8.7 na którym działa CCRb
nie zbuduje projektu Rails 3.0.3 na
Ruby 1.9.2
11. CruiseControl.rb - ustawienia
1. jak powiedzieć Cruise aby używał Ruby 1.9.2 ?
odnajdujemy plik settings z poprzedniego slajdu:
:~/workspace/cc-rails$ vim ~/.cruise/projects/cc-
rails/cruise_config.rb
2. project.build_command - tak, tego szukamy!
3. ustawiamy na rvm 1.9.2 rake db:migrate test
15. CruiseControl.rb - kto na to będzie
patrzył cały czas ?
nikt, dlatego CCRb wysyła powiadomienia:
1. emailem:
[CruiseControl] importrb build 26376 failed
The build failed.
CHANGES
-------
New revision 26376 detected
Revision 26376 committed by pwroblewski on 2011-02-10 11:13:53
mniejsza ilosc rekordow w tabeli category_with_property_value
M /importrb/trunk/config/deploy.yml
See http://cruise.local/builds/importrb/26376 for details.
21. CruiseControl.rb
przetestuje każdy projekt który
da się opisać komendą lub serią
komend zapisanych w skrypcie i
zwróci wartość exit code > 0 w
przypadku błędu
22. CruiseControl.rb - testowanie różnych
wersji środowiska
Jedna maszyna niby może uruchamiać testy
Rubiego w nastu wersjach i patchlevelach, może
mieć X wersji PHP, itd.
Teoretyczne da się to zrobić, ale środowisko w
którym działają testy powinno odwzorowywać
środowisko produkcyjne, jeśli na produkcji nie
macie takiego zlepku jak napisałem powyżej to
lepiej tego nie tworzyć dla testów.
23. CruiseControl.rb - testowanie zdalne
Pierwsza z opcji wykonywania testów w wyizolowanym
środowisku to wykonujemy testy na innych maszynach niż
działa cruise
1. ssh na serwer zdalny (wirtualizacja!)
- zakładamy klucze ssh aby łączyć się bez hasła
teraz wystarczy zmienić project.build_command np.:
ssh cruise-wpmatic "cd wpmatic; export
RAILS_ENV=test; export TESTOPTS=-v; bundle
install; rake db:drop db:create db:migrate
test"
24. CruiseControl.rb - testowanie lokalne
Jeśli mamy tylko 1 serwer do dyspozycji możemy skorzystać z
chrootowania i trzymać zamknięte wersje środowisk
podkatalogach, jedynie wersja kernela i załadowane moduły
będą współdzielone
2. chroot (czyli pseudowirtualizacja)
ustawiamy project.build_command aby wykonywał testy w
chroocie