Blog background

GitLab-Repositories automatisch zu GitHub spiegeln

Dieser Blogbeitrag beschreibt, wie Sie bestimmte GitLab-Repositories regelmäßig zu Ihrem GitHub-Konto oder Ihrer Organisation mit den CLI-Tools glab und gh spiegeln

Dieser Blogpost wurde von einer Maschine aus dem Englischen übersetzt. Die Originalversion finden Sie hier: Automatically mirror Gitlab repositories to Github

Bitte kontaktieren Sie uns , falls etwas unklar beschrieben ist, nicht funktioniert, falsch erscheint oder Sie Unterstützung benötigen.

Inhaltsverzeichnis

Das Problem beim Spiegeln von GitLab zu GitHub

Wir möchten einige unserer öffentlichen GitLab-Repositories für bessere Sichtbarkeit zu GitHub spiegeln. Es gibt eine GitLab-Funktion dafür unter Einstellungen -> Repository -> Repository-Spiegelung, die hier dokumentiert ist , aber leider gibt sie diesen Fehler bei Verwendung mit GitHub:

13: push to mirror: git push: exit status 128, stderr: “remote Support for password authentication was removed on August 13, 2021.\nremote: Please see https://docs.github.com/en/getting-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.\nfatal: Authentication failed for: ‘https://github.com/Blunix-GmbH/ansible-role-haproxy/’\n”.

Gitlab Mirror Repository to Github Error

Installation der GitLab CLI glab

Also lassen Sie uns das einfach per Skript lösen. Dies wird nicht automatisch ausgelöst, aber Sie können einen Cronjob auf Ihrem GitLab-Server einrichten, der dies einmal täglich ausführt.

GitLab hat ein CLI-Tool für die Administration . Ein .deb-Paket kann für Ubuntu- und Debian-Linux-basierte Workstations auf der gitlab.com Download-Seite heruntergeladen werden. Für die meisten Ubuntu- und Debian-basierten Server wählen Sie “glab__Linux_x86_64.deb”.


wget https://gitlab.com/gitlab-org/cli/-/releases/v1.36.0/downloads/glab_1.36.0_Linux_x86_64.deb
sudo dpkg -i glab_1.36.0_Linux_x86_64.deb

Nach der Installation müssen Sie sich bei Ihrer GitLab-Instanz authentifizieren. Diese Konfiguration wird unter “~/.config/glab-cli/” gespeichert. Zur Authentifizierung benötigen Sie ein Token, das hier generiert werden kann:

https://your-gitlab-domain.com/-/user_settings/personal_access_tokens

Sie müssen nur die Berechtigung “api” und “read_repository” auswählen:

Create a Gitlab API token


glab auth login
? What GitLab instance do you want to log into? GitLab Self-hosted Instance
? GitLab hostname: git.blunix.com
? API hostname: git.blunix.com
- Logging into git.blunix.com
? How would you like to login? Token

Tip: you can generate a Personal Access Token here https://git.blunix.com/-/profile/personal_access_tokens?scopes=api,write_repository
The minimum required scopes are 'api' and 'write_repository'.
? Paste your authentication token: **************************
? Choose default git protocol SSH
? Choose host API protocol HTTPS
- glab config set -h git.blunix.com git_protocol ssh
✓ Configured git protocol
- glab config set -h git.blunix.com api_protocol https
✓ Configured API protocol

Wenn wir es jetzt überprüfen, wird es nicht funktionieren:


glab repo list
Showing 0 of 0 projects (Page 1 of 1)

Aus welchem Grund auch immer ist die von “glab auth login” erstellte Konfiguration, die sich unter “~/.config/glab-cli/config.yml” befindet, standardmäßig so eingerichtet, dass sie nur mit gitlab.com spricht, nicht mit Ihrer persönlichen GitLab-Instanz. Lassen Sie uns das beheben, indem wir alle Vorkommen von gitlab.com durch den Hostnamen Ihres GitLab ersetzen:


# Ändern Sie dies zu Ihrer GitLab-Instanz
host: git.blunix.com
[...]

hosts:
    # Ändern Sie dies auch
    git.blunix.com:
        [...]
        # Und dies ebenfalls
        api_host: git.blunix.com
        [...]

Oder in einer Zeile:


sed -i 's/gitlab.com/git.blunix.com/g' ~/.config/glab-cli/config.yml

Jetzt sollten die Repositories sichtbar sein:


glab repo list
Showing 30 of 372 projects (Page 1 of 12)

