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: "git@git.my-server.com: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 im before_script-Abschnitt
  • den Namen my-repo der Mirror-Aufgabe
  • die Variablen REMOTE und LOCAL 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.