收紧部署脚本jar进程识别

This commit is contained in:
wkc
2026-04-01 11:08:32 +08:00
parent 54eabaebd8
commit 351fae8cd3
3 changed files with 71 additions and 1 deletions

View File

@@ -132,7 +132,14 @@ deploy_frontend_dist() {
collect_backend_pids() {
ps -ef | awk -v marker="$BACKEND_MARKER" -v jar="$BACKEND_JAR_TARGET" '
index($0, "<defunct>") == 0 && index($0, marker) > 0 && index($0, jar) > 0 {print $2}
index($0, "<defunct>") == 0 && index($0, marker) > 0 {
for (i = 1; i < NF; i++) {
if ($i == "-jar" && $(i + 1) == jar) {
print $2
break
}
}
}
' | xargs 2>/dev/null || true
}

View File

@@ -203,6 +203,38 @@ EOF
cleanup_release_dir "$release_dir"
}
test_only_current_project_jar_should_match() {
release_dir=$(mktemp -d)
backend_port=$(find_free_port)
trap 'cleanup_release_dir "$release_dir"' EXIT INT TERM
prepare_release_dir "$release_dir" "$backend_port"
mkdir -p "$release_dir/fake-ps-bin"
cat > "$release_dir/fake-ps-bin/ps" <<EOF
#!/bin/sh
if [ "\$1" = "-ef" ]; then
cat <<'PSOUT'
UID PID PPID C STIME TTY TIME CMD
root 88888 1 0 00:00 ? 00:00:00 java -Dloan.pricing.home=$release_dir -jar $release_dir/backend/ruoyi-admin.jar.bak --spring.profiles.active=pro
PSOUT
exit 0
fi
/bin/ps "\$@"
EOF
chmod +x "$release_dir/fake-ps-bin/ps"
(
cd "$release_dir"
PATH="$release_dir/fake-ps-bin:/usr/bin:/bin" ./deploy_from_package.sh
)
backend_pid=$(cat "$release_dir/backend/backend.pid")
kill -0 "$backend_pid" 2>/dev/null || fail "expected backend pid to be running when non-target jar process is ignored"
trap - EXIT INT TERM
cleanup_release_dir "$release_dir"
}
test_should_use_ps_ef_for_process_detection() {
if rg -n 'pgrep' "$SCRIPT_UNDER_TEST" >/dev/null 2>&1; then
fail "expected deploy_from_package.sh not to depend on pgrep"
@@ -223,6 +255,7 @@ main() {
test_deploy_success
test_multiple_release_zip_should_fail
test_defunct_process_should_be_ignored
test_only_current_project_jar_should_match
printf 'PASS: deploy_from_package tests\n'
}

View File

@@ -0,0 +1,30 @@
# 生产一键部署脚本仅识别当前项目 jar 实施记录
## 问题现象
- 进程检测需要确认运行中的 `jar` 包必须是当前项目的正式后端包
## 根因分析
- 之前 `collect_backend_pids()` 使用 `ps -ef` 时,只做了“命令行包含当前项目 jar 路径”的判断
- 这种包含匹配会把以下情况误算为当前项目运行进程:
- `-jar /当前项目/backend/ruoyi-admin.jar.bak`
- 其他仅把正式 jar 路径作为前缀的命令参数
- 结果会导致脚本误报“检测到后端已在运行,请先停止旧进程”
## 修改内容
- 更新 `bin/prod/deploy_from_package.sh`
- `collect_backend_pids()` 继续使用 `ps -ef`
- 但匹配规则改为:
- 命令行中必须存在 `-jar`
-`-jar` 的下一个参数必须严格等于当前项目的 `backend/ruoyi-admin.jar`
- 同时仍要求包含当前脚本的 `-Dloan.pricing.home=<脚本目录>` 标记
- 更新 `bin/prod/deploy_from_package_test.sh`
- 新增自测场景:
-`ps -ef` 中存在 `-jar .../ruoyi-admin.jar.bak`,脚本必须忽略该进程并继续正常部署
## 验证结果
- 已执行 `sh -n bin/prod/deploy_from_package.sh`
- 已执行 `sh bin/prod/deploy_from_package_test.sh`
- 自测结果确认:
- 只有当前项目正式 `backend/ruoyi-admin.jar` 才会被识别为运行中的后端进程
- `.jar.bak` 等非正式后端包不会再误判
- 正常部署链路仍然通过