Build- und Delivery-Pipelines als Code mit Jenkins

Build- und Delivery-Pipelines als Code mit Jenkins

Build Konfigurationen in einem Continuous Integration Werkzeug wie Jenkins können über die Weboberfläche konfiguriert werden. Dokumentation in Form von Kommentaren und Nachvollziehbarkeit kommen dabei zu kurz. Änderungen an der Konfiguration bleiben Spezialisten überlasten, da niemand den Build kaputt machen will.
Dass dies auch anders geht, zeigt die Projekterfahrung mit dem Jenkins Pipeline Plugin: Die komplette Build-Konfiguration ist als Code zusammen mit dem Projekt eingecheckt. Jedes Teammitglied kann Änderungen an der Konfiguration vornehmen und vorab in einem Branch testen. Die Nachvollziehbarkeit ist dabei über die Historie und Commit-Kommentare der Quellcodeverwaltung möglich. Dokumentation im Quellcode der Build-Konfiguration ist dabei ausdrücklich erwünscht!
Der Vortrag gibt zunächst einen kurzen Einstieg in das Pipeline-Plugin. Danach zeichnet er die Erfahrungen in einem agilen Projekt nach und beschreibt die schrittweise Erweiterung des Build-Prozesses im Projektverlauf.

5f528a3f6814d28b583f31842e3e8d9e?s=128

Alexander Schwartz

February 16, 2017
Tweet

Transcript

  1. .consulting .solutions .partnership Build- und Delivery-Pipelines als Code mit Jenkins

    Alexander Schwartz, Principal IT Consultant Entwicklertag Frankfurt – 16.02.2017
  2. Build- und Delivery-Pipelines als Code mit Jenkins 2 © msg

    | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz Rollenverteilung im Projekt 1 Jenkins Pipelines 2 Demo 3 Rezepte 4 Projekterfahrungen 5
  3. 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
  4. 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 Kinder 501 gefundene Geocaches @ahus1de
  5. Build- und Delivery-Pipelines als Code mit Jenkins 5 © msg

    | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz Rollenverteilung im Projekt 1 Jenkins Pipelines 2 Demo 3 Rezepte 4 Projekterfahrungen 5
  6. Rollenverteilung im Projekt Klassische Rollenverteilung in Projekten © msg |

    Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 6 Build Engineer Developer XML
  7. Rollenverteilung im Projekt Klassische Rollenverteilung in Projekten © msg |

    Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 7 Developer Build Engineer XML XML
  8. 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
  9. Build- und Delivery-Pipelines als Code mit Jenkins 9 © msg

    | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz Rollenverteilung im Projekt 1 Jenkins Pipelines 2 Demo 3 Rezepte 4 Projekterfahrungen 5
  10. 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
  11. 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
  12. Build- und Delivery-Pipelines als Code mit Jenkins 12 © msg

    | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz Rollenverteilung im Projekt 1 Jenkins Pipelines 2 Demo 3 Rezepte 4 Projekterfahrungen 5
  13. Demo Demo © msg | Februar 2017 | Entwicklertag Frankfurt

    | Build- und Delivery-Pipelines | Alexander Schwartz 13
  14. Build- und Delivery-Pipelines als Code mit Jenkins 14 © msg

    | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz Rollenverteilung im Projekt 1 Jenkins Pipelines 2 Demo 3 Rezepte 4 Projekterfahrungen 5
  15. 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' }
  16. 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.' } }
  17. 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 } } }
  18. 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: "team@home.com", subject: "Jenkins build has finished with ${currentBuild.result}", body: "See <${env.BUILD_URL}>" }
  19. 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" } ) }
  20. 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
  21. 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 { /* ... */ }
  22. 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'])
  23. Rezepte Snippet Generator © msg | Februar 2017 | Entwicklertag

    Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz 23
  24. Build- und Delivery-Pipelines als Code mit Jenkins 24 © msg

    | Februar 2017 | Entwicklertag Frankfurt | Build- und Delivery-Pipelines | Alexander Schwartz Rollenverteilung im Projekt 1 Jenkins Pipelines 2 Demo 3 Rezepte 4 Projekterfahrungen 5
  25. 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*
  26. 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
  27. Links © msg | Februar 2017 | Entwicklertag Frankfurt |

    Build- und Delivery-Pipelines | Alexander Schwartz 27 Jenkins Pipeline: https://jenkins.io/doc/book/pipeline/ @ahus1de
  28. .consulting .solutions .partnership Alexander Schwartz Principal IT Consultant +49 171

    5625767 alexander.schwartz@msg-systems.com @ahus1de msg systems ag (Headquarters) Robert-Buerkle-Str. 1, 85737 Ismaning Germany www.msg-systems.com