ansible-roles/role-imgproxy                git@git.blunix.com:ansible-roles/role-imgproxy.git                Ansible role to install and configure imgproxy on Debian Linux
ansible-roles/role-golang                  git@git.blunix.com:ansible-roles/role-golang.git                  Ansible role to install and configure golang on Debian Linux
ansible-roles/role-systemd-journal-remote  git@git.blunix.com:ansible-roles/role-systemd-journal-remote.git  Ansible role to install and configure systemd-journal-remote on Debian Linux
[...]

Installation der GitHub CLI gh

Als Nächstes benötigen wir einen CLI-Client für GitHub, um automatisch Repositories dort zu erstellen. Es gibt eine GitHub-CLI namens “gh”, die einfach per apt installiert werden kann:


sudo apt install gh

Die Konfiguration ist sehr ähnlich zum glab-CLI-Tool (funktioniert aber sofort). In unserem Fall kann GitLab keinen Browser von der CLI starten, daher kopieren wir den Authentifizierungscode in die angezeigte URL:


gh auth login
? What account do you want to log into? GitHub.com
? What is your preferred protocol for Git operations? HTTPS
? Authenticate Git with your GitHub credentials? Yes
? How would you like to authenticate GitHub CLI? Login with a web browser

! First copy your one-time code: D946-B977
Press Enter to open github.com in your browser...
2024/02/15 23:44:52.178314 cmd_run.go:1055: WARNING: cannot start document portal: Expected portal at "/run/user/1000/doc", got "/home/user/.cache/doc"
/user.slice/user-1000.slice/session-2.scope is not a snap cgroup
! Failed opening a web browser at https://github.com/login/device
  exit status 4
  Please try entering the URL in your browser manually

✓ Authentication complete.
- gh config set -h github.com git_protocol https
✓ Configured git protocol
✓ Logged in as blunix0815

Lassen Sie uns überprüfen, ob die Einrichtung erfolgreich war:


gh repo list

There are no repositories in @blunix0815

gh repo list Blunix-GmbH

Showing 30 of 47 repositories in @Blunix-GmbH

Blunix-GmbH/role-borgbackup-server            Ansible role to install and configure borgbackup server on Debian Linux
[...]

Einrichtung des GitLab zu GitHub Spiegelskripts

Das folgende Skript verwendet die “glab”- und “gh”-CLI-Tools, um über alle Repositories auf der Blunix-GitLab-Instanz zu iterieren, das gleiche Projekt auf GitHub zu erstellen, das Projekt von GitLab zu klonen und den Master- oder Main-Branch zu GitHub zu pushen.


#!/bin/bash
#
# Repliziere alle Repositories von https://git.blunix.com/ansible-roles/ nach https://github.com/Blunix-GmbH/

# Liste alle Repos unter https://git.blunix.com/ansible-roles/ auf
# Beispielausgabe von glab repo list:
# ansible-roles/role-ssh                          git@git.blunix.com:ansible-roles/role-ssh.git                          Ansible role for managing OpenSSH-Server and users authorized_keys
glab repo list --all --group ansible-roles --per-page 1000 | while read line; do

    # Überspringe "Showing of 51 projects (Page 1 of 1)"
    [[ "$line" == Showing* ]] && continue
    # Überspringe leere Zeilen
    [[ "$line" == "" ]] && continue

    # Extrahiere Repo-Namen
    repo_name=$(echo $line | cut -d ' ' -f 1 | cut -d '/' -f 2)

    # Extrahiere Repo-URL
    repo_url=$(echo $line | cut -d ' ' -f 2)

    # Extrahiere Beschreibung
    repo_description=$(echo $line | cut -d ' ' -f 3-)

    # Gib dem Benutzer einige Informationen über das aktuelle Repo
    echo "Verarbeite Repo \"$repo_name\" mit URL \"$repo_url\""

    # Breche bei leerer Beschreibung ab
    if [[ "$repo_description" == "" ]]; then
        echo "Beschreibung leer, Abbruch!"
        exit 1
    fi

    # Erstelle Repo auf GitHub
    gh repo create --disable-issues --disable-wiki --homepage https://www.blunix.com --public --description "$repo_description" Blunix-GmbH/$repo_name

    # Klone Repo von GitLab
    git clone $repo_url

    # Pushe zu GitHub
    cd $repo_name
    git remote add github git@github.com:Blunix-GmbH/$repo_name
    git push github master
    cd ..
    rm -rf $repo_name

done

Machen Sie es wie folgt ausführbar:


chmod 700 /usr/local/sbin/sync-repos-to-github.sh

Der folgende Befehl richtet einen Cronjob für das Skript ein, der täglich um 5 Uhr morgens ausgeführt wird:


(crontab -l 2>/dev/null; echo "0 5 * * * /usr/local/sbin/sync-repos-to-github.sh") | crontab