Continuous Integration mit Jenkins

102
CONTINUOUS INTEGRATION MIT JENKINS Web DevCon 2011 InterContinental Hotel, Hamburg 17. Oktober 2011

description

Folien meines Vortrags zu Continuous Integration mit Jenkins auf der web Devon 2011 in Hamburg.

Transcript of Continuous Integration mit Jenkins

Page 1: Continuous Integration mit Jenkins

CONTINUOUS INTEGRATION MIT JENKINS

Web DevCon 2011InterContinental Hotel, Hamburg

17. Oktober 2011

Page 2: Continuous Integration mit Jenkins

DANTEALIGHIERI

* 1265✝ 1321

Page 3: Continuous Integration mit Jenkins
Page 4: Continuous Integration mit Jenkins

DieGöttlicheKomödie

Dante Alighieri

Page 5: Continuous Integration mit Jenkins
Page 6: Continuous Integration mit Jenkins
Page 7: Continuous Integration mit Jenkins

DIE ZEHN HÖLLENKREISEVorhölle

Die Wollustigen

Die Schlemmer

Die Verschwender

DieZornigen Die

Ketzer

Die Gewaltätigen

Die Mörder & Räuber

DieBetrüger

DieVerräter

Page 8: Continuous Integration mit Jenkins

DAS WAR 1320 A.D.

Page 9: Continuous Integration mit Jenkins

WIR HABEN 2011.

Page 10: Continuous Integration mit Jenkins

DER ELFTE HÖLLENKREISVorhölle

Die Wollustigen

Die Schlemmer

Die Verschwender

DieZornigen Die

Ketzer

DieGewaltätighen Die Mörder &

Räuber

DieBetrüger Die

Verräter

DieSpätintegrierer

Page 11: Continuous Integration mit Jenkins

SPÄTINTEGRIERER KOMMEN IN DIE

INTEGRATIONSHÖLLE

Page 12: Continuous Integration mit Jenkins

SIE WOLLEN NICHT MEHR IN DIE INTEGRATIONSHÖLLE?

Jenkins

Page 13: Continuous Integration mit Jenkins

STEPHAN SCHMIDT

Head of Web Sales Development bei der 1&1

Internet AG

PHP seit 1999

Autor & Redner

Page 14: Continuous Integration mit Jenkins

