#!/usr/bin/env bash set -Eeuo pipefail APP_ROOT="/opt/cloudpure-web" SOURCE_DIR="$APP_ROOT/source" RELEASES_DIR="$APP_ROOT/releases" CURRENT_LINK="/opt/web/dist" LOCK_FILE="$APP_ROOT/build.lock" REASON="${1:-manual}" export CHROME_PATH="${CHROME_PATH:-/snap/bin/chromium}" mkdir -p "$RELEASES_DIR" exec 9>"$LOCK_FILE" if ! flock -n 9; then echo "build already running; skip reason=$REASON" exit 0 fi BUILD_ID="$(date +%Y%m%d%H%M%S)" BUILD_DIR="$RELEASES_DIR/$BUILD_ID" LOG_FILE="$APP_ROOT/build-$BUILD_ID.log" { echo "build started: id=$BUILD_ID reason=$REASON" cd "$SOURCE_DIR" npm ci --no-audit --no-fund npm run build test -f dist/sitemap.xml test -f dist/news/index.html mv dist "$BUILD_DIR" ln -sfn "$BUILD_DIR" "$CURRENT_LINK" nginx -t systemctl reload nginx find "$RELEASES_DIR" -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' \ | sort -nr | tail -n +4 | cut -d' ' -f2- | xargs -r rm -rf echo "build completed: id=$BUILD_ID" } 2>&1 | tee "$LOG_FILE"