From b36052ad21fbbc9c008f55629c472510a1fa3526 Mon Sep 17 00:00:00 2001 From: Kai Moritz Date: Sun, 31 May 2026 11:03:39 +0000 Subject: [PATCH] =?utf8?q?bootstrap-gradle.sh=20=E2=86=92=20init-exercises?= =?utf8?q?.sh:=20Schulungs-Initialisierung=20verallgemeinert?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit - bootstrap-gradle.sh ersetzt durch init-exercises.sh mit --maven (Standard) und --gradle - --gradle: verteilt Wrapper (JAR + properties + gradlew) in alle Übungsverzeichnisse (vorlagen/, livecoding/, spickzettel/), entfernt Maven-Artefakte (pom.xml, .maven-dockerexclude); scheitert mit Fehler wenn Wrapper noch nicht bereit - --maven: entfernt verteilte Gradle-Artefakte aus allen Übungsverzeichnissen - Beide Modi: löschen Build-Ausgaben (target/, build/) und Caches (.gradle/) - README-gradle.sh: enthält jetzt die Wrapper-Download-Logik mit --update-Schalter; ohne --update scheitert es laut, wenn installierte Version nicht zur benötigten passt - .gitignore: gradle/wrapper/.gradle-version (Versions-Marker) ergänzt Co-Authored-By: Claude Sonnet 4.6 --- .gitignore | 1 + README-gradle.sh | 62 ++++++++++++++++++++++++++-- bootstrap-gradle.sh | 57 -------------------------- init-exercises.sh | 98 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 158 insertions(+), 60 deletions(-) delete mode 100755 bootstrap-gradle.sh create mode 100755 init-exercises.sh diff --git a/.gitignore b/.gitignore index b79fd1a0..59a11d3d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ target/ .gradle build/ gradle/wrapper/gradle-wrapper.jar +gradle/wrapper/.gradle-version !**/src/main/**/build/ !**/src/test/**/build/ diff --git a/README-gradle.sh b/README-gradle.sh index 8b05dd05..bc64f1d2 100755 --- a/README-gradle.sh +++ b/README-gradle.sh @@ -1,11 +1,67 @@ #!/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" +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 ;; + esac +done + +gradle_version() { + grep distributionUrl "$1" | grep -oE '[0-9]+\.[0-9]+(\.[0-9]+)?' +} + +download_wrapper() { + local version="$1" + if command -v gradle >/dev/null 2>&1; then + echo "Verwende lokale Gradle-Installation..." + (cd "$SCRIPT_DIR" && gradle wrapper --gradle-version="$version") + else + echo "Kein lokales Gradle -- lade von GitHub (v${version})..." + BASE="https://raw.githubusercontent.com/gradle/gradle/v${version}" + mkdir -p "$SCRIPT_DIR/gradle/wrapper" + curl -fL "${BASE}/gradle/wrapper/gradle-wrapper.jar" -o "$WRAPPER_JAR" + curl -fL "${BASE}/gradlew" -o "$SCRIPT_DIR/gradlew" + chmod +x "$SCRIPT_DIR/gradlew" + fi + echo "$version" > "$SELF_MARKER" + echo "Gradle-Wrapper bereit (v${version})." +} + +REQUIRED=$(gradle_version "$WRAPPER_PROPS") + +if [ ! -f "$WRAPPER_JAR" ]; then + echo "Gradle-Wrapper-JAR fehlt -- lade herunter..." + download_wrapper "$REQUIRED" +elif [ ! -f "$SELF_MARKER" ] || [ "$(cat "$SELF_MARKER")" != "$REQUIRED" ]; then + INSTALLED=$(cat "$SELF_MARKER" 2>/dev/null || echo "unbekannt") + if $UPDATE; then + echo "Aktualisiere Gradle-Wrapper: v${INSTALLED} → v${REQUIRED}..." + download_wrapper "$REQUIRED" + else + echo "FEHLER: Gradle-Version stimmt nicht überein." >&2 + echo " Installiert: ${INSTALLED}" >&2 + echo " Benötigt: ${REQUIRED}" >&2 + echo " Zum Aktualisieren: ./README-gradle.sh --update" >&2 + exit 1 + fi +else + echo "Gradle-Wrapper bereits aktuell (v${REQUIRED})." +fi 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 -# Gradle-Wrapper erzeugen (nur beim ersten Mal nötig) -./bootstrap-gradle.sh - # Build mit Gradle testen ./gradlew bootBuildImage || exit diff --git a/bootstrap-gradle.sh b/bootstrap-gradle.sh deleted file mode 100755 index 7766512c..00000000 --- a/bootstrap-gradle.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash -# Erzeugt den Gradle-Wrapper-JAR, der wegen Mail-Sicherheitsfiltern nicht im -# Repository enthalten ist. Einmalig ausführen, bevor ./gradlew verwendet wird. -# -# Variante 1: Verwendet eine lokale Gradle-Installation, falls vorhanden. -# Variante 2: Lädt den JAR direkt von GitHub herunter. -# -# Mit --distribute werden Gradle-Wrapper-JAR und gradlew zusätzlich in alle -# Geschwister-Übungsverzeichnisse kopiert (setzt TGZ-Verzeichnisstruktur voraus). - -set -e - -WRAPPER_JAR="gradle/wrapper/gradle-wrapper.jar" -PROPERTIES="gradle/wrapper/gradle-wrapper.properties" - -DISTRIBUTE=false -[ "$1" = "--distribute" ] && DISTRIBUTE=true - -if [ ! -f "$WRAPPER_JAR" ] || [ ! -f "gradlew" ]; then - VERSION=$(grep distributionUrl "$PROPERTIES" | grep -oE '[0-9]+\.[0-9]+(\.[0-9]+)?') - echo "Benötigte Gradle-Version: $VERSION" - - if command -v gradle >/dev/null 2>&1; then - echo "Verwende lokale Gradle-Installation..." - gradle wrapper --gradle-version="$VERSION" - echo "Gradle-Wrapper erfolgreich erzeugt." - else - echo "Kein lokales Gradle gefunden -- lade von GitHub (v${VERSION})..." - BASE="https://raw.githubusercontent.com/gradle/gradle/v${VERSION}" - mkdir -p gradle/wrapper - curl -fL "${BASE}/gradle/wrapper/gradle-wrapper.jar" -o "$WRAPPER_JAR" - curl -fL "${BASE}/gradlew" -o gradlew - chmod +x gradlew - echo "Gradle-Wrapper erfolgreich heruntergeladen." - fi -else - echo "Gradle-Wrapper bereits vorhanden." -fi - -if $DISTRIBUTE; then - TRAINING_ROOT="$(cd ../.. && pwd)" - echo "Verteile Gradle-Wrapper in: $TRAINING_ROOT" - find "$TRAINING_ROOT" -name "build.gradle" ! -path "$(pwd)/*" | while read -r build_file; do - exercise_dir="$(dirname "$build_file")" - target_jar="$exercise_dir/gradle/wrapper/gradle-wrapper.jar" - target_gradlew="$exercise_dir/gradlew" - if [ ! -f "$target_jar" ]; then - mkdir -p "$exercise_dir/gradle/wrapper" - cp "$WRAPPER_JAR" "$target_jar" - echo " JAR → $target_jar" - fi - if [ ! -f "$target_gradlew" ]; then - cp gradlew "$target_gradlew" - echo " gradlew → $target_gradlew" - fi - done -fi diff --git a/init-exercises.sh b/init-exercises.sh new file mode 100755 index 00000000..24eff04e --- /dev/null +++ b/init-exercises.sh @@ -0,0 +1,98 @@ +#!/bin/bash +# Initialisiert die mit copy.sh kopierten Übungsverzeichnisse für die Schulung. +# --maven (Standard): Entfernt Gradle-Artefakte aus allen Ü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. +# In beiden Modi werden Build-Ausgaben (target/, build/) und Caches (.gradle/) bereinigt. + +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +TRAINING_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" +WRAPPER_JAR="$SCRIPT_DIR/gradle/wrapper/gradle-wrapper.jar" +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 ;; + esac +done + +gradle_version() { + grep distributionUrl "$1" | grep -oE '[0-9]+\.[0-9]+(\.[0-9]+)?' +} + +exercise_dirs() { + local roots=("$TRAINING_ROOT") + for sibling in livecoding spickzettel; do + local candidate + candidate="$(cd "$TRAINING_ROOT/.." && pwd)/$sibling" + [ -d "$candidate" ] && roots+=("$candidate") + done + { + printf '%s\n' "$SCRIPT_DIR" + for root in "${roots[@]}"; do + find "$root" -maxdepth 2 -name "build.gradle" -exec dirname {} \; + done + } | sort -u +} + +if [ "$MODE" = "gradle" ]; then + REQUIRED=$(gradle_version "$WRAPPER_PROPS") + + if [ ! -f "$WRAPPER_JAR" ] || \ + [ ! -f "$SELF_MARKER" ] || \ + [ "$(cat "$SELF_MARKER")" != "$REQUIRED" ]; then + echo "FEHLER: Gradle-Wrapper nicht bereit (v${REQUIRED})." >&2 + echo " Bitte zuerst ./README-gradle.sh ausführen." >&2 + echo " Bei Versions-Abweichung: ./README-gradle.sh --update" >&2 + exit 1 + fi + + echo "Gradle-Version: $REQUIRED" + + while IFS= read -r dir; do + if [ "$dir" != "$SCRIPT_DIR" ]; then + marker="$dir/gradle/wrapper/.gradle-version" + if [ ! -f "$dir/gradle/wrapper/gradle-wrapper.jar" ] || \ + [ ! -f "$dir/gradle/wrapper/gradle-wrapper.properties" ] || \ + [ ! -f "$dir/gradlew" ] || \ + [ ! -f "$marker" ] || \ + [ "$(cat "$marker")" != "$REQUIRED" ]; then + mkdir -p "$dir/gradle/wrapper" + cp "$WRAPPER_JAR" "$dir/gradle/wrapper/gradle-wrapper.jar" + cp "$WRAPPER_PROPS" "$dir/gradle/wrapper/gradle-wrapper.properties" + cp "$SCRIPT_DIR/gradlew" "$dir/gradlew" + chmod +x "$dir/gradlew" + echo "$REQUIRED" > "$marker" + echo " Wrapper → $(basename "$(dirname "$dir")")/$(basename "$dir")" + fi + fi + + for f in pom.xml .maven-dockerexclude; do + [ -f "$dir/$f" ] && rm "$dir/$f" && echo " $f ← $(basename "$(dirname "$dir")")/$(basename "$dir")" + done + rm -rf "$dir/target" "$dir/build" + done < <(exercise_dirs) + +elif [ "$MODE" = "maven" ]; then + while IFS= read -r dir; do + if [ "$dir" = "$SCRIPT_DIR" ]; then + # Nur heruntergeladene Artefakte entfernen; gradlew und properties bleiben (Quelldateien) + rm -f "$dir/gradle/wrapper/gradle-wrapper.jar" \ + "$dir/gradle/wrapper/.gradle-version" + else + rm -f "$dir/gradle/wrapper/gradle-wrapper.jar" \ + "$dir/gradle/wrapper/gradle-wrapper.properties" \ + "$dir/gradle/wrapper/.gradle-version" \ + "$dir/gradlew" + rmdir "$dir/gradle/wrapper" 2>/dev/null || true + rmdir "$dir/gradle" 2>/dev/null || true + fi + rm -rf "$dir/.gradle" "$dir/target" "$dir/build" + done < <(exercise_dirs) +fi -- 2.39.5