Date post: | 15-Apr-2017 |
Category: |
Technology |
Upload: | patrick-paechnatz |
View: | 243 times |
Download: | 0 times |
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