pipeline {
    agent {
        kubernetes {
            // Definiert den Pod mit dem .NET 8 SDK Image
            yaml '''
                apiVersion: v1
                kind: Pod
                spec:
                  containers:
                  - name: dotnet8
                    image: mcr.microsoft.com/dotnet/sdk:8.0
                    command:
                    - cat
                    tty: true
                  - name: trivy
                    image: aquasec/trivy:latest
                    command:
                    - cat
                    tty: true    
                '''
        }
    }

    options {
        // Log-Rotation: Bewahre nur die letzten 10 Builds auf
        // und lösche Berichte/Artefakte von Builds, die älter als 7 Tage sind.
        buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '10', daysToKeepStr: '7'))
    }

	stages {
		stage('Checkout Source') {
			steps {
				// Ersetze 'dein-user' und 'dein-repo' durch die Namen aus Gitea
				git url: 'http://130.61.26.230:30080/dev-master/secdevops-csharp-app.git',
					branch: 'master'
			}
		}

		stage('Build with .NET 8') {
			steps {
				// Führt den Build-Befehl im spezialisierten Container aus
				container('dotnet8') {
					sh 'dotnet --version' // Zur Bestätigung der Version
					sh 'dotnet build'
				}
			}	
		}

        stage('Security: Trivy Scan') {
            steps {
                container('trivy') {
                    // Wir erstellen ein Verzeichnis für den Report
                    sh 'mkdir -p reports'
                    
                    // Der Befehl erzeugt die HTML-Datei
                    // --format template: Nutzt ein Layout
                    // --template "@/contrib/html.tpl": Das Standard-Trivy-Layout
                    // Scannt das Dateisystem auf Schwachstellen (NuGet) und Secrets
                    // --exit-code 1 lässt die Pipeline bei kritischen Fehlern abbrechen
                    sh 'trivy fs -scanners vuln,secret,config --exit-code 1 --severity HIGH,CRITICAL --format template --template "@/contrib/html.tpl" -o reports/trivy-report.html .'
                }
            }
        }
		
		stage('Unit Tests') {
            steps {
                container('dotnet8') {
                    // Erstellt eine XML-Datei im Format 'junit', die Jenkins lesen kann
                    // sh 'dotnet test --configuration Release' 
                    sh 'dotnet test --configuration Release --logger "junit;LogFileName=results.xml"'
                }
            }
        }

		stage('Set Build Name') {
			steps {
				script {
					// Setzt den Namen des aktuellen Laufs auf die Version + Build-Nummer
					currentBuild.displayName = "v1.0.0-build-${env.BUILD_NUMBER}"
				}
			}
		}
	}
	
    post {
        failure {
            script {
                currentBuild.description = "Build Fehler. Ev. Sicherheits-Check fehlgeschlagen! Details im Trivy Security Report."
            }
        }
        always {
            // Sammelt die Testergebnisse ein (die wir im Test-Schritt erzeugen)
            // Das **/ bedeutet: Suche in allen Unterordnern nach .xml Dateien
            junit testResults: '**/TestResults/*.xml', allowEmptyResults: true

             // Dieser Schritt macht den Report im Jenkins-Menü links sichtbar
            publishHTML([
                allowMissing: false,
                alwaysLinkToLastBuild: true,
                keepAll: true,
                reportDir: 'reports',
                reportFiles: 'trivy-report.html',
                reportName: 'Trivy Security Report'
            ])

            // Meldet den Status zurück, wenn das Gitea-Plugin korrekt konfiguriert ist
            echo "Pipeline beendet: ${currentBuild.result}"
        }
    }
}