CruiseControl.rb
-
Upload
przemyslaw-wroblewski -
Category
Documents
-
view
904 -
download
0
description
Transcript of CruiseControl.rb
CruiseControl.rb
serwer Continuous Integration napisany w Ruby.
Szybki do zainstalowania, prosty w użyciu i łatwy do hackowania
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
Po co mi to ?
PRZECIW: - mamy testy- wykonuje je przy każdym commit- każdy w moim zespole sprawdza czy jego kod nie powoduje problemów z innymi częściami
ZA:- i cruise z nich korzysta- napewno?
- taaaak, a świstak siedzi i ...
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
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
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 gitAdding project 'cc-rails' (this may take a while)...cruise data root = '/home/lowang/.cruise'Project 'cc-rails' added.
CruiseControl.rb - uruchomienie:~/workspace/cruisecontrol-1.4.0$ ./cruise startcruise 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 optionsBuilder for project 'cc-rails' startedLogging to: /home/lowang/workspace/cruisecontrol-1.4.0/log/cc-rails_builder.logBuild 543f9a2 startedBuild 543f9a2 FAILED
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_loaderStarted.Finished in 0.138515 seconds.
1 tests, 1 assertions, 0 failures, 0 errors, 0 skips
Test run options: --seed 26288
sprawdzamy wynik na stronie http://0.0.0.0:3333
"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
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
CruiseControl.rb - działa!
Psujemy!class Sample < ActiveRecord::Base def power_of_value value*value endendzamieniamy na:class Sample < ActiveRecord::Base def power_of_value value*2 endend :~/workspace/cc-rails$ git commit -m"zmiana dzialania power_of_value" app/models/sample.rb[master ee82820] zmiana dzialania power_of_value 1 files changed, 1 insertions(+), 1 deletions(-)
CruiseControl.rb - działa!
CruiseControl.rb - kto na to będzie patrzył cały czas ?nikt, dlatego CCRb wysyła powiadomienia: 1. emailem:[CruiseControl] importrb build 26376 failedThe build failed.
CHANGES-------New revision 26376 detectedRevision 26376 committed by pwroblewski on 2011-02-10 11:13:53mniejsza ilosc rekordow w tabeli category_with_property_valueM /importrb/trunk/config/deploy.yml
See http://cruise.local/builds/importrb/26376 for details.
2. RSS-em:
CruiseControl.rb
"narzędzie do Ruby nie nada się do innych języków" - obalamy mity!
CruiseControl.rb - PHPStackTest.php:<?phpclass StackTest extends PHPUnit_Framework_TestCase{ public function testPushAndPop() { $stack = array(); $this->assertEquals(0, count($stack)); array_push($stack, 'foo'); $this->assertEquals('foo', $stack[count($stack)-1]); $this->assertEquals(1, count($stack)); $this->assertEquals('foo', array_pop($stack)); $this->assertEquals(0, count($stack)); }}?>
:~/workspace/cc-php$ phpunit StackTest.php PHPUnit 3.4.13 by Sebastian Bergmann..Time: 0 seconds, Memory: 6.50Mb
OK (1 test, 5 assertions)
:~/workspace/cc-php$ echo $?0
CruiseControl.rb - PHP:~/workspace/cruisecontrol-1.4.0$ ./cruise add cc-php -r /home/lowang/workspace/cc-php/ -s gitAdding project 'cc-php' (this may take a while)...cruise data root = '/home/lowang/.cruise'Project 'cc-php' added.
$ vim ~/.cruise/projects/cc-php/cruise_config.rb
# ustawiam build_command naproject.build_command = 'phpunit StackTest.php'
CruiseControl.rb - PHP
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
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.
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"
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
CruiseControl.rb
Więcej na: http://martinfowler.com/articles/continuousIntegration.html http://cruisecontrolrb.thoughtworks.com/ https://github.com/thoughtworks/cruisecontrol.rb
http://www.slideshare.net/lowang
Kontakt do mnie:[email protected]