From 579eb5b5e04f38ff439f3d4c2a4707ef4119f700 Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Mon, 8 Jun 2026 08:00:20 +0200 Subject: [PATCH] fix(deploy): ENOTEMPTY-Halbwipe von android/ verhindern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit clean-ios.sh rief 'expo prebuild --clean' ohne --platform → wollte auch android/ löschen. Hält ein Gradle-Daemon android/build|.gradle offen, failt 'rmdir android' mit ENOTEMPTY und hinterlässt ein halb-gewischtes android/ (Source weg, gelocktes build/ bleibt) → späterer Release-Build failt mit "autolinking.json doesn't exist". - clean-ios.sh: 'prebuild --clean --platform ios' → android/ wird beim iOS-Clean gar nicht mehr angefasst. - deploy.sh: release_android_locks() (gradlew --stop + GradleDaemon-kill + rm build/.gradle) läuft vor dem android-prebuild --clean in ensure_native_dir. Ergänzt den ensure_native_dir-Self-Healing-Fix (fe6a63b): jetzt wird der Halbwipe nicht nur erkannt+repariert, sondern an der Quelle verhindert. Co-Authored-By: Claude Opus 4.8 --- apps/rebreak-native/clean-ios.sh | 8 ++++++-- apps/rebreak-native/deploy.sh | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/apps/rebreak-native/clean-ios.sh b/apps/rebreak-native/clean-ios.sh index 95253e5..f243070 100755 --- a/apps/rebreak-native/clean-ios.sh +++ b/apps/rebreak-native/clean-ios.sh @@ -64,8 +64,12 @@ if [ "$SKIP_PODS" = "1" ]; then else # 3. Prebuild: regeneriert ios/ aus app.config.ts + Config-Plugins # Dank with-fmt-consteval-fix-Plugin wird das Podfile auto-gepatcht. - echo "→ pnpm expo prebuild --clean" - pnpm expo prebuild --clean + # ⚠️ --platform ios: NUR ios/ regenerieren, android/ NICHT anfassen. Ein + # 'prebuild --clean' ohne --platform will auch android/ löschen; hält ein + # Gradle-Daemon dort build/.gradle offen, failt das rmdir mit ENOTEMPTY und + # hinterlässt ein halb-gewischtes android/ (Source weg, gelocktes build/ bleibt). + echo "→ pnpm expo prebuild --clean --platform ios" + pnpm expo prebuild --clean --platform ios # 4. Pod install echo "→ cd ios && pod install" diff --git a/apps/rebreak-native/deploy.sh b/apps/rebreak-native/deploy.sh index 9d9ae26..bae1fa3 100755 --- a/apps/rebreak-native/deploy.sh +++ b/apps/rebreak-native/deploy.sh @@ -389,6 +389,18 @@ ASC_API_KEY_PATH="${ASC_API_KEY_PATH:-}" ASC_API_KEY_ID="${ASC_API_KEY_ID:-}" ASC_API_KEY_ISSUER="${ASC_API_KEY_ISSUER:-}" +# Stoppt laufende Gradle-Daemons + entfernt android-Build-Output, BEVOR ein +# 'expo prebuild --clean' android/ löschen will. Ein Daemon (von Builds, lebt ~3h) +# hält sonst android/build|.gradle offen → 'rmdir android' failt mit ENOTEMPTY → +# android/ wird nur halb gewischt (Source weg, gelocktes build/ bleibt). Idempotent. +release_android_locks() { + if [[ -x "$ANDROID_DIR/gradlew" ]]; then + ( cd "$ANDROID_DIR" && ./gradlew --stop >/dev/null 2>&1 ) || true + fi + pkill -f "GradleDaemon" 2>/dev/null || true + rm -rf "$ANDROID_DIR/build" "$ANDROID_DIR/.gradle" "$ANDROID_DIR/app/build" 2>/dev/null || true +} + # Stellt sicher dass ios/ oder android/ ein VOLLSTÄNDIGES Prebuild ist — sonst # Auto-(Re)Prebuild (fehlt komplett → prebuild; halb-gewischt → prebuild --clean). # Usage: ensure_native_dir ios | ensure_native_dir android @@ -414,6 +426,9 @@ ensure_native_dir() { if [[ -d "$target_dir" && ! -f "$marker" ]]; then warn "$platform/ ist unvollständig (Marker $(basename "$marker") fehlt) — regeneriere via prebuild --clean" + # Vor dem android-Clean Gradle-Daemons stoppen + Build-Output entfernen, sonst + # kann 'prebuild --clean' am gelockten android/build mit ENOTEMPTY scheitern. + [[ "$platform" == "android" ]] && release_android_locks # --clean wischt + regeneriert NUR $platform/ (die andere Plattform bleibt # unangetastet) und räumt den kaputten Halb-Zustand sauber auf. run_quiet "expo prebuild --clean ($platform)" "$LOG_DIR/prebuild-$platform-$TIMESTAMP.log" \