build-web.sh 996 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #!/usr/bin/env bash
  2. set -Eeuo pipefail
  3. APP_ROOT="/opt/cloudpure-web"
  4. SOURCE_DIR="$APP_ROOT/source"
  5. RELEASES_DIR="$APP_ROOT/releases"
  6. CURRENT_LINK="/opt/web/dist"
  7. LOCK_FILE="$APP_ROOT/build.lock"
  8. REASON="${1:-manual}"
  9. export CHROME_PATH="${CHROME_PATH:-/snap/bin/chromium}"
  10. mkdir -p "$RELEASES_DIR"
  11. exec 9>"$LOCK_FILE"
  12. if ! flock -n 9; then
  13. echo "build already running; skip reason=$REASON"
  14. exit 0
  15. fi
  16. BUILD_ID="$(date +%Y%m%d%H%M%S)"
  17. BUILD_DIR="$RELEASES_DIR/$BUILD_ID"
  18. LOG_FILE="$APP_ROOT/build-$BUILD_ID.log"
  19. {
  20. echo "build started: id=$BUILD_ID reason=$REASON"
  21. cd "$SOURCE_DIR"
  22. npm ci --no-audit --no-fund
  23. npm run build
  24. test -f dist/sitemap.xml
  25. test -f dist/news/index.html
  26. mv dist "$BUILD_DIR"
  27. ln -sfn "$BUILD_DIR" "$CURRENT_LINK"
  28. nginx -t
  29. systemctl reload nginx
  30. find "$RELEASES_DIR" -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' \
  31. | sort -nr | tail -n +4 | cut -d' ' -f2- | xargs -r rm -rf
  32. echo "build completed: id=$BUILD_ID"
  33. } 2>&1 | tee "$LOG_FILE"