WPF-OpenSource/src/studienarbeit/2_gitlab.md
2023-07-22 02:13:02 +02:00

13 KiB

GitLab

2011, drei Jahre nach dem Start von GitHub veröffentlichten Dmytro Zaporozhets und Sytse Sijbrandij die erste Version von GitLab. Damit ist GitLab die erste und bekannteste Open-Source-Alternative zu GitHub.

GitLab Community Edition ist unter der MIT-Lizenz veröffentlicht. Die Firma hinter GitLab verfolgt ein "Open Core"-Geschäftsmodell, d.h. einige fortgeschrittene Features sind nicht in der Community Edition enthalten und erfordern die proprietären Versionen "Premium" bzw. "Ultimate". Diese sind nur in Form eines Abonnements zum Preis von 29 (Premium) bzw. 99USD (Ultimate) pro Nutzer und Monat erhältlich. Open-Source-Projekte und Bildungseinrichtungen können die Ultimate-Version kostenfrei nutzen.

Im Kern ist GitLab eine Ruby-on-Rails-Webanwendung. Allerdings sind einige Funktionen der Plattform (bspw. SSH oder Git-Operationen) an zusätzliche Services ausgelagert. Die meisten dieser Services sind in Go implementiert. Das Webfrontend wurde mit Vue.js implementiert.

GitLab Architektur
  • Workhorse Reverse Proxy, der HTTP-Anfragen an Git oder die Hauptanwendung weiterleitet
  • Gitaly Microservice zur Speicherung der Git-Repositories und Verarbeitung von Git-Anfragen
  • GitLab Shell SSH-Server
  • Sidekiq Task Queue zur Ausführung von Aufgaben im Hintergrund

GitLab verwendet eine PostgreSQL-Datenbank zur Speicherung seiner Daten. Zudem kommt eine Redis-Instanz als Cache und Event Queue zum Einsatz.

Getestet wurde GitLab in der Version 16.1.1.

Installation

Um die Installation der Anwendung trotz ihres Aufbaus aus verschiedenen Services zu vereinfachen, stellt GitLab ein Omnibus-Paket zur verfügung. Hierbei handelt es sich um ein Linux-Softwarepaket, das die gesamte GitLab-Anwendung mit allen Services (inklusive NGINX, Redis und Postgres) beinhalten. Die Pakete sind für die meisten Linux-Distributionen (Ubuntu, Debian, Alma Linux, CentOS, OpenSUSE, Raspberry Pi OS) verfügbar.

Um Gitlab als Omnibus-Paket zu installieren, muss man zuerst das Gitlab-Repository zu seinem System hinzufügen. Hierfür kann man dieses Skript verwenden: https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh.

Danach kann man GitLab mit diesem Befehl installieren und starten:

GITLAB_ROOT_PASSWORD="<strongpassword>" EXTERNAL_URL="http://gitlab.example.com" apt install gitlab-ce

Der Konfigurationsprozess dauert mehrere Minuten. Wenn der Webserver gestartet ist, kann man die Weboberfläche aufrufen und sich anmelden (Benutzername: root).

GitLab stellt auch ein Docker-Image (gitlab/gitlab-ce) zur Verfügung, welches das Omnibus-Paket beinhaltet. Der Einrichtungsprozess ist der gleiche wie bei einer bare metal-Installation, mit dem Unterschied dass die Konfiguration durch die Umgebungsvariable GITLAB_OMNIBUS_CONFIG erfolgt.

Hier ist die Docker-Compose-Datei, die ich für meine Testinstallation verwendet habe.

Für Unternehmen und große Organisationen mit Tausenden Nutzern bietet GitLab in ihrer Dokumentation auch Referenzarchitekturen für hochverfügbare Systemen mit mehreren Servern.

Systemanforderungen

GitLab bietet Pakete für eine Vielzahl von Linux-Distributionen, sowohl für Intel/AMD als auch für ARM-Prozessoren. Das offizielle Docker-Image ist jedoch nur für die arm64-Architektur verfügbar.

GitLab hat unter allen getesteten Plattformen den höchsten Ressourcenverbrauch.

Im Leerlauf bewegt sich die CPU-Last auf meinem Testsystem zwischen 3 und 30 Prozent. Der Arbeitsspeicherverbrauch beträgt ganze 6GB.

Aufwändige Git-Operationen können Lastspitzen über 100% für eine Dauer von bis zu 5 Sekunden pro Anfrage verursachen.

GitLab erwähnt in ihrer Dokumentation, dass man die Konfiguration anpassen kann, um den Ressourcenverbrauch etwas zu senken. Nachdem ich diese Zeilen zur Konfigurationsdatei hinzugefügt habe, sank der Speicherbedarf auf 2.8GB und die CPU-Auslastung auf 1-12%.