HAB‘S NOCH AUF KEINE EURO-MÜNZE GESCHAFFT :(

Page 15: Continuous Integration mit Jenkins

WIE KOMMT MAN IN DIE INTEGRATIONSHÖLLE?

Page 16: Continuous Integration mit Jenkins

WIE KOMMT MAN IN DIE INTEGRATIONSHÖLLE?

Tage bis zur Deadline : 20

Page 17: Continuous Integration mit Jenkins

dev

WIE KOMMT MAN IN DIE INTEGRATIONSHÖLLE?

dev

Tage bis zur Deadline : 20

Page 18: Continuous Integration mit Jenkins

10

dev

WIE KOMMT MAN IN DIE INTEGRATIONSHÖLLE?

dev

Tage bis zur Deadline :

Page 19: Continuous Integration mit Jenkins

5

dev

WIE KOMMT MAN IN DIE INTEGRATIONSHÖLLE?

dev

Tage bis zur Deadline :

Page 20: Continuous Integration mit Jenkins

0

dev

WIE KOMMT MAN IN DIE INTEGRATIONSHÖLLE?

dev

Tage bis zur Deadline :

Page 21: Continuous Integration mit Jenkins

0

dev

WIE KOMMT MAN IN DIE INTEGRATIONSHÖLLE?

dev

Tage bis zur Deadline :

Page 22: Continuous Integration mit Jenkins

0

dev

WIE KOMMT MAN IN DIE INTEGRATIONSHÖLLE?

dev

integrate

Tage bis zur Deadline :

Page 23: Continuous Integration mit Jenkins

0

dev

WIE KOMMT MAN IN DIE INTEGRATIONSHÖLLE?

devde

ploy

integrate

Tage bis zur Deadline :

Page 24: Continuous Integration mit Jenkins

0

dev

WIE KOMMT MAN IN DIE INTEGRATIONSHÖLLE?

devde

ploy

integrate

Tage bis zur Deadline :

Page 25: Continuous Integration mit Jenkins

WIE KOMMT MAN IN DIE INTEGRATIONSHÖLLE?

• Es finden parallele Entwicklungen auf einzelnen Rechnern der Mitarbeiter statt.

• Niemand hat alle Änderungen im Blick.

• Kurz vor dem Release-Termin werden alle Änderungen für das nächste Release zusammengeführt.

• Es werden keine automatisierten Tests erstellt.

• Es bleibt keine Zeit mehr, Seiteneffekte zu überprüfen.

Page 26: Continuous Integration mit Jenkins

WIE SIEHT ES IN DER INTEGRATIONSHÖLLE AUS?

• Es ist dunkel, meistens wird bis spät in die Nacht integriert.

• Die Entwickler haben feuerrote Köpfe.

• Schuldzuweisungen sind die einzige Kommunikation.

• Es werden hektisch Bugfixes für die Bugfixes der Bugfixes gemacht.

• Spitze oder harte Gegenstände sollten weggeschlossen werden.

Page 27: Continuous Integration mit Jenkins

WIE ENTKOMMEN SIE DER INTEGRATIONSHÖLLE?

• Erhöhen Sie die Frequenz der Integrationen in Ihrem Projekt.

• Führen Sie für Ihre Applikationen bei jeder Änderung einen vollständigen Build durch.

• Weisen Sie damit jeden Entwickler auf möglichst frühzeitig auf Probleme hin.

• Gefahr erkannt - Gefahr gebannt.

Page 28: Continuous Integration mit Jenkins

Jenkins ist ihr persönlicher CI Butler.

Page 29: Continuous Integration mit Jenkins

AUSWEG AUS DER INTEGRATIONSHÖLLE

Page 30: Continuous Integration mit Jenkins

AUSWEG AUS DER INTEGRATIONSHÖLLE

com

mit

Page 31: Continuous Integration mit Jenkins

AUSWEG AUS DER INTEGRATIONSHÖLLE

com

mit

com

mit

Page 32: Continuous Integration mit Jenkins

AUSWEG AUS DER INTEGRATIONSHÖLLE

com

mit

com

mit

Page 33: Continuous Integration mit Jenkins

AUSWEG AUS DER INTEGRATIONSHÖLLE

com

mit

com

mit

checkout

Page 34: Continuous Integration mit Jenkins

AUSWEG AUS DER INTEGRATIONSHÖLLE

com

mit

com

mit

checkout

Page 35: Continuous Integration mit Jenkins

AUSWEG AUS DER INTEGRATIONSHÖLLE

com

mit

com

mit

checkoutinfo

Page 36: Continuous Integration mit Jenkins

AUSWEG AUS DER INTEGRATIONSHÖLLE

com

mit

com

mit

checkoutinfo

Page 37: Continuous Integration mit Jenkins

JENKINS KANN NICHT ALLES ÜBERNEHMEN...

• Gemeinsame Codebasis und ein SCM sind nötig.

• Der Build muss vollkommen automatisiert funktionieren.

• Ihr Build muss schnell sein.

• Ihre Applikation muss über automatisierte Tests verfügen.

Page 38: Continuous Integration mit Jenkins

VORTEILE VON CONTINUOUS INTEGRATION

• Reduzierung der Risiken.

• Verbesserung der Produktqualität.

• Applikation „funktioniert“ zu jeder Zeit, sie haben jederzeit ein deploy-fähiges Artefakt.

• Konzentration auf das Wesentliche.

• Dokumentierter Build-Prozess.

Page 39: Continuous Integration mit Jenkins

INSTALLATION VON JENKINS

$ mkdir /usr/local/jenkins$ cd /usr/local/jenkins$ wget http://mirrors.jenkins-ci.org/war-stable/latest/↵ jenkins.war

$ export JENKINS_HOME=/usr/local/jenkins$ java -jar jenkins.war

• Downloaden

• Starten

Page 40: Continuous Integration mit Jenkins

FERTIG.

Page 41: Continuous Integration mit Jenkins

JENKINS SPRECH

• Alles, was Jenkins für Sie erledigt, ist ein Job.

• Von jedem Job gibt es mehrere Builds.

• Jeder Build führt zu einem Artefakt.

• Die Builds werden in eine Queue gelegt und von dort abgearbeitet.

Page 42: Continuous Integration mit Jenkins

ANLEGEN EINES JOBS

Page 43: Continuous Integration mit Jenkins

ANLEGEN EINES JOBS

Page 44: Continuous Integration mit Jenkins

ANLEGEN EINES JOBS

Page 45: Continuous Integration mit Jenkins

STARTEN EINES BUILDS

Page 46: Continuous Integration mit Jenkins

STARTEN EINES BUILDS

Page 47: Continuous Integration mit Jenkins

STARTEN EINES BUILDS

Page 48: Continuous Integration mit Jenkins

STARTEN EINES BUILDS

Page 49: Continuous Integration mit Jenkins

STARTEN EINES BUILDS

Page 50: Continuous Integration mit Jenkins

STATUS DES BUILDS

= Erfolgreich

= Instabil

= Fehlgeschlagen

= wird gebaut

= Keine Daten

= Green Balls Plugin

Page 51: Continuous Integration mit Jenkins

WAR DA NICHT WAS MIT „CONTINUOUS“?

• Jenkins kann Builds zu bestimmten Zeiten starten.

• „Nightly Builds“.

• Jenkins kann regelmäßig ihr SCM pollen und den Build dann starten, sobald sich etwas verändert hat.

• Feedback erfolgt in den meisten Fällen per Mail.

• Die Ergebnisse der Builds werden archiviert.

Page 52: Continuous Integration mit Jenkins

BUILD AUSLÖSER

Page 53: Continuous Integration mit Jenkins

PROJEKTGESUNDHEIT

>80% >60% >40% >20% ≦20%

Page 54: Continuous Integration mit Jenkins

DER ABLAUF BEI CONTINUOUS INTEGRATION

ProcessBuildCheckout

Page 55: Continuous Integration mit Jenkins

CHECKOUT

• Jenkins unterstützt verschiedene SCM-Systeme über Plugins.

• Installiert sind CVS und SVN.

• Weitere können einfach über den Plugin-Manager installiert werden.

Page 56: Continuous Integration mit Jenkins

KOMPILIEREN UND SYNTAKTISCHE PRÜFUNG

• Prüfung, ob der Quellcode syntaktische Fehler enthält.

• In einigen Sprachen schon automatisch enthalten, da der Quellcode kompiliert werden muss.

• In anderen Sprachen können Tools eingesetzt werden (z.B. JSLint für JavaScript, php -l für PHP)

Page 57: Continuous Integration mit Jenkins

AUTOMATISIERTE TESTS

• Software kann auf mehreren Ebenen getestet werden.

• Unit-Tests

• Integrationstests

• Akzeptanztests

• Jenkins erzeugt für die meisten xUnit-Frameworks Berichte über Testergebnisse und Testabdeckung.

Page 58: Continuous Integration mit Jenkins

POST-PROCESS SCHRITTE UND BERICHTE

• Jenkins Plugins führen keine Tests aus, erzeugen keine Dokumentationen und erheben keine Metriken.

• Dies muss ihr Build-Prozess leisten.

• Jenkins erstellt „nur“ Berichte oder kopiert und archiviert bereits erstellte Berichte.

• Interessant ist dabei die Entwicklung über die Zeit.

Page 59: Continuous Integration mit Jenkins

DOKUMENTATION GENERIEREN

• Generieren der API-Dokumentation aus dem Quellcode über javadoc, phpDocumentor, DocBlox, etc.

• Jenkins liefert noch weitere Plugins, um zusätzliche Dokumentationen zu erstellen, wie...

• SchemaSpy

• TaskScanner

Page 60: Continuous Integration mit Jenkins

CONTINUOUS INTEGRATION IST NICHT DAS ENDE.

• Syntaktische Prüfung und automatisierte Tests stellen sicher, dass Ihre Applikation funktioniert.

• Aber: Eine Applikation, die funktioniert, ist noch lange keine gute und einfach zu wartende Applikation :(

Page 61: Continuous Integration mit Jenkins

Kann ich sonst noch etwas für Sie tun?

Page 62: Continuous Integration mit Jenkins

CONTINUOUS INSPECTION

• Entspricht mein Code meinen Coding Guidelines?

• Ist mein Code zu kompliziert?

• Enthält mein Code ungenutzte Variablen, Klassen, Parameter?

• Enthält mein Code typische Programmierfehler?

Page 63: Continuous Integration mit Jenkins

Ihr kostenloser Senior-Entwickler, der rund um die Uhr Code-Reviews macht.

Page 64: Continuous Integration mit Jenkins

CODING STANDARDS PRÜFEN

• Verwenden Sie Checkstyle, oder ein Tool, das Checkstyle-kompatible Reports ausgibt, um Ihren Code auf Verletzungen zu prüfen.

• Diese werden direkt von einem Jenkins-Plugin verarbeitet.

• Das Jenkins Plugin „Warnings“ untersucht die Ausgaben im Build nach typischen Warning-Meldungen.

Page 65: Continuous Integration mit Jenkins

METRIKEN ERZEUGEN

• Integrieren Sie verschiedene Tools, die Code-Metriken aus ihrem Quellcode ermitteln:

• Anzahl der Zeilen, Klassen, Comment-Ratio, ...

• Zyklomatische Komplexität

• Ausgabedaten der meisten Tools können von verschiedenen Jenkins-Plugins verarbeitet und visualisiert werden.

Page 66: Continuous Integration mit Jenkins

CODE METRIKEN

Page 67: Continuous Integration mit Jenkins

DUPLIZIERTEN CODE ERKENNEN

• Integrieren Sie Tools, die duplizierten Code erkennen, z.B.

• PHP Copy/Paste Detector

• Die erzeugte XML-Datei kann direkt von einem Jenkins-Plugin verarbeitet werden.

Page 68: Continuous Integration mit Jenkins

ALLES ZUSAMMENFÜHREN

• Jedes der Plugins erstellt einen eigenen Report; bis man alle Metriken gesehen hat, muss man recht häufig klicken.

• Plugins führen die Daten zusammen:

• PHP_CodeBrowser verarbeitet die Logs stellt die Ergebnisse direkt im Sourcecode dar.

• Sonar-Plugin meldet die Daten an Sonar.

• Static Analysis Collector kann für Java eingesetzt werden.

Page 69: Continuous Integration mit Jenkins

PHP_CODEBROWSER

Page 70: Continuous Integration mit Jenkins

SONAR

Page 71: Continuous Integration mit Jenkins

STATIC ANALYSIS COLLECTOR

Page 72: Continuous Integration mit Jenkins

VERMEIDEN SIE EINENBUILD-STAU.

Page 73: Continuous Integration mit Jenkins

HALTEN SIE DIEBUILD-ZEITEN KURZ

• Messen Sie, wie lange ihr Build dauert und suchen Sie nach Wege diesen zu verkürzen, z.B. parallele Ausführung der Code-Metrik-Tools.

• Teilen Sie die Build-Schritte in Einzelbuilds

• Fail-Early, bei syntaktischen Fehlern keine Metriken.

• Langsame Schritte nur im Nightly-Build.

• Bauen Sie nicht jedes Changeset.

Page 74: Continuous Integration mit Jenkins

EINFÜHRUNG VON CONTINUOUS INTEGRATION

• Gehen Sie schrittweise vor, beginnen Sie mit einem Projekt.

• Definieren Sie am Anfang sehr wenige Regeln (z.B. Tests müssen durchlaufen).

• Diese müssen jedoch strikt eingehalten werden.

• Erheben Sie nur die Metriken, die Sie auch verstehen und die für Sie wichtig sind.

Page 75: Continuous Integration mit Jenkins

JENKINS PLUGINS

• Jenkins lässt sich sehr einfach über Plugins erweitern.

• Plugins können einfach über Web-Interface oder CLI-Client installiert werden.

• Aktuell (Stand 11.10) bereits 470 Plugins.

• Mit Plugins ist in Jenkins alles erweiterbar.

Page 76: Continuous Integration mit Jenkins

EIGENE PLUGINS SCHREIBEN

• Plugins werden in Java geschrieben und mit Maven gebaut

• Ein Plugin kann in 60 Sekunden erstellt und gebaut werden.

$ mvn jpi:create// Interaktive Eingabe des Namens

$ mvn jpi:run// Startet Jenkins-Testinstanz mit dem Plugin

$ mvn package// Erstellt installationsfähige HPI-Datei

Page 77: Continuous Integration mit Jenkins

JENKINS REMOTE API

• Jenkins bietet eine XML-, JSON- und Python API an:http://localhost:8080/api/xmlhttp://localhost:8080/api/jsonhttp://localhost:8080/api/python

• Dokumentation zur API gibt es unter :http://localhost:8080/api

• An fast jede URL kann man einfach /api/* anhängen.

Page 78: Continuous Integration mit Jenkins

JENKINS BUILD MONITORFÜR FIREFOX

• Fügt einen Eintrag in das Firefox-Kontext-Menü hinzu.

Page 79: Continuous Integration mit Jenkins

JENKINS BUILD MONITORFÜR FIREFOX

• Fügt einen Eintrag in das Firefox-Kontext-Menü hinzu.

• Zeigt des Status der Jobs in der Taskleiste an.

Page 80: Continuous Integration mit Jenkins

JENKINS BUILD MONITORFÜR FIREFOX

• Fügt einen Eintrag in das Firefox-Kontext-Menü hinzu.

• Zeigt des Status der Jobs in der Taskleiste an.

• Ermöglicht es, Builds direkt aus Firefox anzustoßen.

Page 81: Continuous Integration mit Jenkins

HUDSON STATUSFÜR CHROME

Page 82: Continuous Integration mit Jenkins

HUDSON STATUSFÜR CHROME

Page 83: Continuous Integration mit Jenkins

IPHONE HELPER

Page 84: Continuous Integration mit Jenkins

JENKINS UND PHP

Page 85: Continuous Integration mit Jenkins

Diese Aufgabe übernimmt Sebastian für Sie.

Page 86: Continuous Integration mit Jenkins

JENKINS PHP TEMPLATE

• Entwickelt von Sebastian Bergmann.

• Stellt eine fertige Konfiguration für eine PHP-basierten Jenkins Job zur Verfügung.

• Auf der Website findet man gleich noch ein Ant-Build-Skript für PHP-Projekte.

http://jenkins-php.org/

Page 87: Continuous Integration mit Jenkins

INSTALLATION DER PLUGINS

$ wget http://localhost:8080/jnlpJars/jenkins-cli.jar$ java -jar jenkins-cli.jar -s ... install-plugin checkstyle$ java -jar jenkins-cli.jar -s ... install-plugin cloverphp$ java -jar jenkins-cli.jar -s ... install-plugin dry$ java -jar jenkins-cli.jar -s ... install-plugin htmlpublisher$ java -jar jenkins-cli.jar -s ... install-plugin jdepend$ java -jar jenkins-cli.jar -s ... install-plugin plot$ java -jar jenkins-cli.jar -s ... install-plugin pmd$ java -jar jenkins-cli.jar -s ... install-plugin violations$ java -jar jenkins-cli.jar -s ... install-plugin xunit$ java -jar jenkins-cli.jar -s ... safe-restart

Page 88: Continuous Integration mit Jenkins

JENKINS PHP TEMPLATE

$ cd $JENKINS_HOME/jobs$ git clone git://github.com/sebastianbergmann/php-jenkins-↵ template.git php-template$ chown -R jenkins:nogroup php-template/

• Template installieren

$ java -jar jenkins-cli.jar -s ... reload-configuration

• Config neu laden

Page 89: Continuous Integration mit Jenkins

TOOLS FÜR DAS PROJEKT

$ pear config-set auto_discover 1$ pear install pear.phpqatools.org/phpqatools PHPDocumentor

• Verschiedene QA-Tools installieren

• ant-basiertes Build-File von der Website runterladen.

• Komplettes Beispiel-Projekt ist auf GitHub verfügbar

https://github.com/thePHPcc/bankaccount/

Page 90: Continuous Integration mit Jenkins

UND LOS GEHT‘S...

Page 91: Continuous Integration mit Jenkins

ENTHALTEN IM TEMPLATE

• Syntaktische Analyse mit „php -l“

• Ausführen von PHPUnit-Tests.

• API-Dokumentation mit phpDocumentor

• Metriken mit phploc PHP_Depend.

• Coding Standard Violations mit PHP_CodeSniffer und PHP Mess Detector

• Duplizierter Code mit PHP Copy/Paste Detector.

• Zusammenfassung über PHP_CodeBrowser.

Page 93: Continuous Integration mit Jenkins

ONE MORE THING...

Page 94: Continuous Integration mit Jenkins

GROWL NOTIFICATIONS

Page 95: Continuous Integration mit Jenkins

CONTINUOUS INTEGRATION GAME

• Benutzer bekommen Pluspunkte für erfolgreiche Builds und Minuspunkte für fehlgeschlagene Builds.

• Ergebnisse der statischen Analyse können auch mit einfließen.

Page 96: Continuous Integration mit Jenkins

CHUCK NORRIS PLUGIN

Page 97: Continuous Integration mit Jenkins

BIG RED BUTTON

Page 98: Continuous Integration mit Jenkins

EXTREME FEEDBACK BEARS

Page 99: Continuous Integration mit Jenkins

JENKINS UND NABAZTAG

Page 100: Continuous Integration mit Jenkins

WER BRICHT DEN BUILD?

Page 101: Continuous Integration mit Jenkins

MEHR INFORMATIONEN

Theorie & Praxis Praxis Fokus auf PHP