GitLab: simples Repository-Mirroring via CI
Dieser Artikel ist bereits über 3 Jahre alt. Die Inhalte sind wahrscheinlich bereits überholt und nicht mehr aktuell.
Die kostenfreie Community-Edition der Git Hosting-Plattform GitLab unterstützt von Haus aus kein Repository-Mirroring. Allerdings lässt sich diese Funktion durch die integrierte CI-Lösung ganz einfach nachbauen.
Voraussetzungen
Neben einer GitLab-Installation, einem CI-Runner (auf Docker-Basis) und einem Deploy-Key werden zwei Repositories benötigt: eines, welches das zu spiegelnde Repository enthält und eines, das durch sein CI-Skript das eigentliche Mirroring betreibt.
Vorbereitung
Richten Sie zunächst die beiden Repositories ein:
Das “Updater”-Repository benötigt bloß eine CI-Datei, welche im nächsten Abschnitt beschrieben wird.
Im Repository, welches die Daten enthalten soll, muss nur unter Settings > Repository > Deploy Keys
ein öffentlicher Schlüssel hinterlegt werden. Durch diesen wird das Updater-Repository pushen können.
Zusätzlich muss der private Schlüssel zum zuvor hinterlegten Deploy Key im Updater-Repository unter Settings > CI / CD > Secret variables
als SSH_PRIVATE
abgelegt werden.
Abschließend muss ein Lesezugriff auf das zu spiegelnde Repository ermöglicht werden. Zur Vereinfachung wird hier von einem öffentlich lesbaren Repository ausgegangen.
Mirroring
Im CI-Skript des Updater-Repositories geschehen nun mehrere Dinge: zunächst werden git
und der openssh-client
im Container installiert und der private Schlüssel hinterlegt. Auch der Host-Key des GitLab-Servers wird in der known_hosts
-Datei abgespeichert, um eine interaktive Abfrage zu vermeiden.
Im Anschluss werden die Aufgaben des update
-Stages abgearbeitet, die in diesem Beispiel auf einen Mirror-Vorgang reduziert sind.
.gitlab-ci.yml
:
image: alpine:3.7
stages:
- update
before_script:
- apk -U add git openssh-client
- mkdir -p ~/.ssh/
- echo -e "$SSH_PRIVATE" > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- eval `ssh-agent -s`
- ssh-add ~/.ssh/id_rsa
- ssh-keyscan git.my-server.com >> ~/.ssh/known_hosts
my-repo:
stage: update
variables:
REMOTE: "https://github.com/username/repo.git"
LOCAL: "[email protected]:username/repo.git"
script:
- git clone --mirror $REMOTE
- cd repo.git/
- git push --mirror $LOCAL
In diesem Skript müssen Sie ein paar Punkte anpassen:
git.my-server.com
imbefore_script
-Abschnitt- den Namen
my-repo
der Mirror-Aufgabe - die Variablen
REMOTE
undLOCAL
in der Mirror-Aufgabe - den Namen des geklonten Repositories
repo.git
in der Mirror-Aufgabe
Anschließend committen und pushen Sie diese Datei, um einen ersten Lauf des Skripts zu starten.
Abschluss
Bei Erfolg des CI-Skripts können Sie unter CI / CD > Schedules
einen Cronjob einrichten, welcher das Mirroring regelmäßig und ohne Ihr Zutun durchführt.
Durch dieses Skript ist leider nicht die Spiegelung von Issues oder Wikis möglich, allerdings wird der Code dieser Repositories einfach und schnell gespiegelt.