Jenkins Acceleration


dunkelfrosch.com | twitter.com/dunkelfrosch | github.com/paterik
v0.9.5, german
https://en.wikipedia.org/wiki/Gratuity#/media/File:Waiters.jpg
1
Introduction
❖ who am I?
❖ PID: Patrick Paechnatz
❖ Task: Senior BS Developer
❖ Host: move:elevator, Dresden
❖ UpTime: 38y (~17y Developer)
❖ ENV: C++, C#, Erlang, Python, PHP

dunkelfrosch.com | twitter.com/dunkelfrosch | github.com/paterik
2
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
Jenkins, Einführung, … eine Retrospektive
Jenkins, 

Retrospektive
Part 1, Intro-/Retrospektive
https://elasticbox.com/blog/elasticbox-jenkins-plugin-easy-continuous-integration-setup/
4
Jenkins
❖ Was ist Jenkins?
❖ AD/CB/CI/CD/CD++ (operativer Syntax)
❖ Jenkins, Level 1 - Monolith
❖ Jenkins, Level 2 - Master/Slave
❖ Jenkins, Level 3 - Pipelining
❖ Jenkins, Skalierung (SysOps)
5
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
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
Jenkins
❖ Operativer Syntax
❖ Agile Development
❖ Continuous Build
❖ Continuous Integration
❖ Continuous Delivery
❖ Continuous Deployment
8
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
Jenkins
10
Jenkins
11
Jenkins
12
Jenkins
13
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
Agenda, Jenkins
15
Jenkins
❖ Jenkins, Level 2 - Master/Slave
❖ Jenkins Server mit dedizierten Master-/Slave-

Build-Prozessoren-Konfiguration
❖ Auslagerung von lastintensiven Prozessen auf

speziell präparierte Knoten
❖ Aufgaben-Trennung nach entsprechenden
Anforderungen möglich
16
Jenkins
17
Jenkins
18
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
Jenkins
20
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
Jenkins
22
Jenkins
23
Jenkins
24
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
Jenkins, Scaling, … Kubernetes & Co
Jenkins, 

Kubernetes Scaling
Part 2.1, Jenkins Scaling
https://elasticbox.com/blog/elasticbox-jenkins-plugin-easy-continuous-integration-setup/
26
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
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
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
Jenkins, Kubernetes
30
base kubernetes service definitions inside master and minion node
Jenkins, Kubernetes
31
complete 3 node sample (1 master, 2 minions, 4 pods, 8 container, 2 services 1 replication controller)
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
Jenkins, Kubernetes
33
Jenkins, Kubernetes
34
Jenkins, Kubernetes
35
Jenkins, Kubernetes
36
Jenkins, Kubernetes
37
Meta-Informationen
öffentliche IP
Jenkins, Kubernetes
38
Jenkins, Kubernetes
39
Jenkins, Kubernetes
40
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
Jenkins, Kubernetes
42
Jenkins, Kubernetes
❖ Aufbau Jenkins Master/Slave Docker-Images
❖ Jenkins-Slave-JNLP Build-Prozessor kann für

jede beliebige Anforderung als dediziertes Image
bereitgestellt werden (Go/Rust/Python/RoR …)
❖ Zwingend notwendig: das Jenkins-Slave-JNLP Build-
Prozessor Image erbt direkt oder indirekt vom
[ jenkinsci/jnlp-slave ] Basis-Image
43
Jenkins, Kubernetes
44
Jenkins, Scaling, … Kubernetes & Co
Jenkins, 

Kubernetes Scaling
Part 2.1, Practical Example
https://elasticbox.com/blog/elasticbox-jenkins-plugin-easy-continuous-integration-setup/
45
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
Jenkins, Kubernetes II
❖ Aufbau Testprojekt Jenkins Master/Slave CI
❖ Schritt 1: Einrichtung des Jenkins-Masters
❖ Basis-Konfiguration (1 Step)
❖ Kubernetes-API Credentials (2 Steps)
❖ Kubernetes-Plugin Konfiguration (4 Steps)
47
Jenkins, Kubernetes II
48
Jenkins, Kubernetes II
49
Jenkins, Kubernetes II
50
Jenkins, Kubernetes II
51
Jenkins, Kubernetes II
52
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
Jenkins, Kubernetes II
54
Jenkins, Kubernetes II
55
Jenkins, Kubernetes II
56
Jenkins, Kubernetes II
57
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
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
PHPUnit Parallels
❖ Herausforderung
❖ PHPUnit Laufzeit-Optimierungen
❖ PHPUnit Parallelisierung mit „liuggio/fastest“
❖ PHPUnit Parallelisierung mit „paratest“
❖ Fazit
60
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
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
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
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
PHPUnit Parallels
65
PHPUnit Parallels
66
PHPUnit Parallels
67
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
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
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
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
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
Questions ?
73
Comments?
https://joind.in/talk/470d0
74
Thank You!
❖ References und Links
❖ Jenkins, Jenkins Scaling, Deployment Pattern

▶︎ http://jenkins.io | https://github.com/carlossg/jenkins-kubernetes-plugin

▶︎ https://cloud.google.com/solutions/jenkins-on-container-engine

▶︎ http://www.rightscale.com/blog/cloud-management-best-practices/dynamic-scaling-jenkins-cloud

▶︎ https://puppet.com/blog/continuous-delivery-vs-continuous-deployment-what-s-diff

▶︎ https://cloud.google.com/solutions/jenkins-on-container-engine
❖ Kubernetes

▶︎ http://kubernetes.io | http://kubernetes.io/docs/user-guide/kubectl-cheatsheet

▶︎ https://www.infoq.com/articles/scaling-docker-with-kubernetes
❖ PHPUnit Test Parallelization (Github)

