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.

- 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.
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.
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.
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.
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
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
- Dokumentation https://docs.gitlab.com/
- Repository https://gitlab.com/gitlab-org/gitlab-foss/
- Architekturübersicht https://docs.gitlab.com/ee/development/architecture.html#gitlab-architecture-overview
- Liste von öffentlichen GitLab-Instanzen https://wiki.p2pfoundation.net/List_of_Community-Hosted_GitLab_Instances