14
.
12
.
2016

Saubere CI-Builds mit Jenkins Pipeline Jobs

Schlägt der CI Build fehl? Divide et Impera!

Einleitung

In meinem vorherigen Blogpost habe ich über automatisiertes Testen in agilen Software Projekten geschrieben und das End-to-Test Framework CodecepJS kurz vorgestellt.

In diesem Blogpost will ich zwar auch auf automatisierte Tests eingehen, aber im Speziellen soll gezeigt werden, wie man mittels Jenkins Pipeline Jobs und schrittweise gegliederten Build-Schritten Transparenz, Wartbarkeit und Struktur in die Continuous Integration Build Chain bringen kann.

Als Beispiel für eine auf diese Weise aufgebaute Pipeline wähle ich mein Customfield Editor Plugin for Atlassian JIRA® aus. Zielpublikum für diesen Blogpost sind erfahrene Benutzer von Jenkins. Basis bildet ein selbstgehosteter Jenkins Server in Version 2.33 und ein laufender Docker Prozess.

 

 

Warum brauche ich das?

Gute Frage! Wenn Sie lediglich kleine Builds in Ihrem Jenkins konfiguriert haben, die eine spezielle Aufgabe erfüllen und in unter einer Minute gebaut haben, dann ist das Thema für Sie evtl. weniger interresant. Aber auch schon wenn Sie bspw. zwei Jobs haben - einen zum Bauen der Anwendung und den zweiten zum Deployen - eignen sich Jenkins Pipeline Jobs bereits für Sie.

Speziell für langläufige Build Jobs mit vielen Schritten eignen sich Jenkins Pipeline Jobs besonders.

Software Engineering ...
Software Engineering ...

Die Vorteile von Jenkins Pipeline Jobs sind:

  • Transparenz
  • Struktur
  • Wartbarkeit
  • Stabilität
  • Schnellere Fehleridentifikation
  • Gute Erkennbarkeit von Performance-Bottle-Necks

Diese Vorteile werden in den nächsten Abschnitten des Blogposts anhand von Beispielen dargestellt.

 

 

Was genau ist ein Jenkins Pipeline Job?

Kurz gesagt ein spezieller Jenkins Job-Typ, welcher mittels einer auf Groovy Syntax basierenden deskriptiven Datei namens Jenkinsfile funktioniert. In dieser Datei lassen sich mittels vorgegebener Bausteine die verschiedenen Build-Schritte beschreiben.

Eine einfache Jenkinsfile sieht beispielsweise so aus:

github:e29c91c8b59da4e064a15944e76bfcbf

Durch die Verwendung des Jenkinsfile erreicht man StrukturWartbarkeit und Transparenz, da man ein gut dokumentiertes und stabiles System verwendet in dem man sich schnell zurecht findet.

 

Als nächstes legt man einfach einen neuen Jenkins Pipeline Job an.

Jenkins Pipeline Create Job
Jenkins Pipeline Create Job

 

Und hinterlegt den Inhalt der Jenkinsfile.

Jenkins Pipeline Create Job - Config
Jenkins Pipeline Create Job - Config

Dabei ist es natürlich besser das Jenkinsfile innerhalb des Versionskontrollsystems abzulegen, der Anschaulichkeit halber wurde aber diese Variante gewählt.

 

Baut man anschließend den Job so werden die mittels stage gekennzeichneten Abschnitte als einzelne Build-Schritte dargestellt.

Jenkins Pipeline Job - View
Jenkins Pipeline Job - View

 

 

 

Mehr Übersichtlichkeit mit Blue Ocean Beta Plugin

Jenkins CI Inc. arbeitet aktuell am Blue Ocean Plugin, welches die Pipeline Jobs in einer sehr anmutenden und sauber strukturierten Form darstellt. Ich persönlich bin jetzt schon ein riesen Fan und nutze das Plugin bereits intensiv.

Die klassische Job-Ansicht eines Pipeline Jobs sieht bspw. so aus:

Jenkins Pipeline Classic Job View
Jenkins Pipeline Classic Job View

