Das Spiegeln eines Projekts
Auswahl der richtigen Methode
Es gibt drei Methoden, um ein Projekt zu spiegeln (auf Englisch mirroring):
- Push: Spiegelung eines Projekts von der openCode-GitLab-Instanz zu einem anderen Ort
- Pull: Spiegelung eines Projekts von einem anderen Ort zur openCode-GitLab-Instanz
- Bidirektional: Spiegeln in zwei Richtungen
Hinweis
In der von openCode genutzten Version von GitLab ist ein Pull-Spiegelung und ein bidirektionales-Spiegeln nicht verfügbar.
Es gibt aber die Möglichkeit über eine CI-Komponente eine Pull-Spiegelung umzusetzen. Eine Anleitung zur Pull-Spiegelung über einer CI-Komponente finden Sie hier.
Diese Anleitung erfordert allerdings Vorwissen über CI-Scripts und Pipelines in GitLab.
Push-Spiegelung
Bei einer Push-Spiegelung wird das Ausgangsprojekt an einer anderen Stelle hochgeladen. Das Ausgangsprojekt liegt dabei auf dem openCode GitLab. Das Zielprojekt kann dagegen auch auf anderen Plattformen, z.B. GitHub, Gitea, Forgejo gehostet werden.
1. Kopieren der Ziel-URL für das Ausgangsprojekt
- Öffnen Sie die Seite eines leeren Projekts (= Zielprojekt), zu welchem Ihr Ausgangsprojekt gespiegelt werden soll.
-
Kopieren Sie die URL für den SSH-Zugriff auf das angelegte Zielprojekt:
-
URL eines GitHub-Projekts:
- Öffnen Sie das GitHub-Projekt, welches Sie spiegeln wollen.
- Drücken Sie nun auf die grüne Code-Schaltfläche und wählen Sie den Reiter SSH aus.
- Kopieren Sie nun die entsprechende URL in die Zwischenablage:
-
URL eines GitLab-Projekts:
- Öffnen Sie das GitLab-Projekt, welches Sie spiegeln wollen.
- Drücken Sie nun auf die blaue Code-Schaltfläche.
- Kopieren Sie die URL unter "Mit SSH klonen" in die Zwischenablage
-
2. Hinzufügen einer Spiegelung zum Ausgangsprojekt
Hinweis
Sie müssen in dem Ausgangsprojekt die Rechte einer/eines Betreuer(in) haben.
- Öffnen Sie das Projekt, welches Sie an anderer Stelle spiegeln wollen.
- Navigieren Sie nun in der linken Leiste zu: Einstellungen > Repository.
- Öffnen Sie anschließend den Reiter Spiegelnde Repositorys.
- Klicken Sie nun auf die Schaltfläche Hinzufügen.
Sie sollten nun folgende Einstellungen sehen:
Fahren Sie zum Ausfüllen dieser Einstellungen mit den nächsten Schritten fort:
- Fügen Sie die kopierte URL in das Feld Git-Repository-URL ein.
- Nehmen Sie nun folgende Änderungen an der URL vor:
- Fügen Sie vor die URL ein
ssh://
hinzu. - Ersetzen Sie den Doppelpunkt (
:
) vor dem Namen des Projekts mit einem Schrägstrich (/
).
- Fügen Sie vor die URL ein
- Legen Sie nun als Authentifizierungsmethode die Methode Öffentlicher SSH-Schlüssel fest.
- Setzen Sie Ihren Nutzer:innen-Namen im Feld Nutzername auf
git
. - Bestätigen Sie Ihre Eingaben indem Sie auf die Schaltfläche Repository spiegeln klicken.
3. Zugriff auf das Zielprojekt mittels eines öffentlichen SSH-Schlüssels erlauben
3.1 Kopieren des öffentlichen SSH-Schlüssel des zu spiegelnden Projekts
- Laden Sie die Seite des GitLab-Projekts, welches Sie spiegeln wollen.
- Öffnen Sie Einstellungen > Repository.
- Öffnen Sie den Reiter Spiegelnde Repositorys.
- Sie sollten nun den zuvor angelegten Eintrag sehen. Drücken Sie in diesem Eintrag nun auf die Schaltfläche (🔃), um den öffentlichen Schlüssel zu kopieren:
3.2 Hinzufügen des Schlüssels zu dem Projekt, auf das Sie Ihr Projekt spiegeln wollen
Dieser Schritt unterscheidet sich je nach Plattform, auf die Sie Ihr Projekt spiegeln wollen.
- Einstellungen eines GitLab-Projekts:
- Öffnen Sie die Seite Ihres leeren GitLab-Projekts.
- Navigieren Sie zu Einstellungen > Repository.
- Öffnen Sie den Reiter Bereitstellungsschlüssel.
- Drücken Sie nun auf die Schaltfläche Neuen Schlüssel hinzufügen.
- Fügen Sie nun den Schlüssel aus der Zwischenablage hinein.
- Wählen Sie nun einen aussagekräftigen Titel für Ihren Schlüssel.
-
Einstellungen eines GitHub-Projekts:
- Öffnen Sie die Seite Ihres leeren GitHub-Projekts.
- Drücken Sie auf die Schaltfläche Settings (oben rechts).
-
Navigieren Sie in der linken Seitenleiste zu Security > Deploy Keys.
-
Drücken Sie nun auf die Schaltfläche Add deploy key.
-
Fügen Sie nun den öffentlichen Schlüssel aus der Zwischenablage hinzu. Geben Sie diesem darüber hinaus einen aussagekräftigen Namen.
Info
Die Anleitung für eine Push-Spiegelung orientiert sich maßgeblich an der (englischsprachigen) Dokumentation von GitLab zum Repository mirroring.
Pull-Spiegelung
Bei einer Pull-Spiegelung wird ein Ausgangsprojekt von einem Zielprojekt (auf der openCode-GitLab-Instanz) heruntergeladen.
Verständnis: Wie funktioniert Pull-Mirroring?
Bevor wir loslegen, ist es hilfreich, die beteiligten Komponenten und deren Rollen zu verstehen:
- Quelle: Das Repository, aus dem Inhalte stammen. Es enthält bereits Daten.
- Ziel: Das Repository, das Inhalte übernehmen soll.
Richtung der Synchronisation
- Beim Pull-Mirroring initiiert das Ziel die Synchronisation: Es fragt die Quelle regelmäßig nach Änderungen ab.
- Beim Push-Mirroring sendet die Quelle aktiv Änderungen an das Ziel.
Besonderheit beim Pull-Mirroring mit CI
Da GitLab-CE ein Pull-Mirroring nicht direkt unterstützt, wird ein Umweg genutzt: - Das Ziel (unsere GitLab-Instanz) startet eine Pipeline. - Diese Pipeline lädt die Daten von der Quelle (z. B. GitHub) auf eine temporäre Umgebung. - Von dort werden Sie zurück ins Ziel-Repository gepusht.
Es handelt sich also um einen indirekten Ablauf: Quelle → CI → Ziel, wobei CI und Ziel im selben GitLab liegen.
1. Anlegen des Ausgangsprojekts
- Legen Sie ein leeres Ausgangsprojekt auf der openCode-GitLab-Instanz an.
- Legen Sie in diesem Ausgangsprojekt einen neuen Branch an. In diesem Beispiel wird dieser Branch mit
pull-mirroring
bezeichnet. Sie können aber auch eine beliebige andere Bezeichnung wählen. -
Legen Sie nun auf dem neu erstellen Branch folgendes GitLab CI-Script (
.gitlab-ci.yml
) an:- Passen Sie dabei den Link des Zielprojekts (
target_url
) an.
Info
Dieses Skript bindet folgende CI/CD-Komponente ein.
.gitlab-ci.ymlinclude: - component: $CI_SERVER_FQDN/pull-mirroring/component/pull-mirroring@1.0.1 inputs: target_url: https://gitlab.opencode.de/ZIELPROJEKT # Link zum Zielprojekt, welches zum Ausgangsprojekt heruntergeladen werden soll; kann auch ein GitHub-Repo seinauch auf https://github.com/... sein # http_protocol: # (https) (access token only) Allows you to switch to `http` access_token_name: $GITLAB_PAT_NAME # (ci-mirroring) The name of the access token with the `write_repository` permission access_token: $GITLAB_PAT # (null) The access token value # ssh_user: # (git) The SSH username # ssh_key: # (null) The path to the base64 encoded SSH private key # ssh_key_public: # (null) The path to the base64 encoded SSH public key # stage: # (mirroring) The name of the stage for the job to be associated with # remote_name: # (upstream) The name of the remote added to fetch `target_url` updates git_push_opt: --force # ('') Options to pass to the `git push` command stages: - build - mirroring
- Link zu dem Zielprojekt, welches zum Ausgangsprojekt heruntergeladen werden soll.
- Passen Sie dabei den Link des Zielprojekts (
2. Zugriff auf das Ausgangsprojekt ermöglichen
Info
Anstatt den Zugriff über ein Zugriffstoken zu ermöglichen, können Sie auch einen Zugriff über einen SSH-Schlüssel einrichten. Hierzu müssen Sie auch die entsprechenden Optionen in der .gitlab-ci.yml
-Datei anpassen.
- Navigieren Sie auf der GitLab-Seite des Ausgangsprojekts zu Einstellungen > Access tokens.
- Erstellen Sie über die Schaltfläche Neuen Token hinzufügen einen neuen Zugriffstoken:
- Vergeben Sie einen aussagekräftigen Token-Namen und merken Sie sich diese exakte Bezeichnung (oder speichern Sie diese in einem Passwort-Manager).
- Wählen Sie die Rolle
Developer
aus. - Wählen Sie folgende Geltungsbereiche aus:
write_repository
,read repository
. - Bestätigen Sie die Erstellung eines neuen Projekt-Zugriffstokens über die (blaue) Schaltfläche "Projekt-Zugriffstoken erstellen".
- Kopieren Sie anschießend auf der Seite, die sich nun geöffnet hat, den neu erstellen Zugriffstoken über die Schaltfläche Projekt-Zugriffstoken kopieren in die Zwischenablage (oder speichern diese in einem Passwort-Manager):
- Fügen Sie den erstellen Zugriffstoken zu den CI/CD-Variablen hinzu:
- Navigieren Sie in der Navigationsleiste (auf der linken Seite) nun zu Einstellungen > CI/CD.
- Öffnen Sie den Reiter Variablen.
- Klicken Sie auf die Schaltfläche Variable hinzufügen.
- Geben Sie nun im Feld Schlüssel den Wert
GITLAB_PAT
an. - Fügen Sie in das Feld Wert den Zugriffstoken aus der Zwischenablage (oder dem Passwort-Manager) aus Schritt 3 hinzu (achten Sie darauf, dass am Ende des Codes keine neue leere Zeile hinzugefügt wird).
- Klicken Sie nun auf die Schaltfläche Variable hinzufügen
- Fügen Sie die Variable mit dem Schlüssel
GITLAB_PAT_NAME
und der Bezeichnung des Zugrifftokens aus Schritt 2 zu den CI/CD-Variablen hinzu.
Hinweis
Falls das Spiegeln trotz korrekt gesetzter Variablen nicht funktioniert:
- Branch-Schutz prüfen: Der genutzte Branch (z. B.
pull-mirroring
) darf nicht geschützt sein. Andernfalls ist kein Push aus der Pipeline möglich – auch dann nicht, wenn Push erzwingen aktiviert ist. Entfernen Sie ggf. den Branchschutz unter Repository > Geschützte Branches. - Variablen-Schutz prüfen: Die CI/CD-Variablen
GITLAB_PAT
undGITLAB_PAT_NAME
dürfen nicht als geschützt markiert sein, wenn Sie in einem ungeschützten Branch verwendet werden.
3. Eine regelmäßige Synchronisierung einrichten
- Öffnen Sie auf der GitLab-Projektseite Build > Pipeline-Zeitpläne
- Klicken Sie auf die (blaue) Schaltfläche Erstelle einen neuen Pipeline-Zeitplan.
- Geben Sie eine aussagekräftige Beschreibung für den Pipeline-Zeitplan an.
- Wählen Sie ein Intervallmuster aus.
- Erstellen Sie den neuen Pipeline-Zeitplan über die entsprechende (blaue) Schaltfläche.