pack.sh 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #!/bin/bash
  2. # ============================================================
  3. # ZoneAlarm 打包脚本 (在开发机上执行)
  4. # 产物: deploy/zone_alarm_v<版本号>_<日期>.tar.gz
  5. # 目标机解压后: sudo bash install.sh
  6. # ============================================================
  7. set -e
  8. cd "$(dirname "$0")/.."
  9. # --- 版本号管理 ---
  10. # 从 CMakeLists.txt 读取版本号
  11. VERSION=$(grep -E "project\(zone_alarm VERSION" CMakeLists.txt | sed -n 's/.*VERSION \([0-9.]*\).*/\1/p')
  12. if [ -z "$VERSION" ]; then
  13. VERSION="0.0.1"
  14. echo "[WARN] 未找到版本号, 使用默认: $VERSION"
  15. fi
  16. TIMESTAMP=$(date +%Y%m%d_%H%M)
  17. PKG_NAME="zone_alarm_v${VERSION}_${TIMESTAMP}"
  18. echo "[INFO] 版本: $VERSION, 包名: $PKG_NAME"
  19. # --- 编译 ---
  20. echo "== 编译 Release =="
  21. ./build.sh
  22. # --- 收集文件 ---
  23. STAGE="deploy/pkg/$PKG_NAME"
  24. echo "== 收集文件 =="
  25. rm -rf deploy/pkg
  26. mkdir -p "$STAGE/lib" "$STAGE/config" "$STAGE/models" "$STAGE/web"
  27. cp build/zone_alarm "$STAGE/"
  28. cp web/index.html web/login.html "$STAGE/web/"
  29. cp logo.png logo.ico "$STAGE/"
  30. cp models/*.rknn "$STAGE/models/" 2>/dev/null || echo "[WARN] models目录无rknn模型"
  31. cp config/config.json "$STAGE/config/config.example.json"
  32. cp deploy/install.sh deploy/run.sh deploy/zone_alarm.service "$STAGE/"
  33. # --- 版本信息文件 ---
  34. cat > "$STAGE/VERSION.txt" << EOF
  35. ZoneAlarm $VERSION
  36. Build: $TIMESTAMP
  37. Date: $(date '+%Y-%m-%d %H:%M:%S')
  38. EOF
  39. # --- 变更日志生成 ---
  40. echo "== 生成变更日志 =="
  41. CHANGELOG="$STAGE/CHANGELOG.md"
  42. cat > "$CHANGELOG" << EOF
  43. # ZoneAlarm $VERSION
  44. **构建时间:** $(date '+%Y-%m-%d %H:%M:%S')
  45. ## 更新内容
  46. EOF
  47. # 检查是否有 git,尝试生成 git log 变更
  48. if command -v git &>/dev/null && git rev-parse --is-inside-work-tree &>/dev/null; then
  49. # 获取上一个 tag 或最近 20 条 commit
  50. LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
  51. if [ -n "$LAST_TAG" ]; then
  52. echo "### 自 $LAST_TAG 以来的变更" >> "$CHANGELOG"
  53. git log "$LAST_TAG"..HEAD --pretty=format:"- %s (%h)" --no-merges 2>/dev/null >> "$CHANGELOG" || true
  54. else
  55. echo "### 最近变更" >> "$CHANGELOG"
  56. git log -20 --pretty=format:"- %s (%h)" --no-merges 2>/dev/null >> "$CHANGELOG" || true
  57. fi
  58. echo "" >> "$CHANGELOG"
  59. else
  60. echo "- 首次打包发布" >> "$CHANGELOG"
  61. echo "" >> "$CHANGELOG"
  62. fi
  63. # 添加构建信息
  64. cat >> "$CHANGELOG" << EOF
  65. ## 构建信息
  66. - **版本:** $VERSION
  67. - **构建类型:** Release
  68. - **目标架构:** $(uname -m)
  69. - **构建时间:** $(date '+%Y-%m-%d %H:%M:%S')
  70. ## 部署说明
  71. 1. 拷贝到目标机: \`scp $PKG_NAME.tar.gz root@目标机:/tmp/\`
  72. 2. 解压: \`cd /tmp && tar xzf $PKG_NAME.tar.gz\`
  73. 3. 安装: \`cd $PKG_NAME && sudo bash install.sh\`
  74. 可选环境变量:
  75. - \`ZA_PORT=80\` - Web 端口
  76. - \`ZA_INSTALL_DIR=/opt/zone_alarm\` - 安装目录
  77. EOF
  78. # --- 收集运行库 ---
  79. echo "== 收集运行库 (ldd闭包, 排除glibc核心) =="
  80. ldd build/zone_alarm | awk '
  81. /=> \// {print $3}
  82. /^\// {print $1}
  83. ' | sort -u | while read -r lib; do
  84. case "$lib" in
  85. */ld-linux-*|*/libc.so.*|*/libm.so.*|*/libpthread*|*/libdl*|\
  86. */librt.so.*|*/libresolv.so.*) ;; # 目标机自带
  87. *) cp -L "$lib" "$STAGE/lib/" ;;
  88. esac
  89. done
  90. LIBN=$(ls "$STAGE/lib" | wc -l)
  91. LIBSZ=$(du -sh "$STAGE/lib" | cut -f1)
  92. echo " 已收集 $LIBN 个库 ($LIBSZ)"
  93. # --- 压缩 ---
  94. echo "== 压缩 =="
  95. OUT="deploy/${PKG_NAME}.tar.gz"
  96. tar czf "$OUT" -C deploy/pkg "$PKG_NAME"
  97. rm -rf deploy/pkg
  98. SIZE=$(du -sh "$OUT" | cut -f1)
  99. echo ""
  100. echo "========================================="
  101. echo " 打包完成: $OUT ($SIZE)"
  102. echo " 版本号: $VERSION"
  103. echo " 部署方法:"
  104. echo " 1. 拷贝到目标机: scp $OUT root@目标机:/tmp/"
  105. echo " 2. 解压: cd /tmp && tar xzf ${PKG_NAME}.tar.gz"
  106. echo " 3. 安装: cd $PKG_NAME && sudo bash install.sh"
  107. echo " (可选环境变量: ZA_PORT=80 ZA_INSTALL_DIR=/opt/zone_alarm)"
  108. echo "========================================="