Migration von GitLab Projekten
Inhalt
URL zur GitLab Community Edition Instanz: https://git-ce.rwth-aachen.de
URL zur GitLab Ultimate Edition Instanz: https://git.rwth-aachen.de
Feature Vergleich der einzelnen GitLab Lizenzen (in unserem Fall Vergleich zwischen Core und Ultimate): https://about.gitlab.com/pricing/self-managed/feature-comparison/
Beim Exportieren von Projekten werden folgende Elemente exportiert:
- Projekt- und Wiki-Repositorys
- Projekt-Uploads
- Projektkonfiguration, einschließlich Diensten
- Issues mit Kommentaren, Merge Requests mit Diffs und Kommentaren, Labels, Milestones, Snippets und anderen Projektteilen
- LFS-Objekte
- Issue Boards
Folgende Elemente werden nicht exportiert:
- Projektseite aufrufen
- in der linken Navigationsleiste auf "Einstellungen"/"Settings" klicken
- runter Scrollen bis zum Punkt "Erweitert"
- Dort den Bereich "Export project" suchen und den Button "Export project" drücken
Sobald der Export abgeschlossen ist, erscheint neben dem "Export project" Button ein "Download export" Button. Diesen bitte anklicken.
Nach dem der Export heruntergeladen ist, kann dieser in GitLab wieder importiert werden.
Information Sollte es sich hier um kein Gruppen Projekt handeln, bitte zum nächsten Punkt springen. |
Da man bei einer Migration auf eine andere GitLab Instanz eine Gruppe neu anlegen muss, sind hier einige Kniffe und mögliche Hilfestellungen dokumentiert:
Gruppeninformationen anzeigen lassen
https://git.rwth-aachen.de/api/v4/groups/<Gruppen-Name> |
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://git.rwth-aachen.de/api/v4/groups/<your_group_id> |
Hier werden die Informationen zur Gruppe, sowie den zugehörigen Projekten ausgegeben.
Eine neue Gruppe kann am einfachsten über die GUI angelegt werden.
Dazu gibt es hier eine Anleitung.
Sind zum Migrationszeitpunkt noch nicht alle Mitglieder einer Gruppe in GitLab angemeldet, kann die Zuordnung der Nutzer auch zu einem späteren Zeitpunkt durchgeführt werden.
Wichtig zu beachten ist, sofern es sich um ein Gruppenprojekt handelt, dass das Projekt innerhalb der Gruppe auf dem neuen GitLab Server importiert wird.
Hinweis! Handelt es sich bei dem Projekt um ein Gruppen Projekt, muss vor dem Import erst noch die Gruppe erstellt werden! |
Für den Import während des Erzeugens eines neuen Projekts auf "Import Project" klicken und dort auf "GitLab Export" klicken.
Im nun folgenden Schritt sind "Project name", "Project URL" und "Project slug" zu setzen.
Bei "Choose File" wird nun der GitLab Export ausgewählt. Danach ist der Import abgeschlossen.
Bei der Migration werden Berechtigungen nicht übernommen und vorhandene, lokale Kopien des Projekts müssen aktualisiert werden.
Um die git-URLs zu aktualisieren, muss im loklaen Repo folgendes durchgeführt werden:
- Auflisten der Git Remotes: git remote -v
- Übernehmen der Remotes mit Anpassung auf git-ce
git remote -v origin git@git.rwth-aachen.de:<Nutzer/Gruppe>/<Projektname>.git (fetch) origin git@git.rwth-aachen.de:<Nutzer/Gruppe>/<Projektname>.git (push) get remote set-url origin git@git-ce.rwth-aachen.de:<Nutzer/Gruppe>/<Projektname>.git git remote -v origin git@git-ce.rwth-aachen.de:<Nutzer/Gruppe>/<Projektname>.git (fetch) origin git@git-ce.rwth-aachen.de:<Nutzer/Gruppe>/<Projektname>.git (push) |
Sollte sich der Gruppen Name bzw. der Projektname geändert haben, müssen diese auch angepasst werden. Allgemein gilt:
- SSH: origin git@git-ce.rwth-aachen.de:<Nutzer/Gruppe>/<Projektname>.git
- HTTPS: origin https://git-ce.rwth-aachen.de/<Nutzer/Gruppe>/<Projektname>.git
- GitLab Runner müssen auf git-ce.rwth-aachen.de neu registriert werden: Anleitung
- Die Git Remotes müssen angepasst werden:
git remote -v # origin git@git.rwth-aachen.de:<Nutzer/Gruppe>/<Projektname>.git # diese Ausgabe kopieren und git.rwth-aachen.de durch git-ce.rwth-aachen.de austauschen git remote set-url origin git@git-ce.rwth-aachen.de:<Nutzer/Gruppe>/<Projektname>.git |
- Eventuelle Deploy Keys müssen kopiert werden (https://docs.gitlab.com/ee/api/deploy_keys.html)
- neue und alte Projekt-ID des Projekts heraussuchen
- neuen Personal Access Token in git-ce.rwth-aachen.de erstellen (unter Scopes reicht api)
Alle deploy keys zu einem Projekt können beispielsweise über die API abgerufen werden. Dazu muss die ID des Projekt bekannt sein. Die Projekt ID kann man auf der Projekt Hauptseite direkt unter dem Projekt-Namen finden. Ist man Owner oder Maintainer eines Projekts kann man sich nun alle Deploy Keys zum Projekt folgendermaßen ausgeben lassen:
https://git.rwth-aachen.de/api/v4/projects/<PROJEKT-ID>/deploy_keys |
Oder:
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://git.rwth-aachen.de/api/v4/projects/<PROJEKT-ID>/deploy_keys" |
Nun kann man die Keys dem importierten Projekt auf git-ce.rwth-aachen.de hinzufügen. Entweder ganz einfach über die GUI unter: "Einstellungen" -> "Repository" -> "Deploy Keys" oder über die API:
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" --header "Content-Type: application/json" --data '{"title": "Test", "key": "ssh-rsa AAAA.....", "can_push": "true"}' "https://git-ce.rwth-aachen.de/api/v4/projects/<NEUE_PROJEKT-ID>/deploy_keys/" |
- SSH Keys müssen übertragen werden
- Nutzerberechtigungen sowie Gruppenberechtigungen müssen manuell übernommen werden
Zur Erleichterung der Migration mehrerer Projekte wurden einzelne Beispiel-Skripts zum Massenexport/Massenimport unter: https://git.rwth-aachen.de/itc-lba/gitmig_scripts erstellt.
Alternativ gibt es ein Powershell Skript:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 Write-Host "Dieses Skript hilft Ihnen bei der Migration der Projekte von https://git.rwth-aachen.de nach https://git-ce.rwth-aachen.de." Write-Host "Für die Migration brauchen Sie jeweils ein Private Token. Diese können Sie hier generieren:" Write-Host "https://git.rwth-aachen.de/profile/personal_access_tokens" Write-Host "https://git-ce.rwth-aachen.de/profile/personal_access_tokens" Write-Host "Die Token benötigen folgende Zugriffsrechte:" Write-Host " * api" Write-Host " * read_user" Write-Host " * read_repository" Write-Host " * write_repository" Write-Host " * read_registry" Write-Host "Neben dem Token brauchen Sie die Nutzer-ID bzw. Gruppen-ID von beiden Instanzen." Write-Host "Die Benutzer ID finden Sie unter https://git.rwth-aachen.de/profile im Feld User ID" Write-Host "und unter https://git-ce.rwth-aachen.de/profile unter User ID." Write-Host "Die Gruppen ID finden Sie unter https://git.rwth-aachen.de/<Gruppen Name> und" Write-Host "https://git-ce.rwth-aachen.de/<Gruppen Name>." Write-Host "Die Gruppe muss auf beiden Instanzen verfügbar sein." Write-Host "Bei der Migration werden folgende Elemente übertragen:" Write-Host " * Projekt und Wiki Repositories" Write-Host " * Projekt Uploads" Write-Host " * Projekt Konfigurationen, inklusive Diensten" Write-Host " * Issues mit Kommentaren, Merge Requests mit Diffs und Kommentaren, Labels, Milestones und andere Projekt Entitäten" Write-Host " * LFS Objekte" Write-Host " * Issue Boards" Write-Host "Bitte geben Sie nun nachfolgende die Informationen ein" $token_git = Read-Host -Prompt "Geben Sie Ihr Private Toke für https://git.rwth-aachen.de ein" $token_gitce = Read-Host -Prompt "Geben Sie Ihren Private Token für https://git-ce.rwth-aachen.de ein" $export_dir = Read-Host -Prompt "Geben Sie das Export Verzeichnis an" $group_title = "Gruppe oder Nutzer?" $group_pompt = "Handelt es sich um die Migration einer Gruppe oder eines Nutzer?" $group = New-Object System.Management.Automation.Host.ChoiceDescription "&Gruppe","Gruppe" $user = New-Object System.Management.Automation.Host.ChoiceDescription "&Nutzer","Nutzer" $options = [System.Management.Automation.Host.ChoiceDescription[]]($group, $user) [string]$selectedType = $host.ui.PromptForChoice($group_title, $group_pompt, $options, 1) if ($selectedType -eq 1) { $urlid = 'users' $userid_git = Read-Host -Prompt "Geben Sie die Nutzer ID von https://git.rwth-aachen.de ein" $userid_gitce = Read-Host -Prompt "Geben Sie die Nutzer ID von https://git-ce.rwth-aachen.de ein" } elseif ($selectedType -eq 0){ $urlid = 'groups' $userid_git = Read-Host -Prompt "Geben Sie die Gruppen ID von https://git.rwth-aachen.de ein" $userid_gitce = Read-Host -Prompt "Geben Sie die Gruppen ID von https://git-ce.rwth-aachen.de ein" } $r = Invoke-RestMethod -Headers @{ 'PRIVATE-TOKEN' = $token_git } -Uri https://git.rwth-aachen.de/api/v4/$urlid/$userid_git/projects # Prints a table of projects to be imported $r | Select-Object id, name | Sort-Object -Property id | Export-Csv -Path "myprojects.csv" -NoTypeInformation # Send export request for each project Import-Csv -Path "myprojects.csv" | ForEach-Object { $url = ("https://git.rwth-aachen.de/api/v4/projects/" + $_.id + "/export"); Invoke-RestMethod -Method Post -Headers @{ 'PRIVATE-TOKEN'=$token_git } -Uri $url } Write-Host "Alle Ihre Projekte wurden nun exportiert. Bitte Warten Sie, bis Sie zu jedem Projekt eine E-Mail erhalten haben, dass es erfolgreich exportiert wurde." Write-Host "Drücken sie eine beliebige Taste, um fortzufahren..." $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); # Download Import-Csv -Path "myprojects.csv" | ForEach-Object { $url = ("https://git.rwth-aachen.de/api/v4/projects/" + $_.id + "/export/download"); $filename= $_.id; Invoke-RestMethod -Headers @{ 'PRIVATE-TOKEN'=$token_git } -Uri $url -OutFile "$export_dir\$filename.tar.gz" } # Import all Projects if ($PSVersionTable.PSVersion.Major -ge 6) { Import-Csv -Path "myprojects.csv" | ForEach-Object { $file = ($export_dir + "\" + $_.id + ".tar.gz"); Invoke-RestMethod -Method Post -Headers @{ 'PRIVATE-TOKEN' = $token_gitce } -Form @{ namespace = $userid_gitce; path = $_.name; file = Get-Item $file } -Uri https://git-ce.rwth-aachen.de/api/v4/projects/import } } else { Import-Csv -Path "myprojects.csv" | ForEach-Object { $file = ($export_dir + "\" + $_.id + ".tar.gz"); Invoke-RestMethod -Method Post -ContentType 'multipart/form-data' -Headers @{ 'PRIVATE-TOKEN' = $token_gitce } -Body @{'namespace' = $userid_gitce; 'path' = $_.name; 'file' = [IO.File]::ReadAllBytes($file)} -Uri https://git-ce.rwth-aachen.de/api/v4/projects/import } } |