150 lines
5.6 KiB
Groovy
150 lines
5.6 KiB
Groovy
// Jenkins-Pipeline für den PDF KI Renamer
|
||
// Läuft auf einem Linux-Container (Synology NAS).
|
||
// Der MSI-Build ist Windows-only (jpackage + WiX Toolset 3.x). Jenkins läuft im
|
||
// Linux-Container auf Synology NAS und kann kein MSI erzeugen. Der MSI-Build
|
||
// wird bewusst manuell auf der Windows-Entwicklungsmaschine ausgeführt:
|
||
// .\mvnw.cmd clean package -P release -pl pdf-umbenenner-packaging --also-make -DskipTests
|
||
|
||
pipeline {
|
||
agent any
|
||
|
||
tools {
|
||
maven 'maven-3'
|
||
}
|
||
|
||
// MAJOR und MINOR werden manuell als Jenkins-Parameter gepflegt.
|
||
// BUILD_NUMBER wird automatisch durch Jenkins vergeben.
|
||
// Die resultierende Versionsnummer lautet: MAJOR.MINOR.BUILD_NUMBER
|
||
parameters {
|
||
string(
|
||
name: 'MAJOR',
|
||
defaultValue: '3',
|
||
description: 'Hauptversionsnummer (manuell pflegen)'
|
||
)
|
||
string(
|
||
name: 'MINOR',
|
||
defaultValue: '0',
|
||
description: 'Nebenversionsnummer (manuell pflegen)'
|
||
)
|
||
}
|
||
|
||
environment {
|
||
// Effektive Versionsteile – übernommen aus Parametern oder State-Datei.
|
||
// Hinweis: Wenn MAJOR/MINOR aus einer persistierten State-Datei gelesen
|
||
// werden sollen (z. B. /builds/version.state), muss die Logik unten in
|
||
// der Stage 'Version bestimmen' entsprechend ergänzt werden.
|
||
// Im Minimalbetrieb werden die Parameter direkt übernommen.
|
||
EFFECTIVE_MAJOR = "${params.MAJOR}"
|
||
EFFECTIVE_MINOR = "${params.MINOR}"
|
||
}
|
||
|
||
stages {
|
||
|
||
// Optionaler Stub: MAJOR/MINOR aus persistierter State-Datei laden.
|
||
// Wenn das bestehende Jenkins-Setup die Versionsnummern in einer
|
||
// State-Datei unter /builds/version.state persistiert, kann diese
|
||
// Stage die Umgebungsvariablen EFFECTIVE_MAJOR und EFFECTIVE_MINOR
|
||
// vor dem Build überschreiben. Ansonsten gelten die Parameter-Werte.
|
||
stage('Version bestimmen') {
|
||
steps {
|
||
script {
|
||
// Platzhalter: hier bei Bedarf State-Datei einlesen,
|
||
// z. B.:
|
||
// def state = readFile('/builds/version.state').trim()
|
||
// env.EFFECTIVE_MAJOR = state.split('\\.')[0]
|
||
// env.EFFECTIVE_MINOR = state.split('\\.')[1]
|
||
//
|
||
// Im Minimalbetrieb werden die Parameter-Werte verwendet:
|
||
echo "Buildversion: ${env.EFFECTIVE_MAJOR}.${env.EFFECTIVE_MINOR}.${env.BUILD_NUMBER}"
|
||
}
|
||
}
|
||
}
|
||
|
||
stage('Maven Build') {
|
||
steps {
|
||
// -Drevision übergibt die vollständige Versionsnummer an Maven.
|
||
// Das flatten-maven-plugin im Parent-POM löst ${revision} in
|
||
// allen installierten POMs auf, sodass kein unaufgelöstes
|
||
// ${revision} in ~/.m2 verbleibt.
|
||
sh "mvn clean verify -Drevision=${env.EFFECTIVE_MAJOR}.${env.EFFECTIVE_MINOR}.${env.BUILD_NUMBER}"
|
||
}
|
||
}
|
||
|
||
stage('Archive JAR') {
|
||
steps {
|
||
// Bash wird explizit erzwungen (#!/usr/bin/env bash, set -euo pipefail),
|
||
// weil Jenkins-Agenten standardmäßig sh (dash) verwenden, das kein
|
||
// mapfile kennt. mapfile zählt exakt die gefundenen Shade-JARs und
|
||
// bricht den Build ab, wenn nicht genau eines vorhanden ist.
|
||
sh '''#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
mapfile -t JARS < <(find pdf-umbenenner-bootstrap/target \
|
||
-maxdepth 1 -name "pdf-umbenenner-bootstrap-*.jar" \
|
||
! -name "*-sources.jar" ! -name "*-javadoc.jar")
|
||
|
||
test "${#JARS[@]}" -eq 1 \
|
||
|| { echo "FEHLER: Erwartet genau 1 Shade-JAR, gefunden: ${#JARS[@]}"; exit 1; }
|
||
|
||
JAR_NAME="pdf-ki-renamer-${EFFECTIVE_MAJOR}.${EFFECTIVE_MINOR}.${BUILD_NUMBER}.jar"
|
||
cp "${JARS[0]}" "$JAR_NAME"
|
||
echo "Shade-JAR archiviert als: $JAR_NAME"
|
||
'''
|
||
archiveArtifacts artifacts: 'pdf-ki-renamer-*.jar', fingerprint: true
|
||
}
|
||
}
|
||
|
||
stage('Berichte') {
|
||
steps {
|
||
// JUnit-Testergebnisse einlesen
|
||
junit testResults: '**/target/surefire-reports/*.xml', allowEmptyResults: true
|
||
|
||
// JaCoCo-Coverage (falls im Build erzeugt)
|
||
// jacoco execPattern: '**/target/jacoco.exec'
|
||
|
||
// PIT-Mutationstest-Bericht (falls im Build erzeugt)
|
||
// publishHTML(target: [reportDir: 'target/pit-reports', ...])
|
||
}
|
||
}
|
||
|
||
stage('Artefakt ablegen') {
|
||
steps {
|
||
// JAR-Kopie in zentrales Build-Verzeichnis ablegen.
|
||
// Pfad /builds/ muss auf dem Jenkins-Agent gemountet sein.
|
||
sh '''#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
BUILD_DIR="/builds/${EFFECTIVE_MAJOR}.${EFFECTIVE_MINOR}.${BUILD_NUMBER}"
|
||
mkdir -p "$BUILD_DIR"
|
||
cp pdf-ki-renamer-*.jar "$BUILD_DIR/"
|
||
echo "Artefakt abgelegt unter: $BUILD_DIR"
|
||
'''
|
||
}
|
||
}
|
||
|
||
stage('Aufräumen') {
|
||
steps {
|
||
// Lokale JAR-Kopie im Workspace entfernen (Artefakt ist archiviert)
|
||
sh '''#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
rm -f pdf-ki-renamer-*.jar
|
||
echo "Aufräumen abgeschlossen."
|
||
'''
|
||
}
|
||
}
|
||
}
|
||
|
||
post {
|
||
success {
|
||
echo "Build ${env.EFFECTIVE_MAJOR}.${env.EFFECTIVE_MINOR}.${env.BUILD_NUMBER} erfolgreich abgeschlossen."
|
||
}
|
||
failure {
|
||
echo "Build ${env.EFFECTIVE_MAJOR}.${env.EFFECTIVE_MINOR}.${env.BUILD_NUMBER} fehlgeschlagen."
|
||
}
|
||
always {
|
||
// Workspace nach Abschluss bereinigen
|
||
deleteDir()
|
||
}
|
||
}
|
||
}
|