#DOCS: https://docs.gitlab.com/ee/api/pipelines.html #ESEMPIO: https://gitlab.steamware.net/api/v4/projects/12/pipelines ################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() #token per autenticazione $head = @{"PRIVATE-TOKEN"="glpat-dQsUhS-GxNomkh1GnjHZ"} #contatore ciclo do while $projectCount = 1 #numero massimo di progetti da analizzare $projectNumber = 200 #conteggio progetti trovati $projectsWithPipeline = 0 #conteggio pipeline in errore $pipelineErrorsCount = 0 #conteggio pipeline riusciti $pipelineSuccessCount = 0 #livello di log: 0=log sintetico, 1=log errori, 2=log full, 3=log ampolloso $logLevel = 0 #output a terminale: 0=disattivo, 1=abilitato $terminalOutput = 0 #cartella file di log $GitLogFolder="c:\Steamware\Logs\Gitlab\" #nome file di log $logFile = Join-Path $GitLogFolder "GitlabPipeline.log" #dichiaro funzione per scrittura output Function WriteLogOutput { Param ($logType, [string]$logString) #scrivo su file la stringa se il tipo di log è > o = al livello di log richieeso if($logType -le $logLevel) { 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 PIPELINE"} 1 {WriteLogOutput 0 "LOG ERRORI GITLAB PIPELINE"} 2 {WriteLogOutput 0 "LOG FULL GITLAB PIPELINE"} 3 {WriteLogOutput 0 "LOG AMPOLLOSO GITLAB PIPELINE"} } 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 { $callUrl = "https://gitlab.steamware.net/api/v4/projects/" + $projectCount + "/pipelines/latest" try { $Response = Invoke-WebRequest -URI $callUrl -Headers $head -ContentType "application/json" -UseBasicParsing $parsedResponse = $Response.Content | ConvertFrom-Json #scrivo il numero del progetto nel terminale e su file WriteLogOutput 1 "" WriteLogOutput 1 "--------------------" WriteLogOutput 1 "**PROGETTO $projectCount**" foreach($item in $parsedResponse) { #verifico se i pipeline trovati per il progetto corrente hanno status "success" if($item.status.Equals("success")) { WriteLogOutput 2 "Pipeline: $($item.web_url) - Status: $($item.status)" $pipelineSuccessCount=$pipelineSuccessCount+1 } #i pipeline che non hanno status "success" vengono loggati con relativo errore else { WriteLogOutput 1 "Pipeline: $($item.web_url) - Status: $($item.status)" $pipelineErrorsCount=$pipelineErrorsCount+1 } } $projectsWithPipeline=$projectsWithPipeline+1 } #scrivo se trovo un errore (in particolare progetto non trovato o privo di pipeline) durante il try/catch (solo se loglevel è = 3) catch { WriteLogOutput 3 "" WriteLogOutput 3 "--------------------" WriteLogOutput 3 "**PROGETTO $projectCount NON ESISTENTE O PRIVO DI PIPELINE**" } $projectCount=$projectCount+1 } #fine ciclo principale while($projectCount -le $projectNumber) #somma di pipelineSuccess e pipelineErrors $pipelineCount = $pipelineSuccessCount+$pipelineErrorsCount #percentuale di pipelineSuccess sul totale $pipelineSuccessPercentage = [math]::Round(($pipelineSuccessCount/$pipelineCount)*100,1) #percentuale di pipelineErrors sul totale $pipelineErrorsPercentage = [math]::Round(($pipelineErrorsCount/$pipelineCount)*100,1) # 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") #invio a zabbix le metriche rilevate tramite zabbix_sender.exe WriteLogOutput 0 "" & "C:\Program Files\Zabbix Agent\zabbix_sender.exe" -z zabproxy.ufficio -s "IIS04" -k Gitlab.ProjectsWithPipeline -o $projectsWithPipeline & "C:\Program Files\Zabbix Agent\zabbix_sender.exe" -z zabproxy.ufficio -s "IIS04" -k Gitlab.TotalPipeline -o $pipelineCount & "C:\Program Files\Zabbix Agent\zabbix_sender.exe" -z zabproxy.ufficio -s "IIS04" -k Gitlab.SuccessPipeline -o $pipelineSuccessCount & "C:\Program Files\Zabbix Agent\zabbix_sender.exe" -z zabproxy.ufficio -s "IIS04" -k Gitlab.ErrorsPipeline -o $pipelineErrorsCount & "C:\Program Files\Zabbix Agent\zabbix_sender.exe" -z zabproxy.ufficio -s "IIS04" -k Gitlab.SuccessPipelinePercent -o $pipelineSuccessPercentage & "C:\Program Files\Zabbix Agent\zabbix_sender.exe" -z zabproxy.ufficio -s "IIS04" -k Gitlab.ErrorsPipelinePercent -o $pipelineErrorsPercentage & "C:\Program Files\Zabbix Agent\zabbix_sender.exe" -z zabproxy.ufficio -s "IIS04" -k Gitlab.CheckPipelineDuration -o $durataScript #scrivo a video le statistiche WriteLogOutput 0 "" WriteLogOutput 0 "PROGETTI CON PIPELINE ATTIVE: $projectsWithPipeline" WriteLogOutput 0 "PIPELINE TROVATE: $pipelineCount" WriteLogOutput 0 "PIPELINE RIUSCITE: $pipelineSuccessCount ($pipelineSuccessPercentage%)" WriteLogOutput 0 "PIPELINE FALLITE: $pipelineErrorsCount ($pipelineErrorsPercentage%)" WriteLogOutput 0 "" WriteLogOutput 0 "Fine Esecuzione Script: $endTime" WriteLogOutput 0 "" WriteLogOutput 0 "Durata Esecuzione Script: $durataScript secondi" WriteLogOutput 0 ""