Files
gangyan/scripts/backend-pack.sh

136 lines
6.3 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# 须用 bash 执行
[ -n "${BASH_VERSION:-}" ] || exec /usr/bin/env bash "$0" ${1+"$@"}
# 在 chat_web_backend 执行 mvn package将产物复制为 backend/chat_web_yj.jar与 backend-restart.sh 一致)
# 日志gangyan/logs/backend-pack.log
set -euo pipefail
source "$(cd "$(dirname "$0")" && pwd)/common-restart.sh"
LOG_FILE="$LOG_DIR/backend-pack.log"
if ! ( umask 022; : >>"$LOG_FILE" ) 2>/dev/null; then
mkdir -p "${HOME}/.gangyan/logs"
LOG_FILE="${HOME}/.gangyan/logs/backend-pack.log"
fi
export JAVA_HOME="${JAVA_HOME:-/usr/lib/jvm/java-11-openjdk-amd64}"
export PATH="$JAVA_HOME/bin:$PATH"
BACKEND_SRC="$GANGYAN_ROOT/chat_web_backend"
JAR_BUILD="$BACKEND_SRC/target/chat_web_backend.jar"
JAR_RUN="$GANGYAN_ROOT/backend/chat_web_yj.jar"
log_tee() {
log_line "$@" | tee -a "$LOG_FILE"
}
log_tee "======== 编译打包 Java 后端 ========"
log_tee "JAVA_HOME=$JAVA_HOME"
if ! command -v mvn >/dev/null 2>&1; then
log_tee "错误: 未找到 mvn请先安装 Maven 并加入 PATH"
exit 1
fi
if [ ! -f "$BACKEND_SRC/pom.xml" ]; then
log_tee "错误: 未找到 $BACKEND_SRC/pom.xml"
exit 1
fi
mkdir -p "$GANGYAN_ROOT/backend"
cd "$BACKEND_SRC"
# 目标目录若被 root 生成会导致普通用户无法写入常见表现Error while storing the mojo status
# 这里提前检测并给出可执行修复命令。
if [ -d "$BACKEND_SRC/target" ] && [ ! -w "$BACKEND_SRC/target" ]; then
log_tee "错误: $BACKEND_SRC/target 不可写(可能之前用 root 打过包)。"
log_tee "请执行其一后重试:"
log_tee " 1) sudo chown -R $(id -un):$(id -gn) \"$BACKEND_SRC/target\""
log_tee " 2) sudo rm -rf \"$BACKEND_SRC/target\""
exit 1
fi
# Maven 自身 JVM内存过小会频繁 GC可用 export MAVEN_OPTS='...' 覆盖
export MAVEN_OPTS="${MAVEN_OPTS:--Xmx1536m -XX:+TieredCompilation -XX:TieredStopAtLevel=1}"
# 依赖已缓存在 ~/.m2 时: export MAVEN_OFFLINE=1不访问远程仓库失败则去掉再跑
MVN_OFFLINE=()
if [ "${MAVEN_OFFLINE:-}" = "1" ]; then
MVN_OFFLINE=(-o)
log_tee "MAVEN_OFFLINE=1使用 mvn -o缓存不全会失败去掉环境变量再跑一次"
fi
# -------- 远程仓库预检:中央仓库/镜像太慢或不可达则直接退出,避免 mvn 长时间卡在 Downloading --------
# 跳过预检: export SKIP_MAVEN_NETCHECK=1
# 测速地址(默认与 pom 首选源一致:华为云): export MAVEN_NETCHECK_URL='https://mirrors.tencent.com/nexus/...'
# 总耗时超过即视为过慢(秒): export MAVEN_NETCHECK_MAX_SEC=15
if [ "${MAVEN_OFFLINE:-}" != "1" ] && [ "${SKIP_MAVEN_NETCHECK:-}" != "1" ]; then
if command -v curl >/dev/null 2>&1; then
NET_URL="${MAVEN_NETCHECK_URL:-https://repo.huaweicloud.com/repository/maven/org/apache/maven/apache-maven/maven-metadata.xml}"
# 判定「过慢」的耗时上限curl 单次请求上限单独设大些,便于测出真实耗时
MAX_SEC="${MAVEN_NETCHECK_MAX_SEC:-15}"
CURL_MAX="${MAVEN_NETCHECK_CURL_MAX_SEC:-60}"
log_tee "Maven 仓库预检(样本下载总耗时 > ${MAX_SEC}s 则中止curl 上限 ${CURL_MAX}s: $NET_URL"
# shellcheck disable=SC2086
OUT=$(curl -sS -o /dev/null -w '%{http_code} %{time_total} %{speed_download} %{size_download}' \
--connect-timeout 10 --max-time "$CURL_MAX" "$NET_URL" 2>/dev/null) || OUT="000 999 0 0"
read -r CODE T_SEC SPD SZ <<< "$OUT"
CODE=${CODE:-000}
T_SEC=${T_SEC:-999}
SPD=${SPD:-0}
SZ=${SZ:-0}
if [ "$CODE" != "200" ]; then
log_tee "预检失败HTTP $CODE,无法稳定访问该仓库。"
log_tee "可选:① 配置 ~/.m2/settings.xml 镜像后设 MAVEN_NETCHECK_URL 指向镜像测速;② 依赖已在 ~/.m2 时 export MAVEN_OFFLINE=1 再打包;③ 仍要尝试 export SKIP_MAVEN_NETCHECK=1"
exit 1
fi
# 小文件平均速度易受握手影响,以「总耗时」为主;大文件再参考速度
if awk -v t="$T_SEC" -v m="$MAX_SEC" 'BEGIN { exit !(t + 0 > m + 0) }'; then
log_tee "预检失败:下载耗时 ${T_SEC}s超过 ${MAX_SEC}s当前渠道过慢"
log_tee "可选:① 换网络或配置国内镜像;② export MAVEN_OFFLINE=1仅用本地缓存③ export SKIP_MAVEN_NETCHECK=1 强制继续"
exit 1
fi
if awk -v sz="$SZ" -v spd="$SPD" 'BEGIN { exit !((sz + 0 > 8000) && (spd + 0 < 15000)) }'; then
log_tee "预检失败:约 ${SZ}B 的样本下载平均仅 ${SPD} B/s持续过慢。"
log_tee "可选配置镜像、MAVEN_OFFLINE=1 或 SKIP_MAVEN_NETCHECK=1同上"
exit 1
fi
log_tee "预检通过HTTP $CODE,耗时 ${T_SEC}s样本 ${SZ}B。"
else
log_tee "未找到 curl跳过仓库预检建议安装 curl或设置 SKIP_MAVEN_NETCHECK=1"
fi
elif [ "${MAVEN_OFFLINE:-}" = "1" ]; then
log_tee "已 MAVEN_OFFLINE=1跳过仓库网速预检。"
elif [ "${SKIP_MAVEN_NETCHECK:-}" = "1" ]; then
log_tee "已 SKIP_MAVEN_NETCHECK=1跳过仓库网速预检。"
fi
# 默认跳过测试源码编译与执行(比仅 -DskipTests 更快)。要编译测试: export MAVEN_SKIP_TEST_COMPILE=0
if [ "${MAVEN_SKIP_TEST_COMPILE:-1}" = "1" ]; then
TEST_SKIP=(-Dmaven.test.skip=true)
log_tee "MAVEN_SKIP_TEST_COMPILE=1使用 -Dmaven.test.skip=true不编译 test 源码)"
else
TEST_SKIP=(-DskipTests)
log_tee "MAVEN_SKIP_TEST_COMPILE=0仅 -DskipTests仍编译 test 源码)"
fi
# -T 1C多核并行构建单模块也有少量收益
# 无 javadoc/source 插件时跳过属性无害
# 依赖解析缓存“找不到”时可强制刷新export MAVEN_FORCE_UPDATE=1等价 mvn -U
MVN_UPDATE=()
if [ "${MAVEN_FORCE_UPDATE:-0}" = "1" ]; then
MVN_UPDATE=(-U)
log_tee "MAVEN_FORCE_UPDATE=1使用 mvn -U强制刷新依赖解析缓存"
fi
log_tee "执行: mvn ${MVN_OFFLINE[*]} ${MVN_UPDATE[*]} -T 1C ${TEST_SKIP[*]} -Dmaven.javadoc.skip=true -Dmaven.source.skip=true package"
set -o pipefail
mvn "${MVN_OFFLINE[@]}" "${MVN_UPDATE[@]}" -T 1C "${TEST_SKIP[@]}" -Dmaven.javadoc.skip=true -Dmaven.source.skip=true package 2>&1 | tee -a "$LOG_FILE"
if [ ! -f "$JAR_BUILD" ]; then
log_tee "错误: 未生成 $JAR_BUILD"
exit 1
fi
cp -f "$JAR_BUILD" "$JAR_RUN"
log_tee "已复制: $JAR_BUILD -> $JAR_RUN"
ls -lh "$JAR_RUN" | tee -a "$LOG_FILE"
log_tee "完成。需要重启进程请执行: ./backend-restart.sh"