# Reduce the number of running workers to the minimum in order to reduce memory usage
puma['worker_processes'] = 2
sidekiq['max_concurrency'] = 9
# Turn off monitoring to reduce idle cpu and disk usage
prometheus_monitoring['enable'] = false

Für eine Installation auf Single Board-Computern und kleinen V-Servern ist der Speicherverbrauch jedoch weiterhin zu hoch. GitLab gibt als Mindestanforderung 4 CPU-Kerne und 4GB RAM an.

Bedienung

Gitlab's Weboberfläche wurde mit dem VueJS-Framework realisiert. Die gesamte Weboberfläche wird somit clientseitig mittels JavaScript gerendert. Dies erlaubt eine äußerst flüssige Navigation durch die Webseite, da die Seite nicht bei jedem Navigationsschritt neu geladen wird. Der Nachteil dieser Lösung: Javascript ist für die Darstellung der Webseite zwingend erforderlich.

GitLab bietet die Möglichkeit, den Code eines Repositories zu durchsuchen. Die Verwendung einer externen Elasticsearch-Instanz für die Suche und die Möglichkeit, die gesamte Gitlab-Instanz zu durchsuchen, ist allerdings den kostenpflichtigen Versionen vorbehalten.

GitLab unterstützt in der Standardkonfiguration die meisten Dateiformate unter den getesteten Plattformen. Auf der Weboberfläche können Bilder, CSV-Tabellen, PDF-Dokumente und stl-Modelle betrachtet werden, alternative Markupsprachen wie Restructured Text werden ebenfalls unterstützt. Es gibt sogar die Möglichkeit, GeoJSON-Dateien (Listen von GPS-Standorten) auf einer OpenStreetMap-Karte darzustellen.

Eine Besonderheit der Gitea-Weboberfläche stellt die Web-IDE dar. GitLab verfügt über eine modifizierte Version von Visual Studio Code, mit der man direkt im Browser an seinen Projekten arbeiten kann.

GitLab-Web-IDE

Import bestehender Projekte

GitLab erlaubt den Projektimport von GitHub, Bitbucket, FogBugz, Gitea sowie von anderen GitLab-Instanzen.

Die Importfunktion ist standardmäßig deaktiviert und muss erst in der Admin Area aktiviert werden (Settings > General > Visibility and access controls > Import sources).

Für den Import von GitHub-Projekten muss man sich mit einem Access Token anmelden und bekommt anschließend eine Übersicht aller Repositories angezeigt. Hier kann man auswählen, welche Repositories übertragen werden sollten. Der Import umfasst auch Issues, Pull Requests und Releases.

GitLab-Import

Als einzige Plattform im Test bietet GitLab die Möglichkeit, ein Repository mit sämtlichen gespeicherten Daten als zip-Datei zu exportieren. Dies erlaubt nicht nur den Import auf anderen Instanzen sondern bietet dem Nutzer auch eine Backup-Option.

Zusatzfeatures

GitLab hat von allen getesteten Plattformen die meisten Features. Einige Features sind jedoch der proprietären Premium/Ultimate Edition vorbehalten, die ich nicht getestet habe.

Die Projektmanagement-Features von GitLab sind die besten im Test. GitLab erlaubt das Erstellen von Issues mit Labels, Verantwortlichen, Fälligkeitsterminen und geleisteter Arbeitszeit. Zudem können Issues zu Meilensteinen hinzugefügt werden.

Issue Boards erlauben einen schnellen Überblick über den alle gerade bearbeiteten Issues. Es lassen sich Spalten erstellen, die Issues mit einem bestimmten Tag auflisten. Erstellt man also z.B. zwei Tags: "Implementierung" und "Review" und legt in seinem Board zwei Spalten hierfür an, erhält man eine Übersicht über den Fortschritt aller Issues. Issues lassen sich zwischen Spalten verschieben, wodurch sich auch die Tags des Issues ändern.

GitLab Kanban

Ein interessantes Feature ist die Möglichkeit, zu einem Issue mehrere Tasks hinzuzufügen. Tasks sind Sub-Issues, die ihre eigene Beschreibung und Diskussion haben, aber unter einem Issue zusammengefasst sind. Auf diese Weise lassen sich große Features in kleinere Arbeitsschritte aufteilen, die von verschiedenen Teammitgliedern erledigt werden können.

GitLab Issue mit Task

Viele fortgeschrittene Projektmanagement-Features sind allerdings der Enterprise Edition vorbehalten. Hierzu gehört z.B. das Anlegen von Boards mit Filtern (z.B. für einen bestimmten Meilenstein) oder Aufwandsschätzungen.

