]> juplo.de Git - demos/kafka/training/commitdiff
bootstrap-gradle.sh → init-exercises.sh: Schulungs-Initialisierung verallgemeinert
authorKai Moritz <kai.milan.moritz@googlemail.com>
Sun, 31 May 2026 11:03:39 +0000 (11:03 +0000)
committerKai Moritz <kai.milan.moritz@googlemail.com>
Fri, 12 Jun 2026 17:49:07 +0000 (19:49 +0200)
- 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 <noreply@anthropic.com>
.gitignore
README-gradle.sh
bootstrap-gradle.sh [deleted file]
init-exercises.sh [new file with mode: 0755]

index b79fd1a02833bc66d5f40e808a10a4672b1f4f6b..59a11d3d8d3bdc3bb28da660cd067f20e9736052 100644 (file)
@@ -6,6 +6,7 @@ target/
 .gradle
 build/
 gradle/wrapper/gradle-wrapper.jar
+gradle/wrapper/.gradle-version
 !**/src/main/**/build/
 !**/src/test/**/build/
 
index 8b05dd05ff9930fdc69abd32b70fecc9e54415b9..bc64f1d20d7ff6406f58c3935c7533b74d21ce8b 100755 (executable)
@@ -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 (executable)
index 7766512..0000000
+++ /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 (executable)
index 0000000..24eff04
--- /dev/null
@@ -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