Files
gangyan/scripts/backend-pack.sh

136 lines
6.3 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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