#!/bin/bash # ============================================================ # ZoneAlarm 打包脚本 (在开发机上执行) # 产物: deploy/zone_alarm_v<版本号>_<日期>.tar.gz # 目标机解压后: sudo bash install.sh # ============================================================ set -e cd "$(dirname "$0")/.." # --- 版本号管理 --- # 从 CMakeLists.txt 读取版本号 VERSION=$(grep -E "project\(zone_alarm VERSION" CMakeLists.txt | sed -n 's/.*VERSION \([0-9.]*\).*/\1/p') if [ -z "$VERSION" ]; then VERSION="0.0.1" echo "[WARN] 未找到版本号, 使用默认: $VERSION" fi TIMESTAMP=$(date +%Y%m%d_%H%M) PKG_NAME="zone_alarm_v${VERSION}_${TIMESTAMP}" echo "[INFO] 版本: $VERSION, 包名: $PKG_NAME" # --- 编译 --- echo "== 编译 Release ==" ./build.sh # --- 收集文件 --- STAGE="deploy/pkg/$PKG_NAME" echo "== 收集文件 ==" rm -rf deploy/pkg mkdir -p "$STAGE/lib" "$STAGE/config" "$STAGE/models" "$STAGE/web" cp build/zone_alarm "$STAGE/" cp web/index.html web/login.html "$STAGE/web/" cp logo.png logo.ico "$STAGE/" cp models/*.rknn "$STAGE/models/" 2>/dev/null || echo "[WARN] models目录无rknn模型" cp config/config.json "$STAGE/config/config.example.json" cp deploy/install.sh deploy/run.sh deploy/zone_alarm.service "$STAGE/" # --- 版本信息文件 --- cat > "$STAGE/VERSION.txt" << EOF ZoneAlarm $VERSION Build: $TIMESTAMP Date: $(date '+%Y-%m-%d %H:%M:%S') EOF # --- 变更日志生成 --- echo "== 生成变更日志 ==" CHANGELOG="$STAGE/CHANGELOG.md" cat > "$CHANGELOG" << EOF # ZoneAlarm $VERSION **构建时间:** $(date '+%Y-%m-%d %H:%M:%S') ## 更新内容 EOF # 检查是否有 git,尝试生成 git log 变更 if command -v git &>/dev/null && git rev-parse --is-inside-work-tree &>/dev/null; then # 获取上一个 tag 或最近 20 条 commit LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") if [ -n "$LAST_TAG" ]; then echo "### 自 $LAST_TAG 以来的变更" >> "$CHANGELOG" git log "$LAST_TAG"..HEAD --pretty=format:"- %s (%h)" --no-merges 2>/dev/null >> "$CHANGELOG" || true else echo "### 最近变更" >> "$CHANGELOG" git log -20 --pretty=format:"- %s (%h)" --no-merges 2>/dev/null >> "$CHANGELOG" || true fi echo "" >> "$CHANGELOG" else echo "- 首次打包发布" >> "$CHANGELOG" echo "" >> "$CHANGELOG" fi # 添加构建信息 cat >> "$CHANGELOG" << EOF ## 构建信息 - **版本:** $VERSION - **构建类型:** Release - **目标架构:** $(uname -m) - **构建时间:** $(date '+%Y-%m-%d %H:%M:%S') ## 部署说明 1. 拷贝到目标机: \`scp $PKG_NAME.tar.gz root@目标机:/tmp/\` 2. 解压: \`cd /tmp && tar xzf $PKG_NAME.tar.gz\` 3. 安装: \`cd $PKG_NAME && sudo bash install.sh\` 可选环境变量: - \`ZA_PORT=80\` - Web 端口 - \`ZA_INSTALL_DIR=/opt/zone_alarm\` - 安装目录 EOF # --- 收集运行库 --- echo "== 收集运行库 (ldd闭包, 排除glibc核心) ==" ldd build/zone_alarm | awk ' /=> \// {print $3} /^\// {print $1} ' | sort -u | while read -r lib; do case "$lib" in */ld-linux-*|*/libc.so.*|*/libm.so.*|*/libpthread*|*/libdl*|\ */librt.so.*|*/libresolv.so.*) ;; # 目标机自带 *) cp -L "$lib" "$STAGE/lib/" ;; esac done LIBN=$(ls "$STAGE/lib" | wc -l) LIBSZ=$(du -sh "$STAGE/lib" | cut -f1) echo " 已收集 $LIBN 个库 ($LIBSZ)" # --- 压缩 --- echo "== 压缩 ==" OUT="deploy/${PKG_NAME}.tar.gz" tar czf "$OUT" -C deploy/pkg "$PKG_NAME" rm -rf deploy/pkg SIZE=$(du -sh "$OUT" | cut -f1) echo "" echo "=========================================" echo " 打包完成: $OUT ($SIZE)" echo " 版本号: $VERSION" echo " 部署方法:" echo " 1. 拷贝到目标机: scp $OUT root@目标机:/tmp/" echo " 2. 解压: cd /tmp && tar xzf ${PKG_NAME}.tar.gz" echo " 3. 安装: cd $PKG_NAME && sudo bash install.sh" echo " (可选环境变量: ZA_PORT=80 ZA_INSTALL_DIR=/opt/zone_alarm)" echo "========================================="