Automatische Git Backups zu einem Offsite Server

Als zusätzlichen Sicherheitsnetz für unsere Git-Projekte haben wir ein kompaktes Skript entwickelt, das in regelmäßigen Abständen alle Projekte von unserem GitLab-Server abruft und speichert. Wie wir diesen Prozess erfolgreich umgesetzt haben, erfahren Sie in diesem Blogbeitrag.

Funktionsweise

Unsere bisherige Lösung bestand darin, jedes einzelne Projekt im Crontab zu registrieren, welche dann täglich mittels ‚git clone‘ aktualisiert wurden. Dabei sind leider einige Projekte durch das Raster gefallen.

Um die manuelle Arbeit zu eliminieren und solche Fehler in Zukunft zu verhindern, können wir einen API-Endpunkt einsetzen, der alle Projekte abruft. Danach können wir diese durch einen iterativen Prozess klonen.

Disclaimer

Wir nutzen GitLab als unsere Plattform. Allerdings bieten auch andere Dienste wie Bitbucket, GitHub etc. vergleichbare APIs an, die in diesem Kontext verwendet werden können. Das Skript muss entsprechend angepasst werden, um mit diesen anderen Plattformen kompatibel zu sein.

Impersonation Token erstellen

Zuerst navigieren wir zum Administrationsbereich und erstellen dort einen Benutzer speziell für Git-Clone-Aufgaben.

Nachdem der Benutzer angelegt wurde, hinterlegen wir den SSH-Schlüssel dieses Benutzers, um später per SSH pullen zu können. Anschließend erstellen wir ein Impersonation-Token:

Backup Skript

touch gitclone.sh

Editor der Wahl verwenden, we don’t discriminate.

#!/bin/bash

GITLAB_API="https://gitlab.com/api/v4/"
PRIVATE_TOKEN="your-private-token"  # Replace with GitLab private token
PER_PAGE=100
PAGE=1

while true; do
    # Get the list of all accessible projects and save to a file
    curl -s --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "$GITLAB_API/projects?membership=false&simple=true&per_page=$PER_PAGE&page=$PAGE" > response.json

    # Check if the response is empty (this means we've reached the last page)
    if [ "$(cat response.json)" == "[]" ]; then
        break
    fi

    # Iterate over each line in the file
    cat response.json | jq -c '.[]' | while read project; do
        # Extract the git URL
        git_url=$(echo "${project}" | jq -r '.ssh_url_to_repo')

        # Extract the name of the repository
        repo_name=$(echo "${project}" | jq -r '.path')

        if [ -d "${repo_name}" ]; then
            cd "${repo_name}"
            git pull
            cd ..
        else
            git clone "${git_url}"
        fi
    done

    PAGE=$((PAGE + 1))
done

# Clean up the response file
rm response.json

Das Skript wird anschließend executable gemacht mit dem folgenden Befehl:

chmod +x gitclone.sh

Abschließende Gedanken

Das Impersonation Token ist nur maximal ein Jahr gültig. Hier ist es notwendig sich eine Erinnerung zu stellen damit man es rechtzeitig austauschen kann.