SlideShare une entreprise Scribd logo
1  sur  25
Télécharger pour lire hors ligne
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 - 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

Contenu connexe

Tendances

Testowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStackTestowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStackThe Software House
 
Jak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzieńJak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzieńPaweł Kondraciuk
 
Metaprogramowanie w JS
Metaprogramowanie w JSMetaprogramowanie w JS
Metaprogramowanie w JSDawid Rusnak
 
3Camp Tech 2016/11/15 - Front-end tooling: package managers
3Camp Tech 2016/11/15 - Front-end tooling: package managers3Camp Tech 2016/11/15 - Front-end tooling: package managers
3Camp Tech 2016/11/15 - Front-end tooling: package managersMichał Michalczuk
 
Vagrant - RuPy Tuesday
Vagrant - RuPy TuesdayVagrant - RuPy Tuesday
Vagrant - RuPy TuesdayGaldoMedia
 
LXC - kontener pingwinów
LXC - kontener pingwinówLXC - kontener pingwinów
LXC - kontener pingwinówgnosek
 
Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010Natalia Stanko
 
Aplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/ReduxAplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/ReduxDawid Rusnak
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Tomasz Dziuda
 
Sekrety magicznego ogrodu Docker
Sekrety magicznego ogrodu DockerSekrety magicznego ogrodu Docker
Sekrety magicznego ogrodu DockerKamil Grabowski
 
[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...
[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...
[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...Future Processing
 
TorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachTorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachmarekgoldmann
 
Jak poprawić Core Web Vitals w aplikacji Next.js
Jak poprawić Core Web Vitals w aplikacji Next.jsJak poprawić Core Web Vitals w aplikacji Next.js
Jak poprawić Core Web Vitals w aplikacji Next.jsThe Software House
 
Full Stack JavaScript case study na podstawie Maracuya Jukebox audio player
Full Stack JavaScript case study na podstawie Maracuya Jukebox audio playerFull Stack JavaScript case study na podstawie Maracuya Jukebox audio player
Full Stack JavaScript case study na podstawie Maracuya Jukebox audio playerMarek Będkowski
 
Noc informatyka
Noc informatykaNoc informatyka
Noc informatykaOnetIT
 

Tendances (20)

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

En vedette

Graph cafe-lightning
Graph cafe-lightningGraph cafe-lightning
Graph cafe-lightningVolker Pacher
 
Skalowalność przy błyskawicznym wzroście
Skalowalność przy błyskawicznym wzrościeSkalowalność przy błyskawicznym wzroście
Skalowalność przy błyskawicznym wzrościeMarcin Grzybowski
 
VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...
VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...
VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...ecommerce poland expo
 
MediaMonks: Games vs Advertising
MediaMonks: Games vs AdvertisingMediaMonks: Games vs Advertising
MediaMonks: Games vs AdvertisingMediaMonks Haar
 

En vedette (7)

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

Similaire à CruiseControl.rb

Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwAsynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwLuke Adamczewski
 
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Polcode
 
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'a
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'aUruchomienie i praca z laravel w wirtualnym kontenerze docker'a
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'aLaravel Poland MeetUp
 
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...HighSolutions Sp. z o.o.
 
Joomla Day Poland 15 - Docker
Joomla Day Poland 15 - DockerJoomla Day Poland 15 - Docker
Joomla Day Poland 15 - DockerLukas Lesniewski
 
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PROIDEA
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP3camp
 
ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogoKamil Monticolo
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Cloudskraqa
 
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.Wojciech Barczyński
 
Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaWojciech Lichota
 
Shall we play a game? PL version
Shall we play a game? PL versionShall we play a game? PL version
Shall we play a game? PL versionMaciej Lasyk
 
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...Future Processing
 
Deployment kodu z Capistrano
Deployment kodu z CapistranoDeployment kodu z Capistrano
Deployment kodu z CapistranoMichał Szajbe
 
Automatyczne testy end-to-end aplikacji JavaScript.
Automatyczne testy end-to-end aplikacji JavaScript.Automatyczne testy end-to-end aplikacji JavaScript.
Automatyczne testy end-to-end aplikacji JavaScript.Future Processing
 
Piątek z XSolve - TravisCI & Continuous Delivery
Piątek z XSolve - TravisCI & Continuous DeliveryPiątek z XSolve - TravisCI & Continuous Delivery
Piątek z XSolve - TravisCI & Continuous DeliveryXSolve
 

Similaire à CruiseControl.rb (20)

Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwAsynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
 
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
 
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'a
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'aUruchomienie i praca z laravel w wirtualnym kontenerze docker'a
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'a
 
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
 
Joomla Day Poland 15 - Docker
Joomla Day Poland 15 - DockerJoomla Day Poland 15 - Docker
Joomla Day Poland 15 - Docker
 
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP
 
university day 1
university day 1university day 1
university day 1
 
Wprowadzenie do PHPUnit
Wprowadzenie do PHPUnitWprowadzenie do PHPUnit
Wprowadzenie do PHPUnit
 
ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogo
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
 
Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użycia
 
Shall we play a game? PL version
Shall we play a game? PL versionShall we play a game? PL version
Shall we play a game? PL version
 
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
 
Deployment kodu z Capistrano
Deployment kodu z CapistranoDeployment kodu z Capistrano
Deployment kodu z Capistrano
 
Automatyczne testy end-to-end aplikacji JavaScript.
Automatyczne testy end-to-end aplikacji JavaScript.Automatyczne testy end-to-end aplikacji JavaScript.
Automatyczne testy end-to-end aplikacji JavaScript.
 
Docker
DockerDocker
Docker
 
Piątek z XSolve - TravisCI & Continuous Delivery
Piątek z XSolve - TravisCI & Continuous DeliveryPiątek z XSolve - TravisCI & Continuous Delivery
Piątek z XSolve - TravisCI & Continuous Delivery
 

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
  • 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
  • 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