.consulting .solutions .partnership
Build- und Delivery-Pipelinesals Code mit JenkinsAlexander Schwartz, Principal IT Consultant
Entwicklertag Frankfurt – 16.02.2017
Build- und Delivery-Pipelines als Code mit Jenkins
2© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz
Rollenverteilung im Projekt1
Jenkins Pipelines2
Demo3
Rezepte4
Projekterfahrungen5
Mein Sponsor und Arbeitgeber – msg systems ag
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 3
Gegründet 1980
Mehr als 6.000 Mitarbeiter
727 Millionen € Umsatz 2015
präsent in
25 Länder
18 Büros
in Deutschland
Wer ich bin – Principal IT Consultant im Geschäftsbereich Travel & Logistics
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 4
14 Jahre Java
7 Jahre PL/SQL
7 Jahre
Absatzfinanzierung
3,5 Jahre Direktbank
1 Frau
2 Kinder501 gefundene
Geocaches
@ahus1de
Build- und Delivery-Pipelines als Code mit Jenkins
5© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz
Rollenverteilung im Projekt1
Jenkins Pipelines2
Demo3
Rezepte4
Projekterfahrungen5
Rollenverteilung im Projekt
Klassische Rollenverteilung in Projekten
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 6
Build EngineerDeveloper
XML
Rollenverteilung im Projekt
Klassische Rollenverteilung in Projekten
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 7
Developer Build Engineer
XML
XML
Rollenverteilung im Projekt
Herausforderungen
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 8
• Änderung der Build-Konfiguration nicht auf eine Person beschränken
• Versionierung der Build-Konfiguration für Nachvollziehbarkeit und Rollback
• Sicherheitsnetz zum Ausprobieren von Änderungen an der Build-Konfiguration
Build- und Delivery-Pipelines als Code mit Jenkins
9© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz
Rollenverteilung im Projekt1
Jenkins Pipelines2
Demo3
Rezepte4
Projekterfahrungen5
Jenkins Pipelines
Jenkins Pipelines
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 10
Version 1.0 verfügbar als Jenkins Workflow Dezember 2014
Umbenannt in Jenkins Pipeline Januar 2016
Verfügbar als Plugin für Jenkins 1.x
Teil der Jenkins Distribution seit Jenkins 2.x
Jenkins Pipelines
Variante für die Demo
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 11
• Alle Konfiguration sind in der Datei Jenkinsfile enthalten
• Build-Konfiguration ist in Groovy geschrieben
• Jenkinsfile ist im Root des Git-Repositories eingecheckt
• Multibranch-Pipeline legt für jeden Branch einen Job in einem Folder an
Build- und Delivery-Pipelines als Code mit Jenkins
12© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz
Rollenverteilung im Projekt1
Jenkins Pipelines2
Demo3
Rezepte4
Projekterfahrungen5
Demo
Demo
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 13
Build- und Delivery-Pipelines als Code mit Jenkins
14© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz
Rollenverteilung im Projekt1
Jenkins Pipelines2
Demo3
Rezepte4
Projekterfahrungen5
Rezepte
Hello World
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 15
Alles ist Groovy Code. Ausgabe von Text, Kommentare im Code, Aufruf externen Kommandos
node {
echo 'Hello world!
// Comments are supported!
sh 'date'
}
Rezepte
Pipelines
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 16
Mehrere Schritte. Einzeln in der GUI dargestellt. Logs separiert pro Stage.
node {
stage("one") {
echo 'Hello world!'
}
stage("two") {
echo 'Goodbye.'
}
}
Rezepte
Fehlerbehandlung
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 17
Fehlerbehandlung mit try/catch
node {
def err = null;
try {
/* ... */
} catch (caughtError) {
err = caughtError
currentBuild.result = "FAILURE"
} finally {
/* ... */
if (err) {
throw err
}
}
}
Rezepte
E-Mail-Versand
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 18
E-Mail-Versand unter bestimmten Bedingungen
if (currentBuild.result != 'SUCCESS' && currentBuild.result != null
/* && env.BRANCH_NAME == 'master' */ ) {
def to = emailextrecipients([
[$class: 'CulpritsRecipientProvider'],
[$class: 'RequesterRecipientProvider']
])
mail to: to,
cc: "[email protected]",
subject: "Jenkins build has finished with ${currentBuild.result}",
body: "See <${env.BUILD_URL}>"
}
Rezepte
Parallele Ausführung
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 19
Mehrere Stages werden parallel ausgeführt. Schöne Darstellung im „Blue Ocean“ Theme.
node {
parallel(
a: {
echo "this is branch a"
},
b: {
echo "this is branch b"
}
)
}
Rezepte
Fehleranalyse
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 20
Die Log-Dateien können lang werden.
Für die Fehleranalyse bietet sich das build-failure-analyzer (BFA) Plugin an
Rezepte
Build parametrisieren
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 21
Nur die 10 letzten Builds aufheben
properties([[$class: 'BuildDiscarderProperty',
strategy: [$class: 'LogRotator', artifactDaysToKeepStr: '',
artifactNumToKeepStr: '', daysToKeepStr: '',
numToKeepStr: '10']]])
node {
/* ... */
}
Rezepte
Daten aufheben
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 22
Archiver, Publisher für Checkstyle, JUnit und HTML
archiveArtifacts 'myFiles/*.pdf'
step([$class: 'JUnitResultArchiver', testResults: '**/surefire-
reports/*.xml'])
step([$class: 'CheckStylePublisher', pattern: '**/checkstyle-result.xml',
unstableTotalAll: '0', usePreviousBuildAsReference: false])
publishHTML(target: [allowMissing: true, alwaysLinkToLastBuild: false,
keepAll: true, reportDir: 'yourReportDir', reportFiles: 'yourReportFile',
reportName: 'yourReportName'])
Rezepte
Snippet Generator
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 23
Build- und Delivery-Pipelines als Code mit Jenkins
24© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz
Rollenverteilung im Projekt1
Jenkins Pipelines2
Demo3
Rezepte4
Projekterfahrungen5
Projekterfahrungen
* ohne mehrfache Änderungen des gleichen Entwicklers an einem Tag
Projektstatistik eines mittelgroßen Projekts
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 25
11 Monate Laufzeit
14 Personen haben das Jenkinsfile geändert
(80% der Entwickler im Projekt)
122 Änderungen am Jenkinsfile*
Projekterfahrungen
Jenkins Pipelines
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 26
Vorteile:
• Entwickler können Build-Konfiguration selber ändern, dadurch kein Engpass im Projekt
• Versionierung der Build-Konfiguration für gute Nachvollziehbarkeit und Rollback
• Branches als Sicherheitsnetz zum Ausprobieren von Änderungen an der Build-Konfiguration
• Dokumentation im Code möglich (und erwünscht)
Nachteile:
• Für bekannte Funktionen aus der Web-GUI müssen die Script-Befehle neu gesucht werden
(Snippet Generator kann helfen)
• Nicht alle Plugins unterstützen Jenkins Pipelines
(aber es werden ständig mehr)
@ahus1de
Links
© msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 27
Jenkins Pipeline:
https://jenkins.io/doc/book/pipeline/
@ahus1de
.consulting .solutions .partnership
Alexander Schwartz
Principal IT Consultant
+49 171 5625767
@ahus1de
msg systems ag (Headquarters)
Robert-Buerkle-Str. 1, 85737 Ismaning
Germany
www.msg-systems.com