Sie befinden sich im Service: Software Engineering Services (GitLab)

Migration von GitLab Projekten

Migration von GitLab Projekten

Detailinformation

Inhalt

Instanzen

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

Feature Vergleich der einzelnen GitLab Lizenzen (in unserem Fall Vergleich zwischen Core und Ultimate): https://about.gitlab.com/pricing/self-managed/feature-comparison/

 

Projekt-Export

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:

 

Export über die GUI

  • 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

Migration von GitLab Projekten1

Sobald der Export abgeschlossen ist, erscheint neben dem "Export project" Button ein "Download export" Button. Diesen bitte anklicken.

 

Migration von GitLab Projekten2

Nach dem der Export heruntergeladen ist, kann dieser in GitLab wieder importiert werden.

 

Gruppenmigration

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

im Browser
https://git.rwth-aachen.de/api/v4/groups/<Gruppen-Name>
via curl
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.

 

Neue Gruppe anlegen

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.

 

Import über die GUI

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.

Migration von GitLab Projekten3

Im nun folgenden Schritt sind "Project name", "Project URL" und "Project slug" zu setzen.

Migration von GitLab Projekten4

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
 

Manuelle Nacharbeiten

  • 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

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:

im Browser
https://git.rwth-aachen.de/api/v4/projects/<PROJEKT-ID>/deploy_keys

Oder:

mittels curl
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
 

Für Fortgeschrittene

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