SlideShare uma empresa Scribd logo
1 de 75
Baixar para ler offline
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

Mais conteúdo relacionado

Mais procurados

WebLogic im Docker Container
WebLogic im Docker ContainerWebLogic im Docker Container
WebLogic im Docker ContainerAndreas Koop
 
Docker Einführung @GPN15
Docker Einführung @GPN15Docker Einführung @GPN15
Docker Einführung @GPN15m1no
 
Versionskontrolle mit Subversion und Git
Versionskontrolle mit Subversion und GitVersionskontrolle mit Subversion und Git
Versionskontrolle mit Subversion und Gitpaultcochrane
 
Entwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbH
Entwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbHEntwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbH
Entwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbHstijink
 
docker.io @ CentOS 7 - Secure And Portable Containers Made Easy
docker.io @ CentOS 7 - Secure And Portable Containers Made Easydocker.io @ CentOS 7 - Secure And Portable Containers Made Easy
docker.io @ CentOS 7 - Secure And Portable Containers Made Easyinovex GmbH
 
Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?Thorsten Kamann
 
BED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerBED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerPatrick Baumgartner
 
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...inovex GmbH
 
Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)Chris Michael Klinger
 
docker.io - Secure And Portable Containers Made Easy
docker.io - Secure And Portable Containers Made Easydocker.io - Secure And Portable Containers Made Easy
docker.io - Secure And Portable Containers Made Easyinovex GmbH
 
OpenShift-Build-Pipelines: Build ► Test ► Run!
OpenShift-Build-Pipelines: Build ► Test ► Run!OpenShift-Build-Pipelines: Build ► Test ► Run!
OpenShift-Build-Pipelines: Build ► Test ► Run!Tobias Schneck
 
Java EE hochverfügbar
Java EE hochverfügbarJava EE hochverfügbar
Java EE hochverfügbargedoplan
 
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-Pipelines
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-PipelinesContinuous Testing: Integration- und UI-Testing mit OpenShift-Build-Pipelines
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-PipelinesTobias Schneck
 

Mais procurados (19)

WebLogic im Docker Container
WebLogic im Docker ContainerWebLogic im Docker Container
WebLogic im Docker Container
 
Docker Einführung @GPN15
Docker Einführung @GPN15Docker Einführung @GPN15
Docker Einführung @GPN15
 
Deployment 2.0
Deployment 2.0Deployment 2.0
Deployment 2.0
 
Versionskontrolle mit Subversion und Git
Versionskontrolle mit Subversion und GitVersionskontrolle mit Subversion und Git
Versionskontrolle mit Subversion und Git
 
Was ist Docker ?
Was ist Docker ?Was ist Docker ?
Was ist Docker ?
 
Entwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbH
Entwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbHEntwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbH
Entwicklungsprozess und Arbeit mit Symfony2 in der fotocommunity GmbH
 
docker.io @ CentOS 7 - Secure And Portable Containers Made Easy
docker.io @ CentOS 7 - Secure And Portable Containers Made Easydocker.io @ CentOS 7 - Secure And Portable Containers Made Easy
docker.io @ CentOS 7 - Secure And Portable Containers Made Easy
 
Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?
 
BED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerBED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als Entwickler
 
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
 
Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)
 
docker.io - Secure And Portable Containers Made Easy
docker.io - Secure And Portable Containers Made Easydocker.io - Secure And Portable Containers Made Easy
docker.io - Secure And Portable Containers Made Easy
 
WebLogic im Docker Container
WebLogic im Docker ContainerWebLogic im Docker Container
WebLogic im Docker Container
 
OpenShift-Build-Pipelines: Build ► Test ► Run!
OpenShift-Build-Pipelines: Build ► Test ► Run!OpenShift-Build-Pipelines: Build ► Test ► Run!
OpenShift-Build-Pipelines: Build ► Test ► Run!
 
Ant Maven
Ant MavenAnt Maven
Ant Maven
 
Java EE hochverfügbar
Java EE hochverfügbarJava EE hochverfügbar
Java EE hochverfügbar
 
Ant im Detail
Ant im DetailAnt im Detail
Ant im Detail
 
Dockerize It - Mit apex in die amazon cloud
Dockerize It - Mit apex in die amazon cloudDockerize It - Mit apex in die amazon cloud
Dockerize It - Mit apex in die amazon cloud
 
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-Pipelines
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-PipelinesContinuous Testing: Integration- und UI-Testing mit OpenShift-Build-Pipelines
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-Pipelines
 

Destaque

Distributed Logging System Using Elasticsearch Logstash,Beat,Kibana Stack and...
Distributed Logging System Using Elasticsearch Logstash,Beat,Kibana Stack and...Distributed Logging System Using Elasticsearch Logstash,Beat,Kibana Stack and...
Distributed Logging System Using Elasticsearch Logstash,Beat,Kibana Stack and...Sanjog Kumar Dash
 