Um Projekte zu dokumentieren bietet GitLab ein auf Git und Markdown basierendes Wiki. Zudem gibt es mit "Snippets" einen Pastebin, der ebenfalls Git zur Speicherung der Codeschnipsel verwendet.

Es gibt auch die Möglichkeit, mit GitLab statische Webseiten zu hosten. Die Seiten können mit GitLab CI gebaut und unter einer persönlichen Subdomain veröffentlicht werden.

GitLab bietet auch eine Paketregistry für Bibliotheken verschiedener Programmiersprachen (z.B. Maven, npm, Python) an. Die Unterstützung für einige Programmiersprachen wie Ruby ist allerdings noch experimentell. *.deb-Pakete sowie Docker-Images können ebenfalls mit GitLab gehostet werden.

Zur einfachen Bedienung mit der Kommandozeile bietet GitLab das Tool glab an. Damit lassen sich beispielsweise Issues und Pull Requests erstellen und bearbeiten, Snippets hochladen und CI-Build starten. Es gibt auch ein offizielles VS-Code-Plugin, das Pull-Requests, Issues und CI-Builds in den Texteditor integriert.

Continous Integration

Gitlab verfügt über ein eingebautes CI-System, um Software automatisiert zu testen und zu veröffentlichen. Das System kann Builds in Docker-Containern, auf einem Kubernetes-Cluster, in einer VirtualBox-Maschine oder ohne Virtualisierung ausführen. Hierfür verwendet Gitlab ein verteiltes System aus Runnern. Die Runner kommunizieren über das Internet mit der Gitlab-Instanz und können so neue Buildaufträge entgegennehmen.

Um einen Runner einzurichten, muss man zuerst die erforderliche Konfigurationsdatei erstellen. Hierfür startet man den Runner mit dem Befehl register:

docker run --rm -it -v $(pwd)/runner-config:/etc/gitlab-runner gitlab/gitlab-runner register

Daraufhin fragt der Runner nach der URL der Gitlab-Instanz und einem Registrierungstoken. Den Token kann man sich entweder in den Repository-Einstellungen oder in der Admin-Oberfläche generieren lassen (je nachdem, ob man den Runner nur zu einem Projekt oder der gesamten Instanz hinzufügen möchte). Anschließend muss man festlegen, wie der Runner die Builds ausführen sollte. In meinem Test habe ich den docker-Executor gewählt.

Wenn die Konfiguration abgeschlossen ist, kann man den Runner mit diesem Befehl starten

docker run --rm -it -v $(pwd)/runner-config:/etc/gitlab-runner gitlab/gitlab-runner

Runner

Anschließend kann man für sein Repository einen Build definieren. Hierfür muss man eine Datei mit dem Namen .gitlab-ci.yml im Wurzelverzeichnes des Repositories erstellen, in der die einzelnen Schritte des Builds beschrieben werden. GitLab stellt ein Repository mit Beispielen für verschiedene Programmiersprachen und Frameworks zur Verfügung, um den Einstieg zu erleichtern.

image: "rust:latest"

test:cargo:
  script:
    - rustc --version && cargo --version # Print version info for debugging
    - rustup component add rustfmt clippy
    - cargo fmt --all --check
    - cargo clippy --all --features=rss -- -D warnings
    - cargo test --features=rss --workspace

Öffentliche Instanzen

Gitlab betreibt selbst eine öffentliche Instanz der proprietären Ultimate-Version unter gitlab.com.

Daneben gibt es eine Vielzahl von communitybetriebenen GitLab-Instanzen, die die freie Community Edition verwenden. Viele große Open-Source-Projekte und Organisationen hosten eine eigene GitLab-Instanz, wie zum Beispiel Debian, Framasoft oder KDE.

Fazit

GitLab ist zu Recht seit mehr als zehn Jahren die führende quelloffene GitHub-Alternative. Mittlerweile bietet GitLab mehr Features als die Konkurrenz von Microsoft.

Trotz seiner komplexen Architektur lässt sich GitLab relativ einfach und schnell installieren, da das Omnibus-Paket die einzelnen Dienste automatisch konfiguriert.

Insbesondere Unternehmen und große Organisationen werden die professionellen Features und den kommerziellen Support zu schätzen wissen.

Darüber hinaus bietet Gitlab selbst in der Open-Source-Version die besten Projektmanagement-Features im Test. Wer also keine separate Projektmanagement-Anwendung einsetzen möchte, ist mit Gitlab ebenfalls gut beraten.

Wer seine Plattform allerdings auf einem kleinen Single Board Computer oder V-Server betreiben möchte, sollte sich dagegen nach einer leichtgewichtigeren Alternative umsehen.

Quellen