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.