Ich habe eine Gitea-Instanz, die ich selbst zu Hause hoste. Die meisten meiner Repositories lade ich dort hoch, dadurch finden aber leider die meisten anderen Entwickler und potenziellen Arbeitgeber meine Projekte gar nicht, da diese nicht auf meinem öffentlichen Github-Account zu finden sind.
Mirroring
Um dies mit minimalem Aufwand zu erreichen, habe ich Mirroring von git verwendet. Mirroring ist ein beliebtes Git-Konzept, das es einem Repository ermöglicht, effektiv an mehreren Orten gleichzeitig zu existieren.
Mirroring ist einfach der Akt der Spiegelung aller (oder einer bestimmten Teilmenge von) Commits, die anderswo existieren, im Allgemeinen auf automatisierte Weise.
Gitea unterstützt ein paar Git-Hooks, die eine einfache Möglichkeit bieten, ein Skript auszuführen. Die wichtigsten Hooks unterstützt Gitea:
- pre-receive: Wird ausgeführt, wenn ein Client Code in das Repository pusht. Auf diese Weise kann z.B. verhindert werden, dass Code, Tests nicht besteht oder sogar nicht gemerged werden können.
- update: Wird für jeden Branch ausgeführt, der aktualisiert wird, wenn ein Client Code in das Repository pusht. Dies ist ähnlich wie beim pre-receive, ermöglicht aber eine präzisere Steuerung.
- post-receive: Läuft, nachdem pre-receive- und der update-Hook beendet ist.
Setup
- SSH-Keys für Gitea und Github erstellen
- Unterordner /opt/gitea erstellen
mkdir -p /opt/gitea - SSH Public- und Private-Key generieren
ssh-keygen -t rsa -b 4096 -C „gitea@mc8051.de“ -f gitea - Rechte dem User git geben
chown -R git:git /opt/gitea/ - !!! Public-Key !!! als Deploy-Key dem Github-Repository hinzufügen
Siehe Github-Dokumentation
- Unterordner /opt/gitea erstellen
- Einrichten des post-receive Hooks in dem zu mirroren Gitea repository
Hinweise:
Pro Repository würde ich jeweils einen neuen Key generieren, um die Sicherheit deutlich zu erhöhen!
Das Github Repository muss entweder leer sein oder die gleiche Historie besitzen.
Post-Receive Script
Für den Private-Key kann entweder der Pfad verwendet werden oder alternativ auch der Private-Key im ASCII-Armor-Format.
#!/usr/bin/env bash
downstream_repo="git@github.com:Gurkengewuerz/go-gpgit.git"
pkfile="/opt/gitea/gita"
if [ ! -e "$pkfile" ]; then # unindented block for heredoc's sake
cat > "$pkfile" << PRIVATEKEY
# ==> REMOVE THIS ENTIRE LINE & PASTE YOUR PRIVATE KEY HERE <==
PRIVATEKEY
fi
chmod 400 "$pkfile"
export GIT_SSH_COMMAND="ssh -oStrictHostKeyChecking=no -i \"$pkfile\""
git push --mirror "$downstream_repo"