|
@@ -15,6 +15,14 @@ LOG_DIR="/data/logs"
|
|
|
HISTORY_FILE="/data/history"
|
|
HISTORY_FILE="/data/history"
|
|
|
CERT_DIR="/data/pem"
|
|
CERT_DIR="/data/pem"
|
|
|
|
|
|
|
|
|
|
+# 构建工具路径(对齐 Jenkins 环境)
|
|
|
|
|
+NPM="${NPM:-/usr/local/bin/npm}"
|
|
|
|
|
+MVN="${MVN:-/usr/local/apache-maven-3.9.6/bin/mvn}"
|
|
|
|
|
+
|
|
|
|
|
+# 将 npm 全局 bin 加入 PATH(确保 uni 等全局包可被找到)
|
|
|
|
|
+NPM_PREFIX=$($NPM config get prefix 2>/dev/null || echo "/usr/local")
|
|
|
|
|
+export PATH="$NPM_PREFIX/bin:$PATH"
|
|
|
|
|
+
|
|
|
RED='\033[0;31m'
|
|
RED='\033[0;31m'
|
|
|
GREEN='\033[0;32m'
|
|
GREEN='\033[0;32m'
|
|
|
YELLOW='\033[1;33m'
|
|
YELLOW='\033[1;33m'
|
|
@@ -66,7 +74,7 @@ for arg in "$@"; do
|
|
|
done
|
|
done
|
|
|
|
|
|
|
|
info "开始部署 充电项目 (目标=$TARGET, 零停机=$NO_STOP)"
|
|
info "开始部署 充电项目 (目标=$TARGET, 零停机=$NO_STOP)"
|
|
|
-info "Node:${NODE_MAX_MEM}M | Maven:${MAVEN_XMX}M | Admin-JVM:${ADMIN_XMX}M | Miniapp-JVM:${MINIAPP_XMX}M"
|
|
|
|
|
|
|
+info "Maven:$MVN | NPM:$NPM | Node:${NODE_MAX_MEM}M | Admin-JVM:${ADMIN_XMX}M | Miniapp-JVM:${MINIAPP_XMX}M"
|
|
|
|
|
|
|
|
# ---- 拉取代码 ----
|
|
# ---- 拉取代码 ----
|
|
|
info "拉取最新代码..."
|
|
info "拉取最新代码..."
|
|
@@ -116,55 +124,72 @@ if [ "$NO_STOP" = false ]; then
|
|
|
fi
|
|
fi
|
|
|
|
|
|
|
|
# ============================================================
|
|
# ============================================================
|
|
|
-# 阶段 2: 构建
|
|
|
|
|
|
|
+# 阶段 2: 安装公共模块到本地仓库 (对齐 Jenkins mvn install 流程)
|
|
|
|
|
+# ============================================================
|
|
|
|
|
+info "安装公共模块到本地仓库..."
|
|
|
|
|
+(
|
|
|
|
|
+ cd "$CODE_DIR"
|
|
|
|
|
+ low_prio $MVN install -DskipTests -Dmaven.test.skip=true
|
|
|
|
|
+) || { error "Maven install 失败"; exit 1; }
|
|
|
|
|
+
|
|
|
|
|
+# ============================================================
|
|
|
|
|
+# 阶段 3: 前端构建
|
|
|
# ============================================================
|
|
# ============================================================
|
|
|
|
|
|
|
|
if [ "$SKIP_FRONTEND" = false ] && [ "$TARGET" != "miniapp" ]; then
|
|
if [ "$SKIP_FRONTEND" = false ] && [ "$TARGET" != "miniapp" ]; then
|
|
|
- # 管理后台前端
|
|
|
|
|
|
|
+ # ---- 管理后台前端 (admin-web) ----
|
|
|
info "构建前端 admin-web ..."
|
|
info "构建前端 admin-web ..."
|
|
|
|
|
+
|
|
|
|
|
+ # 清理旧前端产物,避免残留文件打入 jar
|
|
|
|
|
+ rm -rf "$CODE_DIR/admin/src/main/resources/static/"
|
|
|
|
|
+ mkdir -p "$CODE_DIR/admin/src/main/resources/static/"
|
|
|
|
|
+
|
|
|
(
|
|
(
|
|
|
cd "$CODE_DIR/admin-web" || exit 1
|
|
cd "$CODE_DIR/admin-web" || exit 1
|
|
|
export NODE_OPTIONS="--max-old-space-size=$NODE_MAX_MEM"
|
|
export NODE_OPTIONS="--max-old-space-size=$NODE_MAX_MEM"
|
|
|
- low_prio npm run build
|
|
|
|
|
|
|
+ $NPM install
|
|
|
|
|
+ low_prio $NPM run build
|
|
|
) || { error "admin-web 构建失败"; exit 1; }
|
|
) || { error "admin-web 构建失败"; exit 1; }
|
|
|
info "admin-web 构建完成"
|
|
info "admin-web 构建完成"
|
|
|
|
|
|
|
|
- # 小程序前端 (H5 端)
|
|
|
|
|
|
|
+ # ---- 小程序前端 (charge-front, uni-app) ----
|
|
|
info "构建前端 charge-front ..."
|
|
info "构建前端 charge-front ..."
|
|
|
(
|
|
(
|
|
|
# uni-app CLI 依赖,首次部署需全局安装
|
|
# uni-app CLI 依赖,首次部署需全局安装
|
|
|
if ! command -v uni >/dev/null 2>&1; then
|
|
if ! command -v uni >/dev/null 2>&1; then
|
|
|
info "安装 @dcloudio/uvm ..."
|
|
info "安装 @dcloudio/uvm ..."
|
|
|
- npm install -g @dcloudio/uvm
|
|
|
|
|
|
|
+ $NPM install -g @dcloudio/uvm
|
|
|
fi
|
|
fi
|
|
|
cd "$CODE_DIR/charge-front" || exit 1
|
|
cd "$CODE_DIR/charge-front" || exit 1
|
|
|
export NODE_OPTIONS="--max-old-space-size=$NODE_MAX_MEM"
|
|
export NODE_OPTIONS="--max-old-space-size=$NODE_MAX_MEM"
|
|
|
- low_prio npm run build
|
|
|
|
|
|
|
+ $NPM install
|
|
|
|
|
+ low_prio $NPM run build
|
|
|
) || { error "charge-front 构建失败"; exit 1; }
|
|
) || { error "charge-front 构建失败"; exit 1; }
|
|
|
info "charge-front 构建完成"
|
|
info "charge-front 构建完成"
|
|
|
fi
|
|
fi
|
|
|
|
|
|
|
|
|
|
+# ============================================================
|
|
|
|
|
+# 阶段 4: Maven 打包
|
|
|
|
|
+# ============================================================
|
|
|
export MAVEN_OPTS="-Xmx${MAVEN_XMX}m -Xms${MAVEN_XMS}m -XX:+UseG1GC"
|
|
export MAVEN_OPTS="-Xmx${MAVEN_XMX}m -Xms${MAVEN_XMS}m -XX:+UseG1GC"
|
|
|
|
|
|
|
|
if [ "$TARGET" = "miniapp" ]; then
|
|
if [ "$TARGET" = "miniapp" ]; then
|
|
|
info "Maven 打包 (仅 miniapp)..."
|
|
info "Maven 打包 (仅 miniapp)..."
|
|
|
(
|
|
(
|
|
|
- cd "$CODE_DIR"
|
|
|
|
|
- low_prio mvn clean package -DskipTests -pl miniapp -am \
|
|
|
|
|
- -T "${MAVEN_THREADS}" -Dmaven.test.skip=true
|
|
|
|
|
|
|
+ cd "$CODE_DIR/miniapp"
|
|
|
|
|
+ low_prio $MVN clean package -DskipTests -Dmaven.test.skip=true
|
|
|
) || { error "Maven 打包失败"; exit 1; }
|
|
) || { error "Maven 打包失败"; exit 1; }
|
|
|
elif [ "$TARGET" = "admin" ]; then
|
|
elif [ "$TARGET" = "admin" ]; then
|
|
|
info "Maven 打包 (仅 admin)..."
|
|
info "Maven 打包 (仅 admin)..."
|
|
|
(
|
|
(
|
|
|
- cd "$CODE_DIR"
|
|
|
|
|
- low_prio mvn clean package -DskipTests -pl admin -am \
|
|
|
|
|
- -T "${MAVEN_THREADS}" -Dmaven.test.skip=true
|
|
|
|
|
|
|
+ cd "$CODE_DIR/admin"
|
|
|
|
|
+ low_prio $MVN clean package -DskipTests -Dmaven.test.skip=true
|
|
|
) || { error "Maven 打包失败"; exit 1; }
|
|
) || { error "Maven 打包失败"; exit 1; }
|
|
|
else
|
|
else
|
|
|
info "Maven 打包 (全量, 线程=${MAVEN_THREADS})..."
|
|
info "Maven 打包 (全量, 线程=${MAVEN_THREADS})..."
|
|
|
(
|
|
(
|
|
|
cd "$CODE_DIR"
|
|
cd "$CODE_DIR"
|
|
|
- low_prio mvn clean package -DskipTests \
|
|
|
|
|
|
|
+ low_prio $MVN clean package -DskipTests \
|
|
|
-T "${MAVEN_THREADS}" \
|
|
-T "${MAVEN_THREADS}" \
|
|
|
-Dmaven.test.skip=true \
|
|
-Dmaven.test.skip=true \
|
|
|
-Dmaven.compiler.fork=false
|
|
-Dmaven.compiler.fork=false
|
|
@@ -174,7 +199,7 @@ fi
|
|
|
sleep 2
|
|
sleep 2
|
|
|
|
|
|
|
|
# ============================================================
|
|
# ============================================================
|
|
|
-# 阶段 3: 备份 & 部署 & 启动
|
|
|
|
|
|
|
+# 阶段 5: 备份 & 部署 & 启动
|
|
|
# ============================================================
|
|
# ============================================================
|
|
|
|
|
|
|
|
backup_and_copy() {
|
|
backup_and_copy() {
|