From d932a859b2065efa8c1b832aa85f3bce61e9e2fd Mon Sep 17 00:00:00 2001 From: "marco.locatelli" Date: Fri, 5 Jan 2024 16:33:50 +0100 Subject: [PATCH] Script mirror da gitlab a gitea --- GitlabMirroringToGitea.ps1 | 167 +++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 GitlabMirroringToGitea.ps1 diff --git a/GitlabMirroringToGitea.ps1 b/GitlabMirroringToGitea.ps1 new file mode 100644 index 0000000..3107fa2 --- /dev/null +++ b/GitlabMirroringToGitea.ps1 @@ -0,0 +1,167 @@ +################START SCRIPT################ + +#rilevo time per log inizio analisi +$startTime = (Get-Date).toString("yyyy/MM/dd HH:mm:ss") + +# avvio stopwatch +$mainStopWatch = [system.diagnostics.stopwatch]::StartNew() + +#access token per autenticazione +#creato da profilo marco.locatelli@egalware.com su gitlab.steamware.net +#creazione 04 gennaio 2024, scadenza 31 dicembre 2024 +$gitlabHead = @{"PRIVATE-TOKEN"="glpat-VjT_SAsBk3s-yWE1LDUF"} + +#access token per autenticazione +#creato da profilo replica su gitea2.steamware.net +#$giteaHead = @{"Authorization"="token 21c3e674ae369eda349d0e1fadaddd526f90419d"} +$giteaPass = "ajejebrazorf92!" + +#nome utente che effettua i mirror push +$userName = "replica" + +#contatore ciclo do while +$projectCount = 1 + +#numero massimo di progetti +$projectNumber = 2 + +#livello di log: 0=log sintetico, 1=log errori, 2=log full, 3=log ampolloso +$logLevel = 3 + +#output a terminale: 0=disattivo, 1=abilitato +$terminalOutput = 1 + +#inizializzo variabili vuote +$mirrorId = "" +$mirrorUrl = "" +$body = "" +$jsonBody = "" + +#cartella file di log +$GitLogFolder="c:\Steamware\Logs\Gitlab\" + +#nome file di log +$logFile = Join-Path $GitLogFolder "GitlabRebuildMirroring.log" + +#dichiaro funzione per scrittura output +Function WriteLogOutput +{ + Param ($logType, [string]$logString) + if($logType -le $logLevel) + { + #scrivo su file la stringa + Add-content $logFile -value "$logString" + #scrivo su terminale la stringa se $terminalOutput=1 + if($terminalOutput -eq 1){ + Write-Output($logString) + } + } +} + +#creazione folder di Log se non giĆ  esistente +if (Test-Path $GitLogFolder) +{ +} +else +{ + New-Item $GitLogFolder -ItemType Directory +} + +#scrivo intestazione e inizio analisi +WriteLogOutput 0 "--------------------" +Switch ($logLevel) +{ + 0 {WriteLogOutput 0 "LOG SINTETICO GITLAB MIRRORING"} + 1 {WriteLogOutput 0 "LOG ERRORI GITLAB MIRRORING"} + 2 {WriteLogOutput 0 "LOG FULL GITLAB MIRRORING"} + 3 {WriteLogOutput 0 "LOG AMPOLLOSO GITLAB MIRRORING"} +} +WriteLogOutput 0 "" +WriteLogOutput 0 "Percorso log: $GitLogFolder" +WriteLogOutput 0 "" +WriteLogOutput 0 "Inizio Esecuzione Script: $startTime" + +#ciclo principale do/while che cicla da 1 a N projectNumber +do +{ + #chiamata api che restituisce informazioni sullo stato dei mirror + $callUrl = "https://gitlab.steamware.net/api/v4/projects/" + $projectCount + "/remote_mirrors" + try + { + #parsing della risposta api convertita da json + $Response = Invoke-WebRequest -URI $callUrl -Headers $gitlabHead -ContentType "application/json" -UseBasicParsing + $parsedResponse = $Response.Content | ConvertFrom-Json + #scrivo il numero del progetto + WriteLogOutput 1 "" + WriteLogOutput 1 "--------------------" + WriteLogOutput 1 "**PROGETTO $projectCount**" + foreach($item in $parsedResponse) + { + $doExecute = "false" + $token = "" + $mirrorUrl = "" + $trunkedPath = "" + #controllo se l'url del mirror contiene gitea + if($item.url.Contains("gitea")) + { + $doExecute = "true" + $token = $giteaPass + $mirrorDestination = "@gitea2.steamware.net" + } + #verifico se devo effettuare cancellazione e creazione nuovo mirror + if($doExecute -eq "true") + { + #salvo id mirror e url mirror + $mirrorId = $($item.id) + $mirrorUrl = $($item.url) + WriteLogOutput 1 "ID: $mirrorId - URL: $mirrorUrl" + #tronco url fino a ".net" + $splitUrl = $mirrorUrl -split '.steamware.net/' + $trunkedPath = $splitUrl[1] + #compongo URL per cancellare mirror con ID trovato + $callUrlDeleteMirror = "https://gitlab.steamware.net/api/v4/projects/" + $projectCount + "/remote_mirrors/" + $mirrorId + #chiamata api con method delete che cancella mirror con id specificato + Invoke-WebRequest -Method Delete -URI $callUrlDeleteMirror -Headers $gitlabHead -ContentType "application/json" -UseBasicParsing + #compongo url da chiamare per creazione nuovo mirror + $callUrlCreateMirror = "https://gitlab.steamware.net/api/v4/projects/" + $projectCount + "/remote_mirrors" + #creo url del nuovo mirror con username e token relativi a gitlab + $newMirror = "https://" + $userName + ":" + $token + $mirrorDestination + "/" + $trunkedPath + #creo body da convertire in json + $body = + @{ + url = $newMirror + enabled = 1 + } + #converto body in json prima di passarlo alla chiamata POST + $jsonBody = ConvertTo-Json -InputObject $body + #chiamata api POST che crea mirror con url e body specificati + Invoke-WebRequest -Method Post -URI $callUrlCreateMirror -Headers $gitlabHead -ContentType "application/json" -Body $jsonBody -UseBasicParsing + WriteLogOutput 1 "ID: $mirrorId - URL: $mirrorUrl - Mirror ricostruito con successo" + } + } + } + #scrivo se trovo un errore (in particolare progetto ID non trovato) durante il try/catch + catch + { + WriteLogOutput 3 "" + WriteLogOutput 3 "--------------------" + WriteLogOutput 3 "**ERRORE: PROGETTO $projectCount NON ESISTENTE**" + } + $projectCount=$projectCount+1 +} +#fine ciclo principale +while($projectCount -le $projectNumber) + +# fermo stopwatch e calcolo durata script +$mainStopWatch.Stop() +$durataScript = $mainStopWatch.Elapsed.TotalSeconds + +#rilevo time per log fine analisi +$endTime = (Get-Date).toString("yyyy/MM/dd HH:mm:ss") + +#scrivo a video le statistiche +WriteLogOutput 0 "" +WriteLogOutput 0 "Fine Esecuzione Script: $endTime" +WriteLogOutput 0 "" +WriteLogOutput 0 "Durata Esecuzione Script: $durataScript secondi" +WriteLogOutput 0 "" \ No newline at end of file