3. Agenda
❖ Um was wird es in diesem Vortrag gehen?
❖ Jenkins , Retrospektive
❖ Jenkins Scaling , Jenkins im Kubernetes Cluster
❖ Jenkins Parallels , Tests in parallelen Tasks
❖ Fazit
3
4. Jenkins, Einführung, … eine Retrospektive
Jenkins,
Retrospektive
Part 1, Intro-/Retrospektive
https://elasticbox.com/blog/elasticbox-jenkins-plugin-easy-continuous-integration-setup/
4
6. Jenkins
❖ Was ist Jenkins?
❖ webbasiertes, erweiterbares Software-System zur
kontinuierlichen Integration (CI), Delivery (CD) und
Deployment (CD) von Anwendungen
❖ Seit 2011 Fork des von Kohsuke Kawaguchi bei
SUN Microsystems entwickelten CI-Tools Hudson
❖ umfangreiche Plugin-Unterstützung und aktive
OpenSource Community
6
7. Jenkins
❖ Was ist Jenkins?
❖ Unterstützt eine Vielzahl der bekanntesten Build-
Management-Tools wie Apache Ant, Maven und
Gradle (sowie native Build-Prozessoren)
❖ Unterstützt die wichtigsten Versions-Verwaltungs-
Systeme wie GIT, Mercurial, SVN …
❖ Unterstützt unterschiedlichste Compiler-Sprachen
sowie eine Vielzahl an automatisierte Testverfahren
7
9. Jenkins
❖ Operativer Syntax
❖ Agile Development
❖ Ticketbasierende Feature-/Bug-/Hotfix- Branch-
bezogene Entwicklung in agilen Sprints
❖ Lokale DevTool-Integration zur dynamischen/
statischen Code-Analyse (CI-Build-Tools)
❖ Nutzung von Versions-Verwaltungssystemen
9
14. Jenkins
❖ Jenkins, Level 1 - Monolith 💤
❖ Jenkins Server ohne dedizierte Master/Slave-Build-
Prozessor-Konfiguration und einer Vielzahl von
Compiler-/Skript-Versionen
❖ Umfangreiches Aufgabenspektrum, keine Trennung
zwischen CI-/CD-/Metric-Builds
❖ Übernimmt auch Build-untypische Aufgaben …
z.B.: Backup-Tasks und DB-Dump-Generatoren
14
19. Jenkins
❖ Jenkins, Level 3 - Pipelining
❖ Voraussetzung: Master-/Slave-Build-Prozessor-
Setup des Jenkins-Servers
❖ Aufteilung unterschiedlicher Build-Schritte in
kleinere Aufgaben und Verbindung dieser in
Pipes → Voraussetzung für das CD-Build-Pattern.
❖ Wird als Plugin in Jenkins direkt unterstützt
19
21. Jenkins
❖ Jenkins BlueOcean
❖ Weiterentwicklung des bisherigen Pipelining-
Plugins als (fast) eigenständige Applikation mit
Jenkins-Unterbau
❖ Verbesserte Visualisierung von Abhängigkeiten
inklusive umfangreichem Task-/Dashboard Umbau
❖ Aktuell noch im Experimental State
21
25. Jenkins
❖ Jenkins, Skalierung (SysOps)
❖ Vertikale Skalierung
❖ Nur durch Bereitstellung von zusätzlicher
Hardware (neue Slaves) oder Erweiterung des
Jenkins Masters möglich
❖ Horizontale Skalierung
❖ Cloud-Anbieter/lokales Container-Swarming
25
26. Jenkins, Scaling, … Kubernetes & Co
Jenkins,
Kubernetes Scaling
Part 2.1, Jenkins Scaling
https://elasticbox.com/blog/elasticbox-jenkins-plugin-easy-continuous-integration-setup/
26
27. Jenkins, Kubernetes
❖ Anforderung
❖ Was ist Kubernetes
❖ Einrichtung des Jenkins-CI Clusters
❖ Aufbau Jenkins Master/Slave Docker-Images
❖ Aufbau Testprojekt Jenkins Master/Slave CI
❖ Fazit?
27
28. Jenkins, Kubernetes
❖ Anforderung
❖ Automatische Erzeugung von dedizierten JNLP
Slaves für jeden gestarteten Build-Prozessor
❖ Einfache, Docker-Image-basierende Jenkins-Master
und Slave-Definition.
❖ Einfache und effiziente Verwaltung des betreffenden
Jenkins-Clusters? → Kubernetes
28
29. Jenkins, Kubernetes
❖ Was ist Kubernetes
❖ Google’s OpenSource Container-Orchestrierung für
mittlere und größere Cloud-basierende Applikationen
❖ Fortschrittliches Konzept zur Verwaltung,
Provisionierung, Skalierung von „containerisierten“
Anwendungen in Alternative zu Docker-Swarm
❖ Umfangreiche (und leicht verständliche) API und
beschreibende Konfigurations-Schicht
29
32. Jenkins, Kubernetes
❖ Einrichtung des Jenkins-CI Clusters
❖ Erstellung eines GCloud-Accounts, cloud.google.com
❖ Erstellung eines GCloud-Projekts
❖ Installation der CLI Tools (gcloud, kubectl)
❖ Authentifizierung des GCloud-Accounts und
OAuth2-Aktivierung der zugehörigen CLI-Tools
32
41. Jenkins, Kubernetes
❖ Aufbau Jenkins Master/Slave Docker-Images
❖ Eine Voraussetzung für gewähltes Kubernetes
Deployment und Einsatz des Jenkins-Kubernetes
Plugin sind vordefinierte Docker-Images
❖ Verwendung der aktuelle Jenkins-Version 2.7.4
sowie des JNLP Kubernetes Plugin für den
Jenkins-Master
❖ einige weitere kleinere Optimierungen…
41
45. Jenkins, Scaling, … Kubernetes & Co
Jenkins,
Kubernetes Scaling
Part 2.1, Practical Example
https://elasticbox.com/blog/elasticbox-jenkins-plugin-easy-continuous-integration-setup/
45
46. Jenkins, Kubernetes II
❖ Aufbau Testprojekt Jenkins Master/Slave CI
❖ Unser Beispiel-/Testprojekt wird einige Symfony-
Versionen sowie Sylius-Shop-Projekt über einen
Build-/CI-Prozess prüfen
46
53. Jenkins, Kubernetes II
❖ Aufbau Testprojekt Jenkins Master/Slave CI
❖ Schritt 2: Einrichtung der Test-Jobs
❖ CB/CI Jobs für Symfony 2.7.n, 2.8.n, 3.1.n
❖ CB/CI Job für Sylius Shop 0.19.0
❖ Laufzeit-Tests und Überwachung durch lokalen
Kubernetes-Proxy und dem kubectl CLI-Tool
53
58. Jenkins, Kubernetes II
❖ Fazit
❖ Der Slide-Beispiel-Cluster läuft auf cloud.google.com
In einem deutschen Rechenzentrum - die Daten sind
also wirklich sicher !!! ;)
❖ IRL sollte man auf eigene Hardware vertrauen - der
Kubernetes Cluster kann ohne Probleme auf eigenen
bare metals ausgerollt/einfach konfiguriert werden
❖ Jenkins Kubernetes Cluster hilft gesund zu skalieren
58
59. Jenkins, Parallele Tests … speedUp our test runtime
Jenkins,
PHPUnit Parallels
Part 3, Parallele Tests
https://elasticbox.com/blog/elasticbox-jenkins-plugin-easy-continuous-integration-setup/
59
61. PHPUnit Parallels
❖ Herausforderung
❖ Vielzahl von komplexen Business-Applikationen in
PHP (> 60.000 LOC)
❖ möglichst hohe Testabdeckung in jedem Projekt
❖ Vielzahl an Tests (> 500)
❖ „ungesundes“ Verteilungs-Verhältnis zwischen
Unit-/Integrations- und Funktionalen Tests
61
62. PHPUnit Parallels
❖ Herausforderung
❖ Hauptproblem: PHPUnit nutzt für alle Operationen
nur einen Kern in einem CLI Prozess!
❖ Anwendung des „Fail-Local-First“ Prinzip
(lokales CB/CI vor PR)
❖ Nervige PHPUnit Wartezeiten vor dem Jenkins-Build
❖ Lange CI-Builds und Warteschlangen auf dem Jenkins
62
63. PHPUnit Parallels
❖ PHPUnit Laufzeit-Optimierungen
❖ Nutzung von SQLite-InMemory TestDB’s mit
funktionalen Wrappern für einige MySQL-Methoden
❖ Einführung von PHP 7 auf dem Jenkins und lokalen
Entwicklungs-Umgebungen.
❖ Symfony Tweaks (Profiler-BL, Container-Build Hack)
❖ Strukturelle Aufräumarbeiten auf dem Jenkins
63
64. PHPUnit Parallels
❖ PHPUnit Parallelisierung mit „liuggio/fastest“
❖ Was ist liuggio/fastest?
❖ Tool zur CLI Parallelisierung im Schwerpunkt
PHPUnit-Warp unter Symfony
❖ Unterstützt verschiedene Storage-Adapter (DBAL,
MongoDb, SQLite)
❖ Behat 2 Unterstützung (als Extension)
64
68. PHPUnit Parallels
❖ PHPUnit Parallelisierung mit „liuggio/fastest“
❖ Zusammenfassung
❖ Sehr schnelle Testausführung mit Möglichkeit zur
gezielten Angabe der zu verwendenden Kerne je
nach Test-Verzeichnis (findPipe)
❖ Unterstützung von DB-Splits (ORM/ODM) für
Fixture-basierende Tests (→functional tests)
68
69. PHPUnit Parallels
❖ PHPUnit Parallelisierung mit „brianium/paratest“
❖ Was ist brianium/paratest?
❖ Plugin für PHPUnit zur parallelen Ausführung
von Laufzeit-Tests
❖ (ebenfalls) Unterstützung für DB-Splits (SQLite)
❖ Automatische PHPUnit XML-Config Auswertung
❖ bekanntestes Tool zur Test-Parallelisierung
69
70. PHPUnit Parallels
❖ PHPUnit Parallelisierung mit „brianium/paratest“
❖ Zusammenfassung
❖ Schnelle Testausführung unter Anwendung des
bekannten PHPUnit CLI Syntax
❖ Echtes PHPUnit-Plugin mit Anbindung an die
PHPUnit XML-Projekt-Konfiguration.
❖ Einfache Installation und schnelle Test-Integration
70
71. PHPUnit Parallels
❖ Fazit, positive Aspekte
❖ Verwendung von Parallelisierung in Test-Abläufen
unter Verwendung von PHPUnit/BEHAT sparen
wertvolle Entwicklung- und Code-Integrations-Zeit
❖ Können in zeitkritischen Prozess-Entscheidungen von
Vorteil sein (testabgedeckte Hotfix-Deployments)
❖ Unterstützen Entwickler bei Anwendung der „Fail-
Local-First“ Regel (häufigere lokale Testausführung)
71
72. PHPUnit Parallels
❖ Fazit, negative Aspekte
❖ Initialer Konfigurations-/Integrationsaufwand im
jeweiligen Projekt und dem betreffenden Build-Server
❖ Prozesse mit XDebug-Profiler Relevanz unterliegen
Einschränkungen in der Parallelisierung (bspw.
Generierung der CodeCoverage-Metric)
72