From 0b943aead09ccfa8cb37fc76938c238d5dc96a56 Mon Sep 17 00:00:00 2001 From: datadunia Date: Wed, 27 May 2026 04:00:54 +0700 Subject: [PATCH] chore(ops): optimize update.sh to skip rebuild when no changes detected --- .gitignore | 1 + update.sh | 89 +++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 63 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index fcbb055..ad5d434 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ dist/ .sisyphus/boulder.json connect_remote.txt .sisyphus/drafts/ +.update-state # Node node_modules/ diff --git a/update.sh b/update.sh index a0e0739..ea96f49 100755 --- a/update.sh +++ b/update.sh @@ -5,6 +5,10 @@ echo "=========================================" echo " NexusGuard SD-WAN: SYSTEM UPDATE " echo "=========================================" +STATE_FILE=".update-state" +FORCE_REBUILD=false +[ "$1" = "--force" ] && FORCE_REBUILD=true + # 1. Pastikan file env ada if [ ! -f .env ]; then echo "[-] ERROR: .env file not found. Please run ./setup.sh first to initialize configuration." @@ -13,40 +17,71 @@ fi # 2. Update Code dari Git (Main & Submodules) echo "[+] Pulling latest source code from repository..." -git pull origin main || echo "[!] Git pull for main repo skipped or failed, continuing..." +GIT_PULL_FAILED=false +git pull origin main || { GIT_PULL_FAILED=true; echo "[!] Git pull for main repo skipped or failed, continuing..."; } echo "[+] Syncing and updating submodules..." -git submodule update --init --recursive --remote || echo "[!] Git submodule update skipped or failed." +SUBMODULE_FAILED=false +git submodule update --init --recursive --remote || { SUBMODULE_FAILED=true; echo "[!] Git submodule update skipped or failed."; } -# 3. Source variabel dari .env untuk dimasukkan ke build process (contoh: VITE_API_BASE_URL) -echo "[+] Sourcing environment variables from root .env..." -set -a && . .env && set +a +# 3. Hitung state hash (git + .env) untuk deteksi perubahan +CURRENT_HASH=$(echo "$(git rev-parse HEAD 2>/dev/null)$(git submodule status 2>/dev/null)$(sha256sum .env 2>/dev/null)" | sha256sum | cut -d" " -f1) -# 4. Gracefully stop existing containers, Rebuild Images & Restart -echo "[+] Stopping existing containers..." -docker compose down +# 4. Tentukan apakah perlu rebuild +NEEDS_REBUILD=false +if [ "$FORCE_REBUILD" = true ]; then + echo "[+] --force flag detected. Will rebuild." + NEEDS_REBUILD=true +elif [ "$GIT_PULL_FAILED" = true ] || [ "$SUBMODULE_FAILED" = true ]; then + echo "[!] Git operation failed. Rebuilding as safe fallback." + NEEDS_REBUILD=true +elif [ ! -f "$STATE_FILE" ]; then + echo "[+] First run (no state file found). Full cycle required." + NEEDS_REBUILD=true +else + PREVIOUS_HASH=$(cat "$STATE_FILE" 2>/dev/null || echo "") + if [ "$CURRENT_HASH" != "$PREVIOUS_HASH" ]; then + echo "[+] State hash changed. Rebuilding." + NEEDS_REBUILD=true + else + echo "[-] No changes detected. Skipping build and restart." + fi +fi -echo "[+] Rebuilding Docker images (injecting new environment variables)..." -# Menggunakan --build-arg untuk memastikan Vue/Vite membaca domain API baru -docker compose build --build-arg VITE_API_BASE_URL=$VITE_API_BASE_URL +# 5. Rebuild cycle — hanya jika ada perubahan +if [ "$NEEDS_REBUILD" = true ]; then + # Source .env untuk build process + echo "[+] Sourcing environment variables from root .env..." + set -a && . .env && set +a -echo "[+] Restarting containers..." -docker compose up -d + echo "[+] Stopping existing containers..." + docker compose down -# 5. Run Database Migrations -echo "[+] Running automated database migrations..." -docker exec nexus-guard-suite-server-core-1 ./server-core -migrate-prod || echo "[!] Migration skipped or failed. It might not be needed." + echo "[+] Rebuilding Docker images..." + docker compose build --build-arg VITE_API_BASE_URL=$VITE_API_BASE_URL -# 5b. Backfill interface addresses for existing nodes (idempotent) -echo "[+] Backfilling interface addresses for existing nodes..." -docker exec nexus-guard-suite-server-core-1 ./server-core -backfill-interface 2>/dev/null || echo "[!] Backfill skipped or not needed." + echo "[+] Restarting containers..." + docker compose up -d -# 6. Cleanup -echo "[+] Cleaning up unused dangling images to free up space..." -docker image prune -f + echo "[+] Running automated database migrations..." + docker exec nexus-guard-suite-server-core-1 ./server-core -migrate-prod || echo "[!] Migration skipped or failed. It might not be needed." -echo "=========================================" -echo " Update & Deployment complete! " -echo " Dashboard : http://localhost:${WEB_PORT:-80}" -echo " API Port : ${API_PORT:-8080}" -echo "=========================================" + echo "[+] Backfilling interface addresses..." + docker exec nexus-guard-suite-server-core-1 ./server-core -backfill-interface 2>/dev/null || echo "[!] Backfill skipped or not needed." + + echo "[+] Cleaning up unused dangling images..." + docker image prune -f + + # Simpan state secara atomik (tmp + mv untuk cegah korupsi file) + echo "$CURRENT_HASH" > "$STATE_FILE.tmp" && mv "$STATE_FILE.tmp" "$STATE_FILE" + + echo "=========================================" + echo " Update & Deployment complete! " + echo " Dashboard : http://localhost:${WEB_PORT:-80}" + echo " API Port : ${API_PORT:-8080}" + echo "=========================================" +else + echo "=========================================" + echo " No update needed — system is current. " + echo "=========================================" +fi \ No newline at end of file