.consulting .solutions .partnership Build- und Delivery-Pipelines als Code mit Jenkins Alexander Schwartz, Principal IT Consultant Entwicklertag Frankfurt – 16.02.2017 Build- und Delivery-Pipelines als Code mit Jenkins 1 Rollenverteilung im Projekt 2 Jenkins Pipelines 3 Demo 4 Rezepte 5 Projekterfahrungen © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 2 Mein Sponsor und Arbeitgeber – msg systems ag Gegründet 1980 18 Büros in Deutschland präsent in 25 Länder Mehr als 6.000 Mitarbeiter 727 Millionen € Umsatz 2015 © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 3 Wer ich bin – Principal IT Consultant im Geschäftsbereich Travel & Logistics 501 gefundene Geocaches 2 Kinder 1 Frau 14 Jahre Java 7 Jahre PL/SQL 3,5 Jahre Direktbank 7 Jahre Absatzfinanzierung © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz @ahus1de 4 Build- und Delivery-Pipelines als Code mit Jenkins 1 Rollenverteilung im Projekt 2 Jenkins Pipelines 3 Demo 4 Rezepte 5 Projekterfahrungen © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 5 Rollenverteilung im Projekt Klassische Rollenverteilung in Projekten XML Developer Build Engineer © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 6 Rollenverteilung im Projekt Klassische Rollenverteilung in Projekten XML XML Developer Build Engineer © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 7 Rollenverteilung im Projekt Herausforderungen • Ä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 © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 8 Build- und Delivery-Pipelines als Code mit Jenkins 1 Rollenverteilung im Projekt 2 Jenkins Pipelines 3 Demo 4 Rezepte 5 Projekterfahrungen © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 9 Jenkins Pipelines Jenkins Pipelines 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 © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 10 Jenkins Pipelines Variante für die Demo • 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 © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 11 Build- und Delivery-Pipelines als Code mit Jenkins 1 Rollenverteilung im Projekt 2 Jenkins Pipelines 3 Demo 4 Rezepte 5 Projekterfahrungen © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 12 Demo Demo © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 13 Build- und Delivery-Pipelines als Code mit Jenkins 1 Rollenverteilung im Projekt 2 Jenkins Pipelines 3 Demo 4 Rezepte 5 Projekterfahrungen © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 14 Rezepte Hello World Alles ist Groovy Code. Ausgabe von Text, Kommentare im Code, Aufruf externen Kommandos node { echo 'Hello world! // Comments are supported! sh 'date' } © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 15 Rezepte Pipelines Mehrere Schritte. Einzeln in der GUI dargestellt. Logs separiert pro Stage. node { stage("one") { echo 'Hello world!' } stage("two") { echo 'Goodbye.' } } © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 16 Rezepte Fehlerbehandlung Fehlerbehandlung mit try/catch node { def err = null; try { /* ... */ } catch (caughtError) { err = caughtError currentBuild.result = "FAILURE" } finally { /* ... */ if (err) { throw err } } } © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 17 Rezepte E-Mail-Versand 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}>" } © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 18 Rezepte Parallele Ausführung 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" } ) } © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 19 Rezepte Fehleranalyse Die Log-Dateien können lang werden. Für die Fehleranalyse bietet sich das build-failure-analyzer (BFA) Plugin an © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 20 Rezepte Build parametrisieren Nur die 10 letzten Builds aufheben properties([[$class: 'BuildDiscarderProperty', strategy: [$class: 'LogRotator', artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '', numToKeepStr: '10']]]) node { /* ... */ } © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 21 Rezepte Daten aufheben Archiver, Publisher für Checkstyle, JUnit und HTML archiveArtifacts 'myFiles/*.pdf' step([$class: 'JUnitResultArchiver', testResults: '**/surefirereports/*.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']) © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 22 Rezepte Snippet Generator © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 23 Build- und Delivery-Pipelines als Code mit Jenkins 1 Rollenverteilung im Projekt 2 Jenkins Pipelines 3 Demo 4 Rezepte 5 Projekterfahrungen © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 24 Projekterfahrungen Projektstatistik eines mittelgroßen Projekts 11 Monate Laufzeit 14 Personen haben das Jenkinsfile geändert (80% der Entwickler im Projekt) 122 Änderungen am Jenkinsfile* * ohne mehrfache Änderungen des gleichen Entwicklers an einem Tag © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 25 Projekterfahrungen Jenkins Pipelines 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 © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 26 Links Jenkins Pipeline: https://jenkins.io/doc/book/pipeline/ @ahus1de © msg | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 27 Alexander Schwartz Principal IT Consultant +49 171 5625767 [email protected] @ahus1de .consulting .solutions .partnership msg systems ag (Headquarters) Robert-Buerkle-Str. 1, 85737 Ismaning Germany www.msg-systems.com