Distributed Logging Architecture in the Container Era
Distributed Logging Architecture in the Container EraDistributed Logging Architecture in the Container Era
Distributed Logging Architecture in the Container EraGlenn Davis
 
Ruby & Rails Error Handling
Ruby & Rails Error HandlingRuby & Rails Error Handling
Ruby & Rails Error HandlingSimon Maynard
 
Managing the logs of your (Rails) applications - RailsWayCon 2011
Managing the logs of your (Rails) applications - RailsWayCon 2011Managing the logs of your (Rails) applications - RailsWayCon 2011
Managing the logs of your (Rails) applications - RailsWayCon 2011lennartkoopmann
 
Consolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic BeatsConsolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic Beatsgcatt
 
Managing Your Security Logs with Elasticsearch
Managing Your Security Logs with ElasticsearchManaging Your Security Logs with Elasticsearch
Managing Your Security Logs with ElasticsearchVic Hargrave
 
Hướng dẫn cài đặt và cấu hình cacti trên cent os
Hướng dẫn cài đặt và cấu hình cacti trên cent osHướng dẫn cài đặt và cấu hình cacti trên cent os
Hướng dẫn cài đặt và cấu hình cacti trên cent oslaonap166
 
Architecture microservices avec docker
Architecture microservices avec dockerArchitecture microservices avec docker
Architecture microservices avec dockergcatt
 

Destaque (8)

Distributed Logging System Using Elasticsearch Logstash,Beat,Kibana Stack and...
Distributed Logging System Using Elasticsearch Logstash,Beat,Kibana Stack and...Distributed Logging System Using Elasticsearch Logstash,Beat,Kibana Stack and...
Distributed Logging System Using Elasticsearch Logstash,Beat,Kibana Stack and...
 
Distributed Logging Architecture in the Container Era
Distributed Logging Architecture in the Container EraDistributed Logging Architecture in the Container Era
Distributed Logging Architecture in the Container Era
 
Ruby & Rails Error Handling
Ruby & Rails Error HandlingRuby & Rails Error Handling
Ruby & Rails Error Handling
 
Managing the logs of your (Rails) applications - RailsWayCon 2011
Managing the logs of your (Rails) applications - RailsWayCon 2011Managing the logs of your (Rails) applications - RailsWayCon 2011
Managing the logs of your (Rails) applications - RailsWayCon 2011
 
Consolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic BeatsConsolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic Beats
 
Managing Your Security Logs with Elasticsearch
Managing Your Security Logs with ElasticsearchManaging Your Security Logs with Elasticsearch
Managing Your Security Logs with Elasticsearch
 
Hướng dẫn cài đặt và cấu hình cacti trên cent os
Hướng dẫn cài đặt và cấu hình cacti trên cent osHướng dẫn cài đặt và cấu hình cacti trên cent os
Hướng dẫn cài đặt và cấu hình cacti trên cent os
 
Architecture microservices avec docker
Architecture microservices avec dockerArchitecture microservices avec docker
Architecture microservices avec docker
 

Semelhante a Jenkins Acceleration

Agile Breakfast - If it hurts do it more often
Agile Breakfast - If it hurts do it more oftenAgile Breakfast - If it hurts do it more often
Agile Breakfast - If it hurts do it more oftenpingworks
 
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturContinuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturQAware GmbH
 
OSDC 2013 | Continuous Integration in data centers by Michael Prokop
OSDC 2013 | Continuous Integration in data centers by Michael ProkopOSDC 2013 | Continuous Integration in data centers by Michael Prokop
OSDC 2013 | Continuous Integration in data centers by Michael ProkopNETWAYS
 
Entwicklung mit Chef und Vagrant - PHPUG HH
Entwicklung mit Chef und Vagrant - PHPUG HHEntwicklung mit Chef und Vagrant - PHPUG HH
Entwicklung mit Chef und Vagrant - PHPUG HHFlorian Holzhauer
 
Kaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinKaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinStephan Kaps
 
Agile Bodensee - Introducing Continuous Delivery
Agile Bodensee - Introducing Continuous DeliveryAgile Bodensee - Introducing Continuous Delivery
Agile Bodensee - Introducing Continuous Deliverypingworks
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesGregor Biswanger
 
Serverprovisioning in einer dynamischen Infrastruktur
Serverprovisioning in einer dynamischen InfrastrukturServerprovisioning in einer dynamischen Infrastruktur
Serverprovisioning in einer dynamischen Infrastrukturinovex GmbH
 
Virtualisierung 2008/2009 - eine Standorbestimmung
Virtualisierung 2008/2009 - eine StandorbestimmungVirtualisierung 2008/2009 - eine Standorbestimmung
Virtualisierung 2008/2009 - eine StandorbestimmungHenning Sprang
 
Continuous Deployment mit Rex und Jenkins
Continuous Deployment mit Rex und JenkinsContinuous Deployment mit Rex und Jenkins
Continuous Deployment mit Rex und Jenkinsinovex GmbH
 