Hier lassen sich Performance-Bottle-Necks sehr gut erkennen. Denn die Laufzeit wird für jeden Schritt angezeigt und man sieht bspw. dass der End-to-End Tests Schritt ca. 12 Minuten dauert, was in meinem Fall dem langsamen Dual Core CPU in meinem HPE ProLiant MicroServer Gen8 geschuldet ist auf dem der Jenkins läuft. Vielleicht gibt es ja zu Weihnachten einen Intel Xeon Quadcore CPU mit VT-x … mal sehen ob ich brav war.

 

Die Blue Ocean Pipeline Job Ansicht sieht so aus:

Jenkins Pipeline Blue Ocean View
Jenkins Pipeline Blue Ocean View

Das ist natürlich Balsam für die Augen und ich würde es mir am liebsten einrahmen. Kudos an die EntwicklerInnen von Jenkins - das rockt! Da ich ja auch Webentwickler bin, hab ich mal in den React Code geschaut und das ist alles sehr schön umgesetzt. Bspw. bauen sie die Status Indicator Icon SVGs mittels React zusammen. Sehr schön. Aber wir wollen nicht zu sehr abschweifen.

 

Alle in den folgenden Abschnitten gezeigten Screenshots sind mit aktiviertem Blue Ocean Plugin aufgenommen

 

 

 

Beispiel aus dem echten Leben - Customfield Editor Plugin Master Pipeline

Das Customfield Editor Plugin for Atlassian JIRA® wird mittels der Atlassian SDK gebaut. Wir wissen nun was ein Jenkins Pipeline Job und das Jenkinsfile sind. Daher kann ich Ihnen jetzt ein Beispiel aus dem echten Leben zeigen. Die Customfield Editor Plugin Master Pipeline führt folgende Schritte aus:

  • Auschecken des Quelltextes aus dem Versionskontrollsystem (GIT)
  • Bauen des Quelltextes und ausführen der Unit-Tests mittels speziellem Docker-Container
  • Hochfahren von JIRA® mit installiertem Plugin innerhalb eines Docker-Containers
  • Hochfahren von Selenium Server und Headless-Chrome innerhalb eines Docker-Containers
  • Ausführen der REST-API Tests
  • Ausführen der End-to-End Tests
  • Archivieren der Testresultate und Build-Artefakte
  • Herunterfahren der Docker-Container

 

Ein erfolgreicher Pipeline Durchlauf sieht dann wie folgt aus:

Jenkins Pipeline Blue Ocean Run Successs
Jenkins Pipeline Blue Ocean Run Success

Ich persönlich stehe voll auf den parallel laufenden npm install Schritt. Die Darstellung und das Design sind einfach pures Gold!

 

Das tolle an Blue Ocean ist dabei, dass sich nun alle Schritte und Kommandos aufklappen lassen und man somit eine enorme Übersichtlichkeit erreicht. Das folgende GIF zeigt die Interaktionsmöglichkeiten.

Jenkins Pipeline Blue Ocean Inspect Steps
Jenkins Pipeline Blue Ocean Inspect Steps

 

 

Die Testergebnisse werden unter dem Tab Tests angezeigt. Dabei muss man innerhalb der Jenkinsfile mittels des junit ‘junit.xml’ Kommandos die Junit-XML-Testergebnisse angeben, die Jenkins erfassen soll. Sind alle Tests erfolgreich, so wird das mit einem schönen Banner belohnt.

Jenkins Pipeline Blue Ocean Run Successs Tests
Jenkins Pipeline Blue Ocean Run Success Tests

 

Instabil und somit orange wird der Build, wenn Tests fehlschlagen.

Jenkins Pipeline Blue Ocean Run Unstable
Jenkins Pipeline Blue Ocean Run Unstable

 

Klickt man nun auf Tests so sieht man welche Tests fehlschlagen.

Jenkins Pipeline Blue Ocean Run Unstable Tests
Jenkins Pipeline Blue Ocean Run Unstable Tests

 

