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:                          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
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
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.
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
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
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
  end
end
zamieniamy na:
class Sample < ActiveRecord::Base
  def power_of_value
     value*2
  end
end

:~/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 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.
2. RSS-em:
CruiseControl.rb

"narzędzie do Ruby nie nada się do
  innych języków" - obalamy mity!
CruiseControl.rb - PHP
StackTest.php:
<?php
class 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 git
Adding 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 na
project.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:
przemyslaw.wroblewski@gmail.com

More Related Content

PDF
Swoole w PHP. Czy to ma sens?
PDF
Websockety w PHP
PDF
PHP-PM. Hit czy kit?
ODP
PHP@Docker - w produkcji
PDF
Automatyzacja utrzymania jakości w środowisku PHP
PDF
ODP
Od Zera do Farmera
PDF
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
Swoole w PHP. Czy to ma sens?
Websockety w PHP
PHP-PM. Hit czy kit?
PHP@Docker - w produkcji
Automatyzacja utrzymania jakości w środowisku PHP
Od Zera do Farmera
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...

What's hot (20)

PDF
Testowanie rozwiązań serverless z LocalStack
PPTX
Jak zostać mobile deweloperem w 1 dzień
PDF
Metaprogramowanie w JS
PPTX
3Camp Tech 2016/11/15 - Front-end tooling: package managers
PPT
Vagrant - RuPy Tuesday
PDF
LXC - kontener pingwinów
PDF
Infrastructure As Code
PDF
Ruby, Ruby on Rails 2010
PPTX
Aplikacje internetowe real-time w oparciu o React/Redux
PDF
Daj się wyręczyć - Joomla Day Polska 2014
PDF
Sekrety magicznego ogrodu Docker
PDF
[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...
PDF
TorqueBox - Ruby na sterydach
PDF
PDF
Jak poprawić Core Web Vitals w aplikacji Next.js
PPTX
Full Stack JavaScript case study na podstawie Maracuya Jukebox audio player
PDF
Rundeck & Ansible
PPTX
Noc informatyka
PDF
Ansible w praktyce
PDF
Monitoring sieci
Testowanie rozwiązań serverless z LocalStack
Jak zostać mobile deweloperem w 1 dzień
Metaprogramowanie w JS
3Camp Tech 2016/11/15 - Front-end tooling: package managers
Vagrant - RuPy Tuesday
LXC - kontener pingwinów
Infrastructure As Code
Ruby, Ruby on Rails 2010
Aplikacje internetowe real-time w oparciu o React/Redux
Daj się wyręczyć - Joomla Day Polska 2014
Sekrety magicznego ogrodu Docker
[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...
TorqueBox - Ruby na sterydach
Jak poprawić Core Web Vitals w aplikacji Next.js
Full Stack JavaScript case study na podstawie Maracuya Jukebox audio player
Rundeck & Ansible
Noc informatyka
Ansible w praktyce
Monitoring sieci
Ad

Viewers also liked (7)

PDF
It od kuchni w nokaut.pl
PDF
Graph cafe-lightning
PDF
Skalowalność przy błyskawicznym wzroście
PDF
VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...
PPT
SphinxSearch
PPT
MediaMonks
PPT
MediaMonks: Games vs Advertising
It od kuchni w nokaut.pl
Graph cafe-lightning
Skalowalność przy błyskawicznym wzroście
VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...
SphinxSearch
MediaMonks
MediaMonks: Games vs Advertising
Ad

CruiseControl.rb

  • 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
  • 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
  • 9. sprawdzamy wynik na stronie http://0.0.0.0:3333
  • 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
  • 13. Psujemy! class Sample < ActiveRecord::Base def power_of_value value*value end end zamieniamy na: class Sample < ActiveRecord::Base def power_of_value value*2 end end :~/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(-)
  • 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.
  • 17. CruiseControl.rb "narzędzie do Ruby nie nada się do innych języków" - obalamy mity!
  • 18. CruiseControl.rb - PHP StackTest.php: <?php class 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
  • 19. CruiseControl.rb - PHP :~/workspace/cruisecontrol-1.4.0$ ./cruise add cc-php -r /home/lowang/workspace/cc-php/ -s git Adding 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 na project.build_command = 'phpunit StackTest.php'
  • 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