JAX 2015 - Continuous Integration mit Java & Javascript
JAX 2015 - Continuous Integration mit Java & JavascriptJAX 2015 - Continuous Integration mit Java & Javascript
JAX 2015 - Continuous Integration mit Java & Javascriptdzuvic
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrants0enke
 
Opensource Tools für das Data Center Management
Opensource Tools für das Data Center ManagementOpensource Tools für das Data Center Management
Opensource Tools für das Data Center Managementinovex GmbH
 
Implementierung der Knowledge Engineering Workbench in myCBR
Implementierung der Knowledge Engineering Workbench in myCBRImplementierung der Knowledge Engineering Workbench in myCBR
Implementierung der Knowledge Engineering Workbench in myCBRAlexander Hundt
 
Deployment pipeline mit maven, chef und jenkins
Deployment pipeline mit maven, chef und jenkinsDeployment pipeline mit maven, chef und jenkins
Deployment pipeline mit maven, chef und jenkinsBild GmbH & Co. KG
 
Robustes Testen mit Selenium
Robustes Testen mit SeleniumRobustes Testen mit Selenium
Robustes Testen mit Seleniumx-celerate
 
Infonova Devopscon München 2015
Infonova Devopscon München 2015Infonova Devopscon München 2015
Infonova Devopscon München 2015Georg Öttl
 

Semelhante a Jenkins Acceleration (20)

Agile Breakfast - If it hurts do it more often
Agile Breakfast - If it hurts do it more oftenAgile Breakfast - If it hurts do it more often
Agile Breakfast - If it hurts do it more often
 
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturContinuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
 
Docker Workbench
Docker WorkbenchDocker Workbench
Docker Workbench
 
OSDC 2013 | Continuous Integration in data centers by Michael Prokop
OSDC 2013 | Continuous Integration in data centers by Michael ProkopOSDC 2013 | Continuous Integration in data centers by Michael Prokop
OSDC 2013 | Continuous Integration in data centers by Michael Prokop
 
Entwicklung mit Chef und Vagrant - PHPUG HH
Entwicklung mit Chef und Vagrant - PHPUG HHEntwicklung mit Chef und Vagrant - PHPUG HH
Entwicklung mit Chef und Vagrant - PHPUG HH
 
Kaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinKaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes sein
 
Agile Bodensee - Introducing Continuous Delivery
Agile Bodensee - Introducing Continuous DeliveryAgile Bodensee - Introducing Continuous Delivery
Agile Bodensee - Introducing Continuous Delivery
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
 
Serverprovisioning in einer dynamischen Infrastruktur
Serverprovisioning in einer dynamischen InfrastrukturServerprovisioning in einer dynamischen Infrastruktur
Serverprovisioning in einer dynamischen Infrastruktur
 
Virtualisierung 2008/2009 - eine Standorbestimmung
Virtualisierung 2008/2009 - eine StandorbestimmungVirtualisierung 2008/2009 - eine Standorbestimmung
Virtualisierung 2008/2009 - eine Standorbestimmung
 
Continuous Deployment mit Rex und Jenkins
Continuous Deployment mit Rex und JenkinsContinuous Deployment mit Rex und Jenkins
Continuous Deployment mit Rex und Jenkins
 
What is new in xen Server
What is new in xen ServerWhat is new in xen Server
What is new in xen Server
 
Einführung in Docker
Einführung in DockerEinführung in Docker
Einführung in Docker
 
JAX 2015 - Continuous Integration mit Java & Javascript
JAX 2015 - Continuous Integration mit Java & JavascriptJAX 2015 - Continuous Integration mit Java & Javascript
JAX 2015 - Continuous Integration mit Java & Javascript
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrant
 
Opensource Tools für das Data Center Management
Opensource Tools für das Data Center ManagementOpensource Tools für das Data Center Management
Opensource Tools für das Data Center Management
 
Implementierung der Knowledge Engineering Workbench in myCBR
Implementierung der Knowledge Engineering Workbench in myCBRImplementierung der Knowledge Engineering Workbench in myCBR
Implementierung der Knowledge Engineering Workbench in myCBR
 
Deployment pipeline mit maven, chef und jenkins
Deployment pipeline mit maven, chef und jenkinsDeployment pipeline mit maven, chef und jenkins
Deployment pipeline mit maven, chef und jenkins
 
Robustes Testen mit Selenium
Robustes Testen mit SeleniumRobustes Testen mit Selenium
Robustes Testen mit Selenium
 
Infonova Devopscon München 2015
Infonova Devopscon München 2015Infonova Devopscon München 2015
Infonova Devopscon München 2015
 

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 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
  • 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
  • 5. 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
  • 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
  • 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
  • 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
  • 16. 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
  • 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
  • 30. Jenkins, Kubernetes 30 base kubernetes service definitions inside master and minion node
  • 31. Jenkins, Kubernetes 31 complete 3 node sample (1 master, 2 minions, 4 pods, 8 container, 2 services 1 replication controller)
  • 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
  • 43. 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
  • 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
  • 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
  • 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 ❖ 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
  • 75. 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