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."

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert