| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- #!/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 "========================================="
|