Python-Gitlab

Build- und Softwaresysteme wie Gitlab lassen sich durch beliebig viel Geld um beliebig viele Features erweitern.
Und dann sitzt man lange vor dem “Super-duper-Plugin” und weiß erst recht wieder nicht, wie man das bekommt, was man haben möchte.

“Selber machen” ist dann immer die beste Lösung.


Ich bin durch meine Firma mit Gitlab gesegnet und nutze es daher fast täglich.

Neben Quellcode- und Buildagent-Verwaltung existieren rudimentäre Auswertungen für Testfälle und andere Statistiken, die jedoch für jedes Projekt einzeln ermittelt und auch nur separat angezeigt werden können.

Oft sind aber projektübergreifende Details interessant und hier muss man je nach Anwendungsfall entweder zu externen Plugins greifen, oder Auswertungsjobs von kompletten Fremdsystemen durchführen lassen.

Was oft übersehen wird ist:

Gitlab hat für fast alles eine REST oder zumindest RESTartige Webschnittstelle.

Alles, was das Web-UI anzeigt, kann auch separat als JSON Datensatz heruntergeladen werden. Und wenn die Daten schon als JSON da sind, kann man sie in weiteren Scriptsprachen wie etwa Python relativ leicht kombinieren, auswerten oder in andere Formate übertragen.

python-gitlab ist ein Modul, welches die HTTP-Webrequests in einfache Python Objekte verpackt, die ziemlich selbsterklärend benutzt werden können.

Auf zum Script!

Man braucht zuerst mal einen Access-Token zu den Projekten, den man sich im Gitlab WebUI unter seinem Benutzerprofil anlegen kann. Dort wird festgelegt, ob der Token nur Leserechte hat, oder auch etwas verändern darf.

Dann installiert man sich das python-gitlab Modul per pip:

1pip install python-gitlab

und kann mit dem Scripten anfangen.

Ich nutze fixe Gruppen in Gitlab, in denen meine Projekte liegen. Da sich die nie ändern, kann man sie einfach über ihre IDs ansprechen. Die IDs von Gruppen oder Projekten findet man auch in der Gitlab Web-UI im Untertitel, wenn man eine Gruppe oder Projekt öffnet.

1import gitlab 
2
3gl = gitlab.Gitlab(url='https://my.gitlab.server', private_token='abcdefg')
4mygroup = gl.groups.get(12345)
5myprojects = mygroup.projects.list()
6for entry in myprojects:
7  print("ID#{} {}: {}".format(entry.id, entry.name, entry.http_url_to_repo))

Und schon finde ich eine Liste aller Projekte in meiner Gruppe vor. Mit dem http_url_to_repo Feld könnte man sich jetzt gleich ein git clone basteln, das alle Projekte lokal herunterlädt.

Spannender wird es dann aber, wenn man auf die Pipelines der Projekte zugreift und dort den Status der Ausführung ausliest, und die Statistik der JUnit Tests erhält.
Denn so kann man sich als Entwickler mit wenigen Zeilen einen Übersichtsmonitor bauen, der anzeigt, was gerade gut und eher schlecht gelaufen ist und Nacharbeitung benötigt.

Fazit

Mit der Gitlab-Web-API kann man die Buildumgebung automatisieren, überwachen und auswerten lassen.
Zwar langweilen mich solche Scriptereien im Job oft, aber ich habe es zu schätzen gelernt, wie man sich seinen Alltag mit ein paar Zeilen vereinfachen kann.

Das Arbeiten mit Buildsystem gehört heute vor allem in Großprojekten zum Standard, und die Zeiten, wo der Entwickler-Rechner auch gleich die Releases erzeugte sind (leider) lange vorbei.

Folglich sollte “Buildserver-Scripting” in jeder Schule unterrichtet werden, denn wer weiß … bald braucht jeder Handwerker einen Buildserver um seine Maschinen auf den neuesten Stand zu bekommen.