简化生产一键部署脚本

This commit is contained in:
wkc
2026-04-01 10:53:00 +08:00
parent 3a8f37f547
commit 9b35d04e50
3 changed files with 53 additions and 162 deletions

View File

@@ -56,23 +56,6 @@ require_command() {
fi
}
require_port_command() {
if command -v ss >/dev/null 2>&1; then
return 0
fi
if command -v lsof >/dev/null 2>&1; then
return 0
fi
if command -v netstat >/dev/null 2>&1; then
return 0
fi
log_error "缺少端口检测命令: ss、lsof 或 netstat"
exit 1
}
find_release_archive() {
archives=$(find "$SCRIPT_DIR" -maxdepth 1 -type f -name '*.zip' ! -name 'dist.zip')
count=$(printf '%s\n' "$archives" | sed '/^$/d' | wc -l | tr -d ' ')
@@ -134,106 +117,23 @@ deploy_backend_jar() {
mv "$source_jar" "$BACKEND_JAR_TARGET"
}
deploy_frontend_archive() {
deploy_frontend_dist() {
source_dist_zip="$1"
rm -f "$FRONTEND_DIST_ARCHIVE"
rm -rf "$FRONTEND_DIST_DIR"
mv "$source_dist_zip" "$FRONTEND_DIST_ARCHIVE"
}
unzip -oq "$FRONTEND_DIST_ARCHIVE" -d "$FRONTEND_DIR"
resolve_frontend_source_dir() {
unzip_dir="$1"
if [ -f "$unzip_dir/index.html" ]; then
printf '%s\n' "$unzip_dir"
return 0
fi
if [ -f "$unzip_dir/dist/index.html" ]; then
printf '%s\n' "$unzip_dir/dist"
return 0
fi
candidate=$(find "$unzip_dir" -type f -name 'index.html' | head -n 1)
if [ -z "${candidate:-}" ]; then
log_error "dist.zip 解压后未找到 index.html"
if [ ! -d "$FRONTEND_DIST_DIR" ]; then
log_error "dist.zip 解压后未找到 $FRONTEND_DIST_DIR"
exit 1
fi
dirname "$candidate"
}
deploy_frontend_dist() {
dist_unpack_dir="$WORK_DIR/frontend"
mkdir -p "$dist_unpack_dir"
unzip -oq "$FRONTEND_DIST_ARCHIVE" -d "$dist_unpack_dir"
rm -rf "$FRONTEND_DIST_DIR"
mkdir -p "$FRONTEND_DIST_DIR"
cp -a "$(resolve_frontend_source_dir "$dist_unpack_dir")"/. "$FRONTEND_DIST_DIR"/
}
is_port_listening() {
port="$1"
if command -v ss >/dev/null 2>&1; then
ss -lnt 2>/dev/null | grep -q ":$port "
return $?
fi
if command -v lsof >/dev/null 2>&1; then
lsof -nP -iTCP:"$port" -sTCP:LISTEN >/dev/null 2>&1
return $?
fi
netstat -an 2>/dev/null | grep -E "[\\.:]$port[[:space:]].*LISTEN" >/dev/null 2>&1
}
is_managed_backend_pid() {
pid="$1"
if [ -z "${pid:-}" ] || ! kill -0 "$pid" 2>/dev/null; then
return 1
fi
process_line=$(ps -ef | awk -v target_pid="$pid" '$2 == target_pid {print $0}')
if [ -z "${process_line:-}" ]; then
return 1
fi
case "$process_line" in
*"$BACKEND_MARKER"*"$BACKEND_JAR_TARGET"*|*"$BACKEND_JAR_TARGET"*"$BACKEND_MARKER"*)
return 0
;;
esac
return 1
}
collect_backend_pids() {
pids=""
if [ -f "$BACKEND_PID_FILE" ]; then
file_pid=$(cat "$BACKEND_PID_FILE" 2>/dev/null || true)
if [ -n "${file_pid:-}" ] && is_managed_backend_pid "$file_pid"; then
pids="$pids $file_pid"
fi
fi
marker_pids=$(
ps -ef | awk -v marker="$BACKEND_MARKER" -v jar="$BACKEND_JAR_TARGET" '
index($0, marker) > 0 && index($0, jar) > 0 {print $2}
'
)
if [ -n "${marker_pids:-}" ]; then
for pid in $marker_pids; do
if is_managed_backend_pid "$pid"; then
pids="$pids $pid"
fi
done
fi
printf '%s\n' "$(echo "$pids" | xargs 2>/dev/null || true)"
ps -ef | awk -v marker="$BACKEND_MARKER" -v jar="$BACKEND_JAR_TARGET" '
index($0, marker) > 0 && index($0, jar) > 0 {print $2}
' | xargs 2>/dev/null || true
}
stop_backend() {
@@ -310,19 +210,7 @@ start_backend() {
exit 1
fi
wait_seconds=0
while [ "$wait_seconds" -lt 30 ]; do
if is_port_listening "$BACKEND_PORT"; then
log_info "后端已监听端口: $BACKEND_PORT"
return 0
fi
sleep 1
wait_seconds=$((wait_seconds + 1))
done
log_error "后端未在预期时间内监听端口 $BACKEND_PORT"
exit 1
log_info "后端已启动PID: $backend_pid"
}
main() {
@@ -337,7 +225,6 @@ main() {
require_command find
require_command ps
require_command nohup
require_port_command
release_archive=$(find_release_archive)
WORK_DIR=$(mktemp -d "${TMPDIR:-/tmp}/deploy_from_package.XXXXXX")
@@ -352,8 +239,7 @@ main() {
backup_frontend_dist
stop_backend
deploy_backend_jar "$backend_jar_source"
deploy_frontend_archive "$frontend_dist_source"
deploy_frontend_dist
deploy_frontend_dist "$frontend_dist_source"
start_backend
log_info "部署完成"