WPF-OpenSource/src/studienarbeit/3_gitea.md
ThetaDev 1dc8c5cef4
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
add gitea ci section
2023-07-22 04:14:26 +02:00

327 lines
15 KiB
Markdown

# Gitea
Das Gitea-Projekt begann 2016 als Fork der Git-Hosting-Plattform Gogs. Lunny Xiao, einer
der Beitragenden von Gogs, war damit unzufrieden, dass der Gründer des Projekts, Joe
Chen, das Projekt alleine betreuen und keine weiteren Maintainer ernennen wollte.
2022 gründete Lunny Xiao die Firma Gitea Limited. Die Firma bietet Unternehmen Hosting-
und Supportdienstleistungen für Gitea an. Da einige Mitglieder der Community einem
kommerziell geleiteten Open-Source-Projekt misstrauen, entstand ein neuer Fork names
Forgejo. Forgejo steht unter der Leitung von Codeberg, einem Berliner Verein, der seit
2018 eine öffentliche Gitea-Instanz betreibt. Abgesehen von Design- und Namensänderungen
unterscheidet sich Forgejo von Gitea momentan kaum.
Gitea ist in Go geschrieben und besteht aus einer einzigen ausführbaren Datei.
Standardmäßig verwendet Gitea eine interne SQLite-Datenbank, alternativ werden auch
externe Datenbanken (MySQL, MariaDB, Postgres, MS SQL) unterstützt.
Die Weboberfläche wied serverseitig mit Templates gerendert. Einige Websitekomponenten
wie z.B. Drop-Down-Menüs erfordern JavaScript.
Getestet wurde die Version 1.20.0-rc2.
## Installation
Gitea stellt kompilierte Binaries für alle gängigen Betriebssysteme unter
<https://dl.gitea.com/gitea/> zur Verfügung. Von dort aus lässt sich die Anwendung
einfach herunterladen und starten.
Alternativ gibt es auch [offizielle](https://pkgs.org/download/gitea) und
[inoffizielle](https://gitea.com/gitea/awesome-gitea/src/branch/main/README.md#user-content-packages)
Pakete für die meisten Linux-Distributionen.
Darüber hinaus stellt Gitea auch ein Docker-Image (`gitea/gitea`) zur Verfügung.
Die Einrichtung ist extrem simpel. Beim ersten Start wird diese Konfigurationsseite
angezeigt, auf der man die grundlegenden Einstellungen (z.B. Datenbank-URL,
Admin-Passwort) vornehmen kann. Nach der Bestätigung ist Gitea in wenigen Sekunden
bereit zur Verwendung.
![Gitea-Konfiguration](./assets/gitea/setup.png)
Dieser Konfigurationsassistent wird jedoch nur beim ersten Start angezeigt. Alle
weiteren Konfigurationsänderungen müssen durch die
`app.ini`-[Konfigurationsdatei](https://docs.gitea.com/1.20/administration/config-cheat-sheet)
erfolgen. Gitea verfügt zwar über eine Admin-Oberfläche, diese dient allerdings
hauptsächlich der Nutzerverwaltung und erlaubt keine Konfigurationsänderungen.
## Systemanforderungen
Gitea ist auf jedem Betriebssystem und jeder CPU-Architektur lauffähig, die von der
Programmiersprache Go unterstützt wird. Binaries für MacOS (amd64/aarch64), FreeBSD
(amd64), Windows (i386/amd64) und Linux (i386/amd64/arm5/arm6/aarch64) werden offiziell
zum Download angeboten. Das offizielle Docker-Image ist für die amd64- und
aarch64-Architektur verfügbar.
Im Leerlauf benötigt der Server ca. 150MB Arbeitsspeicher und verursacht unter 0.1%
CPU-Auslastung. Damit ist Gitea die mit Abstand leichtgewichtigste Plattform in Test und
eignet sich perfekt für den Einsatz auf schwächerer Hardware.
## Bedienung
Die Weboberfläche von Gitea wird serverseitig mit Hilfe von Templates gerendert
(klassische Multi-Page-Anwendung). Dies hat den Vorteil, dass die Seite auch ohne
JavaScript dargestellt werden kann (wenn auch mit eingeschränkter Bedienbarkeit).
Obwohl bei jedem Navigationsschritt durch ein Repository die gesamte Seite neu geladen
wird, läuft die Navigation durch Ordner sehr flüssig.
Optisch und funktional ist die Benutzerschnittstelle stark an GitHub angelehnt. Wer also
vorher GitHub verwendet hat, findet sich auf Gitea schnell zurecht
Der Code in Gitea-Repositories kann durchsucht werden, allerdings ist diese Funktion
standardmäßig deaktiviert. Um sie zu aktivieren, müssen diese Zeilen zur
Konfigurationsdatei hinzugefügt werden:
```
[indexer]
REPO_INDEXER_ENABLED=true
```
Standardmäßig verwendet Gitea die Bibliothek [Bleve](https://blevesearch.com/) für die
Suche, es kann jedoch auch eine externe Elasticsearch-Instanz verwendet werden.
![Gitea-Suche](./assets/gitea/search.png)
Gitea kann standardmäßig Bilder, CSV-Dateien, PDFs und Markdown-Dateien auf der
Weboberfläche darstellen. Andere Markupsprachen wie ReStructured Text werden
standardmäßig nicht unterstützt. Allerdings bietet Gitea als einzige getestete Plattform
die Möglichkeit, zusätzliche Renderer in der Konfigurationsdatei zu definieren.
Beispielsweise kann Gitea Pandoc verwenden, um RST, LaTEX oder Word-Dokumente in HTML zu
konvertieren und anzuzigen. Es ist auch möglich, mit etwas Bastelei einen Viewer für STL
oder Excel-Dateien zu installieren.
## Import bestehender Projekte
Gitea bietet die Möglichkeit, Projekte von GitHub, Gitlab, Gogs, OneDev, GitBucket und
Codebase zu importieren. Neben den Repositories können auch Issues, Pull-Requests und
Releases importiert werden.
Der Versuch, zwei meiner GitHub-Projekte mit Issues und Pull-Requests zu übertragen,
scheiterte jedoch mit einer Fehlermeldung.
## Zusatzfeatures
Gitea bietet grundlegende Features zum Projektmanagement. Issues können erstellt, mit
Labels versehen und bestimmten Entwicklern zugewiesen werden. Es können
Fälligkeitstermine für Issues festgelegt und die Arbeitszeit hinterlegt werden.
Dazu kommt die Möglichkeit, Issues zu Meilensteinen hinzuzufügen und somit
beispielsweise den Arbeitsfortschritt für eine neue Version zu verfolgen.
Darüber hinaus können in Gitea Kanbanboards erstellt werden. Allerdings sind diese
Boards nicht in das restliche Issue-System integriert und deswegen umständlich zu
nutzen. Issues müssen beispielsweise manuell den Boards hinzugefügt werden. Während
GitLab Labels verwendet, um die Issues den Spalten zuzuordnen ist in Gitea außerhalb des
Boards nicht ersichtlich, welchen Status ein Issue hat. Ein Issue, das in die
Done-Spalte verschoben wird, wird nicht automatisch geschlossen. Umgekehrt führt das
Schließen eines Issues nicht zu einer Platzierung in der Done-Spalte.
Dokumentation für Gitea-Repositories kann in einem simplen, auf Markdown basierenden
Wiki veröffentlicht werden.
Das Hosting statischer Webseiten unterstützt Gitea nicht, weswegen das Team von Codeberg
hierfür eine [eigene Lösung](https://codeberg.org/Codeberg/pages-server) entwickelt hat.
Gitea bietet eine integrierte Registry für Pakete aller gängigen Programiersprachen
(z.B. Python, npm, Rust). Wer eine Softwarebibliothek entwickelt, kann diese auf seiner
Gitea-Instanz veröffentlichen, sodass andere Entwickler sie nutzen können. Zudem
unterstützt die Gitea-Registry Linux-Pakete (.deb und .rpm) sowie Docker-Images.
Gitea unterstützt als einzige getestete Plattform agit. Dies ist ein alternativer
Git-Workflow, der von Alibaba entwickelt wurde. Agit erlaubt es Entwicklern, Pull
Requests zu erstellen ohne zuvor einen Fork des Projekts anzulegen. Hierbei wird die
Änderung mit diesem Befehl in einen versteckten Branch des Reposiories gepusht, worauf
Gitea automatisch eine PR erstellt.
Dieser Befehl erfordert im Gegensatz zum normalen push keine Schreibrechte im
entsprechenden Repository.
```
git push origin HEAD:refs/for/main -o topic="feat/user-search" -o title="Add user search"
```
Es existiert auch ein Git-Plugin für agit namens
[`git-repo`](https://git-repo.info/en/2020/03/agit-flow-and-git-repo/), damit man nicht
jedes Mal diesen langen Befehl eintippen muss, sondern den Beschreibungstext direkt in
die Kommandozeile tippen kann.
Gitea lässt sich auch mit dem Tool [`tea`](https://gitea.com/gitea/tea) auf der
Kommandozeile bedienen. Auf diese Weise lassen sich Issues erstellen und lesen oder Pull
Requests erstellen und abrufen.
Gitea bietet dem Administrator vollen Zugriff auf seinen Webserver und das
Templatesystem. Dadurch kann man Templates und Stylesheets durch eigens angepasste
Versionen ersetzen und die Weboberfläche nach seinen Bedürfnissen anpassen. Dies ist
insbesondere für große Organisationen und Firmen interessant, die ihre
Git-Hosting-Plattform nach ihrem Corporate Design gestalten möchten.
Ein Beispiel für eine stark angepasste Gitea-Oberfläche ist die Instanz des
[Blender-Projekts](https://projects.blender.org/), die sich nahtlos in die restliche
Projektseite einfügt.
## Continous Integration
### Woodpecker
Gitea verfügte lange nicht über einen eingebauten CI-Server. Allerdings gibt es eine
Schnittstelle, um externe CI-Systeme anzubinden.
Ich habe einige CI-Systeme getestet, die mit Gitea kompatibel sind.
[Woodpecker](https://woodpecker-ci.org/) ist meiner Meinung nach eines der besten
Systeme. Bei Woodpecker handelt es sich um einen Fork des Drone CI-Projekts nach deren
Wechsel von der Apache License zu einer nichtkommerziellen Lizent.
Woodpecker erlaubt den Login mit seinem Gitea-Account und zeigt dem Entwickler auf der
Startseite eine Liste aller Repositories an. Von dort aus lässt sich die CI für
bestimmte Repositories aktivieren. Daraufhin konfiguriert Woodpecker die Webhooks des
Repositories, sodass die Builds automatisch bei Aktualisierungen gestartet werden.
Woodpecker verwendet sogenannte Agents, die mittels GRPC mit dem zentralen Server
kommunizieren und Buildaufträge empfangen. Die Agents verwenden Docker, um die Builds in
Containern auszuführen.
![Woodpecker CI](./assets/gitea/woodpecker.png)
Die Builds werden in einer yml-Datei mit dem Namen `.woodpecker.yml` im
Wurzelverzeichnes des Repositories definiert. Jeder Buildschritt wird in einem eigenen
Docker-Container ausgeführt.
```yaml
pipeline:
test:
image: rust:latest
commands:
- rustup component add rustfmt clippy
- cargo fmt --all --check
- cargo clippy --all --features=rss -- -D warnings
- cargo test --features=rss --workspace
```
Die Installation von Woodpecker ist etwas komplizierter, da Woodpecker sowohl einen
HTTP-Server als auch einen GRPC-Server bereitstellt. Möchte man Agents auf anderen
Servern betreiben, sollte auch der GRPC-Server mit TLS gesichert sein. Hierfür kann man
einen Reverse Proxy (z.B Traefik) verwenden. Allerdings beinhaltet die offizielle
Dokumentation keine Anleitung hierfür.
[Hier](./assets/woodpecker/docker-compose.yml) ist die Docker-Compose-Datei, die ich für
meine Setup (mit Traefik) verwendet habe. Vor der Verwendung müssen noch die folgenden
Konfigurationsvariablen bearbeitet werden:
- `WOODPECKER_HOST` URL der Woodpecker-Instanz
- `WOODPECKER_GITEA_URL` URL der Gitea-Instanz
- `WOODPECKER_GITEA_CLIENT` / `WOODPECKER_GITEA_SECRET` OAuth-Zugangsdaten (in Gitea das
Einstellungsmenü aufrufen und unter _Create a new OAuth2 Application_ einen neuen
Client erstellen. Redirect URI: `<WOODPECKER_URL>/authorize`)
- `WOODPECKER_AGENT_SECRET` ist das Passwort für alle mit der Instanz verbundenen
Agents. Hierfür sollte man sich einfach einen langen Zufallsstring erzeugen,
beispielsweise mit `openssl rand -hex 32`.
### Gitea Actions
Mit dem vorletzten Release 1.19 bekam Gitea jedoch ein eigenes CI-System: Gitea Actions.
Hierbei wurde nicht nur der Name an die Konkurrenz von Microsoft angelehnt. Das System
basiert auf [act](https://github.com/nektos/act), einer freien Implementation von GitHub
Actions. Ursprünglich wurde act zum lokalen Testen von GitHub Actions entwickelt. Gitea
hat die Anwendung stattdessen als Basis für ihr CI-System verwendet.
Standardmäßig sind Gitea Actions in den Einstellungen deaktiviert. Um sie verwenden zu
können, muss man diese Zeilen zur Konfigurationsdatei hinzufügen:
```
[actions]
ENABLED=true
```
Anschließend muss man wie bei Gitlab und Woodpecker einen Runner einrichten, der die
Builds mittels Docker ausführt. Der Runner kann als Binary von der
[Gitea-Download-Seite](https://dl.gitea.com/act_runner/) heruntergeladen werden. Es ist
auch möglich, den Runner in einem Docker-Container zu betreiben.
Nachdem man den Runner heruntergeladen hat, muss man ihn konfigurieren. Dafür führt man
den Befehl `act-runner register` auf. Anschließend muss man die Adresse der Instanz und
einen Registrierungstoken, den man in der Admin-Oberfläche unter _Actions / Runners_
erzeugen kann.
Anschließend muss man noch die Actions im gewünschten Repository aktivieren, in dem man
in den Einstellungen den Haken bei _Enable Repository Actions_ setzt.
Die Builds werden als yaml-Dateien im Verzeichnis `.gitea/workflows` definiert. Obwohl
Gitea die gleiche Syntax wie Github Actions verwendet, sind die Workflows nicht 1:1
kompatibel. Beispielsweise lädt Gitea vordefinierte Actions wie `actions/checkout` nicht
von [github.com/actions](https://github.com/actions) sondern von
[gitea.com/actions](https://gitea.com/actions) herunter, sodass einige Actions nicht
verfügbar sind.
Außerdem führt GitHub seine Builds in einer virtuellen Maschine mit einer Vielzahl an
vorinstallierten Programmiersprachen und Entwicklertools aus. Da das Image dieser
Maschine sehr groß ist, benutzt Gitea stattdessen standardmäßig den
Debian+NodeJS-Container `node:16-bullseye`. Das Image enthält neben Node.js auch Python,
gcc, make und curl. Wer andere Programmiersprachen benutzt, muss jedoch Anwendungen
nachinstallieren (wie beispielsweise Rust im unteren Beispiel). Es ist jedoch möglich,
andere Docker-Images zu verwenden.
```yaml
name: Test
on: [push]
jobs:
Test:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
uses: actions/checkout@v3
- name: Setup Rust
run: |
curl https://sh.rustup.rs -sSf | sh -s -- -y
source "$HOME/.cargo/env"
- name: Test
run: |
cargo clippy
cargo test
```
![Gitea Actions](./assets/gitea/actions.png)
Ein wichtiges Feature, das Gitea Actions momentan noch fehlt ist die Möglichkeit,
Workflows manuell zu starten. Da Gitea Actions noch relativ neu ist, gehe ich jedoch
davon aus, dass dieses Feature in Zukunft implementiert wird.
## Öffentliche Instanzen
Die von den Maintainern des Projekts betriebene Instanz unter
[gitea.com](https://gitea.com/explore/repos) verfügt über 5600 Repositories.
Eine noch größere Instanz betreibt der Berliner Verein Codeberg e.V. Auf
[codeberg.org](https://codeberg.org) werden 30900 öffentliche Repositories gehostet.
Zusätzlich zu ihrer Gitea-Instanz bietet Codeberg auch einen Webhosting-Dienst unter
[\*.codeberg.page](codeberg.page) an. Codeberg betreibt auch einen Woodpecker-CI-Server,
für dessen Verwendung die Nutzer allerdings manuell freigeschaltet werden müssen.
Da Gitea sehr einfach und günstig zu hosten ist, wird es von einigen Open
Source-Projekten auch als sekundäre Plattform zusätzlich zu GitHub verwendet.
Beispielsweise betreibt das Team hinter dem alternativen YouTube-Frontend Invidious eine
[Gitea-Instanz](https://gitea.invidious.io/iv-org), um vor eventuellen Takedowns des
Repositories auf GitHub sicher zu sein
## Fazit
Während GitLab meiner Meinung nach die beste Lösung für große Organisationen und
Unternehmen darstellt, ist Gitea das perfekte System für einzelne Entwickler, kleine
Teams und Hobbybastler. Durch seinen sparsamen Ressourcenverbrauch ist Gitea auf fast
jeder Hardware lauffähig und die Einrichtung funktioniert einfach und schnell.
Darüber hinaus lässt sich Gitea mit eigenen Themes und Templates individuell anpassen
und zu seiner persönlichen Website machen.
Die Projektmanagement-Features von Gitea sind allerdings eher rudimentär. Wer
Kanbanboards benötigt, sollte Gitlab oder OneDev in Betracht ziehen oder hierfür eine
externe Software verwenden.
## Quellen
- Projektseite <https://gitea.com>
- Repository <https://github.com/go-gitea/gitea/>
- Start von Codeberg (damals TeaHub)
<https://www.heise.de/news/Neue-Entwickler-Plattform-TeaHub-will-Github-beerben-4078811.html>,
<https://blog.codeberg.org/codebergorg-launched.html>