Kürzlich hatte ich die Aufgabe von Gitlab.com einmal täglich die Repos einer Gruppe herunterzuladen und auf einem Windows-System zu speichern. Von dort übernahm dann das Backup.
Voraussetzungen:
- Powershell 7
- Git
# GitLab API-Token und Gruppen-ID
$gitlabUrl = "https://gitlab.com"
$apiToken = "HierderToken" # Persönlicher Access Token. DARF nicht Guest sein - da sonst kein Code über die CI geladen darf
$groupId = "HierdieGruppenID" # GruppenID rein, wenn nur für eine Gruppe in der Organisation die REPOS geladen werden sollen
# Zielverzeichnis für das Klonen der Repositories
$targetDir = "C:\GitLabProjects"
# Prüfen, ob Git installiert ist
if (-Not (Get-Command git -ErrorAction SilentlyContinue)) {
Write-Host "Fehler: Git ist nicht installiert oder nicht im PATH."
exit 1
}
# Erstelle das Verzeichnis, falls es noch nicht existiert
if (-Not (Test-Path -Path $targetDir)) {
New-Item -Path $targetDir -ItemType Directory | Out-Null
}
# HTTP-Header für die API-Anfrage
$headers = @{ "PRIVATE-TOKEN" = $apiToken }
# API-URL für die Gruppenprojekte (mit Paginierung)
$apiUrl = "$gitlabUrl/api/v4/groups/$groupId/projects?per_page=100"
$projects = @()
$nextPageUrl = $apiUrl
do {
try {
# API-Abfrage für Projekte der Gruppe
$response = Invoke-RestMethod -Uri $nextPageUrl -Method Get -Headers $headers -ResponseHeadersVariable headers
$projects += $response
$nextPageUrl = if ($headers['Link'] -match '<(https[^>]+)>; rel="next"') { $matches[1] } else { $null }
} catch {
Write-Host "Fehler beim Abrufen der Projekte: $_"
exit 1
}
} while ($nextPageUrl)
# Prüfen, ob Projekte gefunden wurden
if ($projects.Count -eq 0) {
Write-Host "Keine Projekte in der Gruppe mit ID $groupId gefunden."
exit 1
}
# Repositories klonen
foreach ($project in $projects) {
$repoName = $project.name
$repoUrl = $project.http_url_to_repo # Verwende HTTPS-URL zum Klonen
# Authentifizierung in der URL hinzufügen
$repoUrl = $repoUrl -replace "https://", "https://oauth2:$apiToken@"
$repoPath = "$targetDir\$repoName"
if (Test-Path -Path $repoPath) {
Write-Host "Überspringe $repoName, da es bereits existiert."
} else {
Write-Host "Klonen von Repository: $repoName"
git clone $repoUrl $repoPath 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host "Fehler beim Klonen von $repoName"
}
}
}
Write-Host "Alle Repositories der Gruppe mit ID '$groupId' wurden erfolgreich verarbeitet."