Gib mir mal Bescheid

Im heutigen (etwas kürzeren) Beitrag geht es darum, wie man Upsource über den aktuellen Buildstatus von Jenkins informieren kann, so dass man, bevor man ein Review anfängt, gleich sehen kann, ob der Branch überhaupt kompiliert (oder auch den Qualitätsstandards entspricht).

Upsource bietet eine Schnittstelle, an welche man den Buildstatus schicken (lassen) kann. Dafür müsst ihr einfach ein POST-Request im JSON-Format an euren Upsource-Server schicken, genauer gesagt an die Adresse eures Servers mit dem Suffix /~buildStatus, also z.B.:
http://UPSOURCE_URL:PORT/upsource/~buildStatus

Laut Doku müsst ihr dem Request folgende Parameter zwingend mitgeben:

  • Eindeutiger Buildkey
  • Zustand des Builds (in_progress, failed, success)
  • Die URL zum Build
  • Die ID des Projektes in Upsource, auf die sich der Build bezieht
  • Die Revision des Commits

Wir gehen davon aus, dass Jenkins auf einem Windowsserver läuft, mit einem Jenkinsfile konfiguriert ist und über die Pipelinefunktion alle Branches unseres git-Repositorys baut. Um Upsource über die einzelnen Schritte Bescheid geben zu können, ist es jetzt notwendig, zuerst einmal die Git-Revision des aktuellen Commits zu erhalten. Dies tut ihr über folgende Methode:

Diese Methode ruft ihr _nach_ dem Aktualisieren eurer Workingcopy (scm checkout) auf und speichert den Hash am besten in eine lokale Variable, um ihn später wieder verwenden zu können.

Dann benötigen wir die Funktion, welche Upsource über den aktuellen Zustand Bescheid sagt. Um keinen doppelten Code zu haben, lagern wir auch das in eine eigene Methode aus.

Zeile 4: Im ersten Schritt setzen wir den Buildstatus auf FAILED, da FAILURE und UNSTABLE Upsource nicht bekannt sind und wir uns dazu entscheiden, auch UNSTABLE als Fehlschlag zu deklarieren.


Zeile 7: Als nächstes definieren wir den geforderten Body des Requests im JSON-Format. Die Revision wird beim Aufruf der Methode mitübergeben, ebenso wie der Buildstatus. Hierbei geben wir zusätzlich noch den Namen des Projektes mit, damit das in Upsource mit angezeigt wird, sonst steht da nämlich “null” als Name des Builds. Über die globale Environmentvariable env können wir auf den Branchnamen, die aktuelle Build-ID sowie die Build-URL zugreifen. Als Projektname legen wir den Namen fest, den wir in Upsource vergeben haben.


Zeile 17: Dem HTTP-Request geben wir als acceptType und contentType mit, dass es sich um ein UTF-8 kodiertes JSON-Format handelt. Damit sich der Jenkins-Server bei Upsource anmelden kann, müssen wir dem Request-Aufruf noch den Namen der Credentials übergeben, in welchen wir die Zugangsdaten zu Upsource hinterlegt haben. Zuletzt übergeben wir dem Request-Befehl noch den Sendemodus – in unserem Fall POST -, den oben definierten Body, die URL zum Upsource-Server und ein Timeout. Dieses Timeout ist wichtig, falls der Body aus unerfindlichen Gründen falsche Informationen beinhalten sollte (z.B. beim Testen). Wenn ihr nämlich kein Timeout angebt, wartet der Methodenaufruf ewig und der Build wird nie enden.


Zeile 16-23: Den Aufruf packen wir zudem noch in einen Try-Catch-Block, damit eine mögliche Timeout-Exception nicht den kompletten Build zum Absturz bringt.


Diese Methode rufen wir jetzt, nach dem Auslesen der Git-Revision, in einer eigenen Stage auf:

Damit teilen wir Upsource mit, dass der Buildprozess läuft. In Upsource sieht das dann folgendermaßen aus:

Die kleine Uhr zeigt an, dass diese Revision gerade gebaut wird.

 

 

Am Ende unseres Buildscripts bzw. Jenkinsfiles rufen wir dann die Methode erneut auf, mit dem jeweiligen Zustand des Builds:

Das Ergebnis sieht in Upsource dann aus wie folgt:

Das Ausrufezeichen im roten Kreis bedeutet Fehlschlag, der Haken im grünen Kreis erfolgt. Somit weiß ich bereits vor Beginn meines Reviews, ob der Branch meines Kollegen korrekt gebaut werden konnte oder aber ob ein Fehler vorliegt. Den Blick auf den Jenkinsserver kann ich mir somit sparen, genauso wie das Review, wenn der Code nicht erfolgreich gebaut werden konnte.

Leave a Reply

Your email address will not be published. Required fields are marked *