#!/bin/bash # ============================================================ # 打包发布产物:opendance-web-v0.1.0.tar.gz # # 产物结构(文档 §4.4): # web-server/ NestJS 源码 + 构建产物 # admin/ React 管理端构建产物 # deploy/ docker-compose.yml / install.sh / .env.example # contracts/ 当前版本契约快照 # THIRD_PARTY.md 开源项目声明 # README.txt 使用说明 # # 用法:./scripts/package-release.sh [版本号] # ============================================================ set -euo pipefail REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$REPO_ROOT" VERSION="${1:-0.1.0}" NAME="opendance-web-v${VERSION}" OUT_DIR="$REPO_ROOT/dist-release" STAGE="$OUT_DIR/$NAME" log() { printf '\033[1;34m[package]\033[0m %s\n' "$*"; } die() { printf '\033[1;31m[error]\033[0m %s\n' "$*" >&2; exit 1; } # ---------- 1. 契约一致性 ---------- log "校验契约版本一致性..." ( cd web-server && node scripts/check-contracts.mjs ) # ---------- 2. 后端构建 ---------- log "构建后端..." ( cd web-server && npm run build ) # ---------- 3. 管理端构建 ---------- if [ -d web-server/admin/node_modules ]; then log "构建管理端..." ( cd web-server/admin && npm run build ) else log "警告:web-server/admin/node_modules 不存在,跳过管理端构建(产物将缺少 admin/)" fi # ---------- 4. 组织产物目录 ---------- log "整理产物目录 $STAGE ..." rm -rf "$STAGE" mkdir -p "$STAGE" # 后端源码 + 构建产物(排除依赖、测试、存储、密钥) rsync -a --delete \ --exclude 'node_modules' \ --exclude 'storage' \ --exclude 'data' \ --exclude '.env' \ --exclude '.env.local' \ --exclude 'admin' \ web-server/ "$STAGE/web-server/" # 管理端构建产物(文档要求 admin/ 与 web-server/ 平级) if [ -d web-server/admin/dist ]; then mkdir -p "$STAGE/admin" cp -r web-server/admin/dist/. "$STAGE/admin/" cp web-server/admin/nginx.conf "$STAGE/admin/" 2>/dev/null || true else log "警告:未找到 web-server/admin/dist,产物不含 admin/" fi cp -r deploy "$STAGE/deploy" rm -f "$STAGE/deploy/.env" cp -r contracts "$STAGE/contracts" cp THIRD_PARTY.md README.txt project.yaml DSH.md "$STAGE/" cp -r tasks "$STAGE/tasks" # ---------- 5. 打包 ---------- log "生成压缩包..." ( cd "$OUT_DIR" && tar -czf "$NAME.tar.gz" "$NAME" ) log "完成:$OUT_DIR/$NAME.tar.gz" echo echo "产物内容:" # 先把清单读入变量,避免 tar 因管道提前关闭(SIGPIPE)而误报 "write error" MANIFEST=$(tar -tzf "$OUT_DIR/$NAME.tar.gz") echo "$MANIFEST" | sed -n '1,20p' echo " ...(共 $(echo "$MANIFEST" | wc -l) 项,$(du -h "$OUT_DIR/$NAME.tar.gz" | cut -f1))" echo echo "部署方式:解压后进入 deploy/,复制 .env.example 为 .env 并填写数据库信息,执行 ./install.sh"