▶︎ https://github.com/liuggio/fastest | https://github.com/brianium/paratest
❖ Slide Projectfiles (Github)

▶︎ https://github.com/dunkelfrosch/docker-jenkins-php 

▶︎ https://github.com/dunkelfrosch/docker-jenkins-slave-php-7

75

Jenkins Acceleration

  • 1.
    Jenkins Acceleration 
 dunkelfrosch.com |twitter.com/dunkelfrosch | github.com/paterik v0.9.5, german https://en.wikipedia.org/wiki/Gratuity#/media/File:Waiters.jpg 1
  • 2.
    Introduction ❖ who amI? ❖ PID: Patrick Paechnatz ❖ Task: Senior BS Developer ❖ Host: move:elevator, Dresden ❖ UpTime: 38y (~17y Developer) ❖ ENV: C++, C#, Erlang, Python, PHP
 dunkelfrosch.com | twitter.com/dunkelfrosch | github.com/paterik 2
  • 3.
    Agenda ❖ Um waswird 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
  • 5.
    Jenkins ❖ Was istJenkins? ❖ AD/CB/CI/CD/CD++ (operativer Syntax) ❖ Jenkins, Level 1 - Monolith ❖ Jenkins, Level 2 - Master/Slave ❖ Jenkins, Level 3 - Pipelining ❖ Jenkins, Skalierung (SysOps) 5
  • 6.
    Jenkins ❖ Was istJenkins? ❖ 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 istJenkins? ❖ 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
  • 8.
    Jenkins ❖ Operativer Syntax ❖Agile Development ❖ Continuous Build ❖ Continuous Integration ❖ Continuous Delivery ❖ Continuous Deployment 8
  • 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
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
    Jenkins ❖ Jenkins, Level1 - 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
  • 15.
  • 16.
    Jenkins ❖ Jenkins, Level2 - Master/Slave ❖ Jenkins Server mit dedizierten Master-/Slave-
 Build-Prozessoren-Konfiguration ❖ Auslagerung von lastintensiven Prozessen auf
 speziell präparierte Knoten ❖ Aufgaben-Trennung nach entsprechenden Anforderungen möglich 16
  • 17.
  • 18.
  • 19.
    Jenkins ❖ Jenkins, Level3 - 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
  • 20.
  • 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
  • 22.
  • 23.
  • 24.
  • 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 ❖ Wasist 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
  • 30.
    Jenkins, Kubernetes 30 base kubernetesservice definitions inside master and minion node
  • 31.
    Jenkins, Kubernetes 31 complete 3node sample (1 master, 2 minions, 4 pods, 8 container, 2 services 1 replication controller)
  • 32.
    Jenkins, Kubernetes ❖ Einrichtungdes 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
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
    Jenkins, Kubernetes ❖ AufbauJenkins 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
  • 42.
  • 43.
    Jenkins, Kubernetes ❖ AufbauJenkins Master/Slave Docker-Images ❖ Jenkins-Slave-JNLP Build-Prozessor kann für
 jede beliebige Anforderung als dediziertes Image bereitgestellt werden (Go/Rust/Python/RoR …) ❖ Zwingend notwendig: das Jenkins-Slave-JNLP Build- Prozessor Image erbt direkt oder indirekt vom [ jenkinsci/jnlp-slave ] Basis-Image 43
  • 44.
  • 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
  • 47.
    Jenkins, Kubernetes II ❖Aufbau Testprojekt Jenkins Master/Slave CI ❖ Schritt 1: Einrichtung des Jenkins-Masters ❖ Basis-Konfiguration (1 Step) ❖ Kubernetes-API Credentials (2 Steps) ❖ Kubernetes-Plugin Konfiguration (4 Steps) 47
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 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
  • 54.
  • 55.
  • 56.
  • 57.
  • 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
  • 60.
    PHPUnit Parallels ❖ Herausforderung ❖PHPUnit Laufzeit-Optimierungen ❖ PHPUnit Parallelisierung mit „liuggio/fastest“ ❖ PHPUnit Parallelisierung mit „paratest“ ❖ Fazit 60
  • 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 ❖ PHPUnitLaufzeit-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 ❖ PHPUnitParallelisierung 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
  • 65.
  • 66.
  • 67.
  • 68.
    PHPUnit Parallels ❖ PHPUnitParallelisierung 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 ❖ PHPUnitParallelisierung 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 ❖ PHPUnitParallelisierung 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
  • 73.
  • 74.
  • 75.
    Thank You! ❖ Referencesund Links ❖ Jenkins, Jenkins Scaling, Deployment Pattern
 ▶︎ http://jenkins.io | https://github.com/carlossg/jenkins-kubernetes-plugin
 ▶︎ https://cloud.google.com/solutions/jenkins-on-container-engine
 ▶︎ http://www.rightscale.com/blog/cloud-management-best-practices/dynamic-scaling-jenkins-cloud
 ▶︎ https://puppet.com/blog/continuous-delivery-vs-continuous-deployment-what-s-diff
 ▶︎ https://cloud.google.com/solutions/jenkins-on-container-engine ❖ Kubernetes
 ▶︎ http://kubernetes.io | http://kubernetes.io/docs/user-guide/kubectl-cheatsheet
 ▶︎ https://www.infoq.com/articles/scaling-docker-with-kubernetes ❖ PHPUnit Test Parallelization (Github)
 ▶︎ https://github.com/liuggio/fastest | https://github.com/brianium/paratest ❖ Slide Projectfiles (Github)
 ▶︎ https://github.com/dunkelfrosch/docker-jenkins-php 
 ▶︎ https://github.com/dunkelfrosch/docker-jenkins-slave-php-7
 75