2. Nagy Norbert
Technical Team Lead @ Inviqa
Twitter: @nagno123
Email: norbert.nagy@inviqa.com
Projectek, amelyeken dolgoztam az Inviqa-nál:
• Warner Music Europe
• http://dreams.co.uk
• http://smythson.com
• http://kookai.fr
• Ideal Shopping
3. Az előadáson szó lesz:
• Mi is az a continuous integration és miért jó ez
nekünk
• Milyen fontosabb elemei vannak
• Hogyan kell felépíteni egy CI környezetet
Jenkins segítségével
• Minőségbiztosítási eszközök PHP-ben
4. Continuous Integration
Continuous Integration is a software development
practice where members of a team integrate their
work frequently, usually each person integrates at
least daily - leading to multiple integrations per day.
Each integration is verified by an automated build
(including test) to detect integration errors as
quickly as possible.
Martin Fowler
5. Követelmenyek a CI
elkezdéséhez
• A fejlesztői csapat minden tagja rendszeresen
frissíti a közös kódbázist friss verzióval
• Automatizált build folyamat
• Verziókezelő rendszer
• Minőségbizosítási eszközök
• Program, amely automatikusan lefuttatja a
build folyamatot, a teszteket és jelentést tesz a
művelet eredményéről
6. Optimális architektúra
Fejlesztői gép Előzetes tesztek a fejlesztő gépén
Staging szerver CI, belső tesztelő itt tesztel
UAT szerver Kliens itt tesztel és hagyja jóvá
Production
Ide már csak tesztelt és jóváhagyott kód kerül
szerver
8. Ant telepítése
• apt-get vagy yum segítségével
• Az adott rendszernek megfelelő bináris telepítő
fájlok is letölthetőek az ant honlapjáról
• Az ant forráskódjának letöltése után akár saját
magunk is fordíthatjuk
• Szükséges extra: JRE
12. Coding standard
• Különböző coding standardok léteznek.
PEAR
PEAR2
PHP Standards Working Group
PSR-0, PSR-1, PSR-2
Zend Framework
Egyéni
• Könnyebben átlátható kódot eredményez a
csapat minden tagjának
13. PHP_CodeSniffer
• PHP, Javascript, CSS fájlok
• A kódolási standardtól való eltéréseket detektálja és jelzi
$ phpcs /path/to/code/myfile.php
FILE: /path/to/code/myfile.php
------------------------------------------------------------
FOUND 5 ERROR(S) AFFECTING 2 LINE(S)
------------------------------------------------------------
2 | ERROR | Missing file doc comment
20 | ERROR | PHP keywords must be lowercase; expected
"false" but found "FALSE"
47 | ERROR | Line not indented correctly; expected 4 spaces
but found 1
51 | ERROR | Missing function doc comment
88 | ERROR | Line not indented correctly; expected 9 spaces
but found 6
------------------------------------------------------------
14. phpcpd
• Detektálja a másolt kódot
• A kód duplikáció helyett refaktorálás javasolt, mert megsérti
a SOLID-ot (Single responsibility)
$ phpcpd /usr/local/src/phpunit/PHPUnit
phpcpd 1.4.0 by Sebastian Bergmann.
Found 1 exact clones with 53 duplicated lines in 5 files:
-
/usr/local/src/phpunit/PHPUnit/Framework/Constraint/Or.php:
136-157
/usr/local/src/phpunit/PHPUnit/Framework/Constraint/And.php
:143-164
0.19% duplicated lines out of 27640 total lines of code.
Time: 0 seconds, Memory: 18.25Mb
15. PHP_Depend
• A statikus kódanalízis egyik fontos eszköze
• Különböző szoftvermetrikák tesztelése
• Mindegyik szoftvermetrika az adott forráskód
egy minőségi mutatójának felel meg
• Mindig objektiv
• Segít olyan részeket azonosítani a
kódban, amelyet érdemes manuálisan is átnézni
• Csak lehetséges problémákat jelez, ezért nem
érdemes vakon követni
16. phploc
• Statikus kód analízis eszköze
• Forráskód struktúrájának felmérésére szolgál
$ phploc /usr/local/src/phpunit/PHPUnit
phploc 1.7.0 by Sebastian Bergmann.
Directories: 16
Files: 117
Lines of Code (LOC): 27640
Cyclomatic Complexity / Lines of Code: 0.12
Comment Lines of Code (CLOC): 13771
Non-Comment Lines of Code (NCLOC): 13869
Namespaces: 0
Interfaces: 6
Traits: 0
…
17. PHPMD – PHP Mess Detector
• Statikus kódanalízis eszköz
• Lehetséges hibák
• Nem optimális kód
• Túlkomplikált kifejezések
• Nem használt
parméterek, változók, függvények
• Fiatal project, jelenleg még csak kb. 30
szabályt ellenőriz
18. Tesztelés előnyei
• Minél hamarabb megtalálunk egy hibát, annál
egyszerűbben és hamarabb kijavítható
• A kód egyes részei elkülönítve is tesztelhetőek
• Módosítás, frissítés esetén bizonyosság a
további müködésről
• Csak megfelelően megírt kódra lehet jó
teszteket készíteni
• Könnyebb módosítást végezni, hiszen hiba
esetén a teszt jelezni fog
• Egyfajta fejlesztői dokumentációt képez
19. Tesztek
• Unit (PHPUnit, phpspec)
• Integráció (PHPUnit, phpspec)
• User Acceptance (phpspec, Behat, Selenium)
• Terhelés (Gatling, New Relic, XHProf)
20. Unit test
• TDD
• Nem a 100%-os lefedettség a cél!
• Nem használhat külső eszközt
(adatbázis, fájl, WS), csak ezek Mock változatát
• A tesztek legyenek függetlenek egymástól
21. TDD folyamata Igen
Teszt
készítése/módos
ítása Nem Sikeresen
lefutnak a
tesztek?
Igen
Sikeresen
lefut?
Nem Optimalizálás
Nem
Kód Sikeresen Igen
készítése/módos lefutnak a
ítása tesztek?
22.
23. Dokumentáció készítése
• Egy jól megírt kód önmagát dokumentálja
• PHPDocumentor 2
• PHPDox
/**
* Returns with the label of the attribute value.
*
* @param mixed $sourceClass
* @param string $value Value to look-up
* @return string
*/
public function getAttributeValueAsText($sourceClass, $value)
{
...
}
27. Template for Jenkins Jobs for
PHP Projects
• Minta project, hogy egyszerűbben létre tudjunk hozni a saját
projectünket a Jenkinsben
• A korábban említett Jenkins plugin-ek szükségesek hozzá
• A korábban említett QA eszközök szükségesek hozzá
$ cd $JENKINS_HOME/jobs
$ mkdir php-template
$ cd php-template
$ wget https://raw.github.com/sebastianbergmann/php-jenkins-
template/master/config.xml
$ cd ..
$ chown -R jenkins:jenkins php-template/
$ java -jar jenkins-cli.jar -s http://localhost:8080 reload-
configuration
28. Project specifikus XML fájlok
• Az egyes eszközöket vezérli
(phpcs.xml, phpdoc.xml, phpmd.xml, phpunit.xm
l)
• A CI-t vezérli (build.xml)
• Konfigurációs paraméterek beállítása, hogy a
folyamat a megfelelő paraméterekkel fusson le
a megfelelő fájlokon
29. build.xml
• “target” szekciók szabályozzák, hogy milyen
feladatok hajthatóak végre
• “Clean” target
• “Prepare” target
• Párhuzamos végrehajtás
31. Új project készítése
• Megadjuk a project nevét a
“Job name” menüpontnál”
• Kiválasztjuk a “Copy existing
job” opciónál a “php-template”
opciót
• Rákattintunk az OK gombra
33. Új project készítése
• Source code management résznél beállítjuk a
projecthez tartozó verziókezelő rendszer
paramétereit
• Git esetén meg kell adni a repository URL-t és
a branch-et, amelyen a CI-t szeretnénk futtatni
34. Új project készítése
• Ha rendszeresen szeretnénk futtatni
(ajánlott), “Build triggers” szekció beállítása
• Rákattintunk a save gombra
39. Az előadáson szó volt:
• Mi is az a continuous integration és miért jó ez
nekünk
• Milyen fontosabb elemei vannak
• Hogyan kell felépíteni egy CI környezetet
Jenkins segítségével
• Minőségbiztosítási eszközök PHP-ben
• Alternatív lehetőségek az egyes
komponensekre