CruiseControl.rb

25
CruiseControl.rb serwer Continuous Integration napisany w Ruby. Szybki do zainstalowania, prosty w użyciu i łatwy do hackowania

description

 

Transcript of CruiseControl.rb

Page 1: CruiseControl.rb

CruiseControl.rb

serwer Continuous Integration napisany w Ruby.

Szybki do zainstalowania, prosty w użyciu i łatwy do hackowania

Page 2: CruiseControl.rb

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

Page 3: CruiseControl.rb

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

Page 4: CruiseControl.rb
Page 5: CruiseControl.rb

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

Page 6: CruiseControl.rb

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.

Page 7: CruiseControl.rb

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

Page 8: CruiseControl.rb

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

Page 9: CruiseControl.rb

sprawdzamy wynik na stronie http://0.0.0.0:3333

Page 10: CruiseControl.rb

"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

Page 11: CruiseControl.rb

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

Page 12: CruiseControl.rb

CruiseControl.rb - działa!

Page 13: CruiseControl.rb

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(-)

Page 14: CruiseControl.rb

CruiseControl.rb - działa!

Page 15: CruiseControl.rb

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.

Page 16: CruiseControl.rb

2. RSS-em:

Page 17: CruiseControl.rb

CruiseControl.rb

"narzędzie do Ruby nie nada się do innych języków" - obalamy mity!

Page 18: CruiseControl.rb

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

Page 19: CruiseControl.rb

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'

Page 20: CruiseControl.rb

CruiseControl.rb - PHP

Page 21: CruiseControl.rb

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

Page 22: CruiseControl.rb

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.

Page 23: CruiseControl.rb

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"

Page 24: CruiseControl.rb

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

Page 25: CruiseControl.rb

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]