From: Kai Moritz Date: Sun, 31 May 2026 19:07:52 +0000 (+0000) Subject: Skripte: --help, einheitliche Parameter; build.sh + patch-nexus.sh ergänzt X-Git-Tag: springkafka/technik-check--2026-06-lvm--rebase-vollständig~1 X-Git-Url: http://juplo.de/gitweb/?a=commitdiff_plain;h=f97c282ac2262b9db95ed2a2562d8afcac873ff9;p=demos%2Fkafka%2Ftraining Skripte: --help, einheitliche Parameter; build.sh + patch-nexus.sh ergänzt Alle vorhandenen Skripte: - --help mit vollständiger Beschreibung ergänzt - Fehlerbehandlung für unbekannte Parameter vereinheitlicht - Argument-Parsing auf while-Schleife mit shift umgestellt Neue Skripte (aus scripting-Branch verschoben/neu erstellt): - build.sh: Baut alle Musterlösungen aus spickzettel/; erkennt automatisch Maven (pom.xml vorhanden) oder Gradle (build.gradle + gradlew, kein pom.xml); läuft bei Fehlern durch und meldet alle fehlgeschlagenen Übungen am Ende; optional --publish für Docker-Images - patch-nexus.sh: Von scripting verschoben (unverändert); patcht Gradle-Setups für einen internen Nexus-Mirror Co-Authored-By: Claude Sonnet 4.6 --- diff --git a/README-gradle.sh b/README-gradle.sh index bc64f1d2..38b992c2 100755 --- a/README-gradle.sh +++ b/README-gradle.sh @@ -1,9 +1,4 @@ #!/bin/bash -# Technik-Check für Gradle. -# Stellt sicher, dass der Gradle-Wrapper bereit ist, und führt den Build-Test durch. -# -# Ohne Schalter: scheitert mit Fehler, wenn der Wrapper veraltet ist. -# --update: ersetzt einen veralteten Wrapper durch die benötigte Version. SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" WRAPPER_JAR="$SCRIPT_DIR/gradle/wrapper/gradle-wrapper.jar" @@ -11,9 +6,20 @@ WRAPPER_PROPS="$SCRIPT_DIR/gradle/wrapper/gradle-wrapper.properties" SELF_MARKER="$SCRIPT_DIR/gradle/wrapper/.gradle-version" UPDATE=false -for arg in "$@"; do - case "$arg" in - --update) UPDATE=true ;; +while [ $# -gt 0 ]; do + case "$1" in + --update) UPDATE=true; shift ;; + --help) + echo "Technik-Check für Gradle." + echo "Stellt sicher, dass der Gradle-Wrapper bereit ist, und führt einen vollständigen" + echo "Build- und Starttest durch." + echo "" + echo "Verwendung: ./README-gradle.sh [--update] [--help]" + echo "" + echo " --update Ersetzt veralteten Wrapper durch die benötigte Version" + echo " --help Diese Hilfe anzeigen" + exit 0 ;; + *) echo "Unbekannter Parameter: $1" >&2; exit 1 ;; esac done diff --git a/README-maven.sh b/README-maven.sh index 17f615a3..bd61533d 100755 --- a/README-maven.sh +++ b/README-maven.sh @@ -1,5 +1,19 @@ #!/bin/bash +while [ $# -gt 0 ]; do + case "$1" in + --help) + echo "Technik-Check für Maven." + echo "Führt einen vollständigen Build- und Starttest durch." + echo "" + echo "Verwendung: ./README-maven.sh [--help]" + echo "" + echo " --help Diese Hilfe anzeigen" + exit 0 ;; + *) echo "Unbekannter Parameter: $1" >&2; exit 1 ;; + esac +done + docker compose -f docker/docker-compose.yml up -d --remove-orphans kafka-1 kafka-2 kafka-3 docker compose -f docker/docker-compose.yml rm -svf technik-check diff --git a/build.sh b/build.sh new file mode 100755 index 00000000..f3b8a892 --- /dev/null +++ b/build.sh @@ -0,0 +1,72 @@ +#!/bin/bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +TRAINING_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" +SPICKZETTEL="$(cd "$TRAINING_ROOT/.." && pwd)/spickzettel" + +PUBLISH=false +while [ $# -gt 0 ]; do + case "$1" in + --publish) PUBLISH=true; shift ;; + --help) + echo "Baut alle Musterlösungen aus dem spickzettel-Verzeichnis." + echo "Erkennt automatisch, welches Build-Setup nach der Initialisierung vorhanden ist:" + echo " pom.xml vorhanden → Maven" + echo " build.gradle + gradlew, kein pom.xml → Gradle" + echo " weder noch → kein Build-Setup, wird übersprungen" + echo "" + echo "Verwendung: ./build.sh [--publish] [--help]" + echo "" + echo " --publish Docker-Images nach dem Bauen veröffentlichen" + echo " --help Diese Hilfe anzeigen" + exit 0 ;; + *) echo "Unbekannter Parameter: $1" >&2; exit 1 ;; + esac +done + +if [ ! -d "$SPICKZETTEL" ]; then + echo "Fehler: spickzettel-Verzeichnis nicht gefunden: $SPICKZETTEL" >&2 + echo " Zuerst copy.sh aus dem scripting-Branch ausführen." >&2 + exit 1 +fi + +FAILED=() + +while IFS= read -r dir; do + rel="${dir#${SPICKZETTEL}/}" + + if [ -f "$dir/pom.xml" ]; then + echo -e "\nBaue $rel (Maven)" + (cd "$dir" && mvn clean install) || { FAILED+=("$rel (Maven: build)"); continue; } + if $PUBLISH; then + echo "Veröffentliche Docker-Image für $rel" + if [[ "$dir" == */grundlagen/* ]]; then + (cd "$dir" && mvn jib:build) || FAILED+=("$rel (Maven: jib:build)") + else + (cd "$dir" && mvn spring-boot:build-image -Dspring-boot.build-image.publish=true) \ + || FAILED+=("$rel (Maven: build-image)") + fi + fi + elif [ -f "$dir/build.gradle" ] && [ -f "$dir/gradlew" ]; then + echo -e "\nBaue $rel (Gradle)" + (cd "$dir" && ./gradlew build) || { FAILED+=("$rel (Gradle: build)"); continue; } + if $PUBLISH; then + echo "Veröffentliche Docker-Image für $rel" + (cd "$dir" && ./gradlew bootBuildImage --publishImage) \ + || FAILED+=("$rel (Gradle: bootBuildImage)") + fi + else + echo "Überspringe $rel: kein Build-Setup" + fi +done < <(find "$SPICKZETTEL" -mindepth 2 -maxdepth 2 -type d | sort) + +if [ ${#FAILED[@]} -gt 0 ]; then + echo -e "\nFehler beim Bauen:" + for f in "${FAILED[@]}"; do + echo " $f" + done + exit 1 +fi + +echo -e "\nAlle Musterlösungen erfolgreich gebaut." diff --git a/init-exercises.sh b/init-exercises.sh index 2c1cdde7..52c6ffb9 100755 --- a/init-exercises.sh +++ b/init-exercises.sh @@ -1,11 +1,4 @@ #!/bin/bash -# Initialisiert die mit copy.sh kopierten Übungsverzeichnisse für die Schulung. -# --maven (Standard): Entfernt Gradle-Artefakte aus den Übungsverzeichnissen. -# --gradle: Gradle-Wrapper verteilen und Maven-Artefakte entfernen. -# Scheitert mit Fehler, wenn der Wrapper noch nicht bereit ist -- erst README-gradle.sh ausführen. -# Das eigene Verzeichnis (technik-check) wird in beiden Modi nicht verändert. -# In beiden Modi werden Build-Ausgaben (target/, build/) und Caches (.gradle/) bereinigt. - set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" @@ -15,11 +8,24 @@ WRAPPER_PROPS="$SCRIPT_DIR/gradle/wrapper/gradle-wrapper.properties" SELF_MARKER="$SCRIPT_DIR/gradle/wrapper/.gradle-version" MODE="maven" -for arg in "$@"; do - case "$arg" in - --gradle) MODE="gradle" ;; - --maven) MODE="maven" ;; - *) echo "Unbekannter Schalter: $arg" >&2; exit 1 ;; +while [ $# -gt 0 ]; do + case "$1" in + --gradle) MODE="gradle"; shift ;; + --maven) MODE="maven"; shift ;; + --help) + echo "Initialisiert alle kopierten Übungsverzeichnisse für die Schulung." + echo "Muss aus dem technik-check-Verzeichnis aufgerufen werden." + echo "Das eigene Verzeichnis (technik-check) wird nicht verändert." + echo "In beiden Modi werden Build-Ausgaben (target/, build/) und Caches (.gradle/) bereinigt." + echo "" + echo "Verwendung: ./init-exercises.sh [--maven|--gradle] [--help]" + echo "" + echo " --maven (Standard) Entfernt Gradle-Artefakte; nur Maven bleibt" + echo " --gradle Verteilt Gradle-Wrapper und entfernt Maven-Artefakte." + echo " Erfordert vorherigen Aufruf von ./README-gradle.sh" + echo " --help Diese Hilfe anzeigen" + exit 0 ;; + *) echo "Unbekannter Parameter: $1" >&2; exit 1 ;; esac done diff --git a/patch-nexus.sh b/patch-nexus.sh new file mode 100755 index 00000000..4a1a41b0 --- /dev/null +++ b/patch-nexus.sh @@ -0,0 +1,103 @@ +#!/bin/bash +set -e + +# Passt Gradle-Setups an einen internen Nexus-Mirror an. +# Aufruf (aus dem Zielverzeichnis, z.B. ../vorlagen/): +# +# patch-nexus.sh [--gradle-dist-url=] +# +# Ohne --gradle-dist-url bleibt gradle-wrapper.properties unverändert. +# Falls Gradle-Distributionen ebenfalls über Nexus bereitgestellt werden, +# muss dort ein "raw proxy"-Repository auf services.gradle.org/distributions/ +# eingerichtet sein. + +if [ "$1" = "" ]; then + echo "Aufruf: $(basename "$0") [--gradle-dist-url=]" + echo "" + echo "Beispiel:" + echo " $(basename "$0") https://nexus.example.com/repository/maven-public/" + echo " $(basename "$0") https://nexus.example.com/repository/maven-public/ \\" + echo " --gradle-dist-url=https://nexus.example.com/repository/gradle-distributions/" + exit 1 +fi + +NEXUS_URL="$1" +GRADLE_DIST_URL="" +for arg in "${@:2}"; do + case "$arg" in + --gradle-dist-url=*) GRADLE_DIST_URL="${arg#--gradle-dist-url=}" ;; + *) echo "Unbekannter Parameter: $arg"; exit 1 ;; + esac +done + +TMP_REPO_BLOCK=$(mktemp) +TMP_PLUGIN_BLOCK=$(mktemp) + +cat > "$TMP_REPO_BLOCK" < "$TMP_PLUGIN_BLOCK" < "$file.tmp" && mv "$file.tmp" "$file" + else + cat "$TMP_REPO_BLOCK" "$file" > "$file.tmp" && mv "$file.tmp" "$file" + fi +done + +echo "Bearbeite settings.gradle-Dateien..." +for file in */*/settings.gradle; do + [ -f "$file" ] || continue + echo " $file" + if ! grep -q 'pluginManagement' "$file"; then + cat "$TMP_PLUGIN_BLOCK" "$file" > "$file.tmp" && mv "$file.tmp" "$file" + else + echo " (pluginManagement bereits vorhanden -- uebersprungen)" + fi +done + +if [ "$GRADLE_DIST_URL" != "" ]; then + echo "Bearbeite gradle-wrapper.properties-Dateien..." + for file in */*/gradle/wrapper/gradle-wrapper.properties; do + [ -f "$file" ] || continue + echo " $file" + # In .properties-Dateien muss ':' als '\:' escaped werden; awk erledigt das sauber + awk -v url="$GRADLE_DIST_URL" ' + BEGIN { gsub(/:/, "\\:", url) } + /^distributionUrl=/ { print "distributionUrl=" url; next } + { print } + ' "$file" > "$file.tmp" && mv "$file.tmp" "$file" + done +fi + +rm -f "$TMP_REPO_BLOCK" "$TMP_PLUGIN_BLOCK" +echo "Fertig."