Fehlgeschlagene Läufe der Pipeline werden rot angezeigt. Es wird dann markiert welcher Schritt der Pipeline fehlgeschlagen ist. Die Fehlersuche gestaltet sich sehr einfach.

Jenkins Pipeline Blue Ocean Run Failure
Jenkins Pipeline Blue Ocean Run Failure

 

 

Die Build Artefakte können mittels des archiveArtifacts Kommandos hinterlegt werden.

Jenkins Pipeline Blue Ocean Run Successs Tests
Jenkins Pipeline Blue Ocean Run Success Artifacts

 

 

 

Hier das zu den Screenshots gehörende Jenkinsfile. Ich werde es jetzt einfach unkommentiert hier stehen lassen, um die Struktur und die Möglichkeiten zu veranschaulichen. (Von der Verwendung meiner Pre-Built Docker Images rate ich ab, da ich diese ggf. verändere und nicht für Stabilität garantiere.)

github:8a1f774a1b75e64e2fadd5e34c23870c

 

Als Best-Practice Empfehlungen zu Pipeline Jobs sei noch gesagt:

  • Lagere komplexere Dinge (die nicht in eine Zeile passen) in separate Shell-Skripte aus und rufe sie vom Jenkinsfile aus auf.
  • Lege das Jenkinsfile innerhalb des Versionskontrollsystem ab. (So kann man Jobs einfacher auf andere Jenkins-Server migrieren oder im Falle eines Datenverlusts die Jobs sehr schnell wiederherstellen.)
  • Denke an E-Mail oder SLACK Benachrichtigungen in deiner Pipeline.
  • Versuche Idempotenz zu erreichen. Wenn die Pipeline in der Mitte abbricht, sollte durch einen Catch Block die Pipeline soweit aufgeräumt werden, sodass der nächste Lauf wieder mit sauberen Vorraussetzungen starten kann.
  • Teile das in stages ein was ein sinnhafter Schritt ist wie bspw. ‘Build’, ‘Deploy’ usw.

 

Als Best-Practice Empfehlungen zu Dockerized Builds sei gesagt:

  • Es hat sich gezeigt, dass mit Pre-Built Docker Images die bspw. das Atlassian SDK und Oracle Java JDK 8 enthalten am besten gefahren wird und der build enorm beschleunigt wird. Anfänglich hatt ich die Docker Images noch inerhalb der Pipeline gebaut, was natürlich lange dauert und unnötig ist.
  • Im Job selbst wird dann einfach nur das Pre-Built Image hochgefahren und mittels Volume Anweisungen der Workspace mit dem Docker Container geteilt und somit kann der Docker Container builds im Workspace ausführen. Build Artefakte können ausserhalb des Docker Containers archiviert werden.
  • Der Docker Container wird mittels run gestartet und das Kommando bspw. ‘atlas-package’, ‘./gradlew build’ oder ‘mvn package’ mit übergeben. Somit ist man sehr flexibel.
  • Seinen Jenkins sollte man so konfigurieren, dass der jenkins User docker Kommandos ohne sudo ausführen kann.

 

 

 

Ausblick

Pipeline all the things! Für meinen Projektalltag werde ich künftig alles auf Jenkins Pipeline Jobs aufbauen, da es eine klare Struktur vorgibt und auch das Jenkinsfile selbsterklärend ist. Mittels des node Kommandos liesen sich Builds auch bspw. auf Windows oder macOS Slaves parallel bauen.

Für Blue Ocean erhoffe ich mir doch noch die Umsetzung von JENKINS-36933, sodass man shell-Kommands auch labeln kann.

Wenn Sie Hilfe mit dem Aufsetzen eines Continuous Integration Systems mit Jenkins oder Atlassian Bamboo brauchen, wir bieten Atlassian Experts Dienste und DevOps Dienstleistungen an. Wir sind sehr erfahren im Umgang mit Jenkins und Atlassian Produkten. Darüber hinaus können wir den Prozess zusammen mit Ihrem Entwicklungsteam an Ihren Workflow anpassen. Schreiben Sie uns einfach unverbindlich über das unten eingebaute Kontaktformular.