From 351fae8cd3248c4cc500cebc4abd9b0b6e21d022 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Wed, 1 Apr 2026 11:08:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B6=E7=B4=A7=E9=83=A8=E7=BD=B2=E8=84=9A?= =?UTF-8?q?=E6=9C=ACjar=E8=BF=9B=E7=A8=8B=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/prod/deploy_from_package.sh | 9 ++++- bin/prod/deploy_from_package_test.sh | 33 +++++++++++++++++++ ...production-one-click-deploy-current-jar.md | 30 +++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 doc/implementation-report-2026-04-01-production-one-click-deploy-current-jar.md diff --git a/bin/prod/deploy_from_package.sh b/bin/prod/deploy_from_package.sh index 3d8e1c3..61dcf19 100755 --- a/bin/prod/deploy_from_package.sh +++ b/bin/prod/deploy_from_package.sh @@ -132,7 +132,14 @@ deploy_frontend_dist() { collect_backend_pids() { ps -ef | awk -v marker="$BACKEND_MARKER" -v jar="$BACKEND_JAR_TARGET" ' - index($0, "") == 0 && index($0, marker) > 0 && index($0, jar) > 0 {print $2} + index($0, "") == 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 } diff --git a/bin/prod/deploy_from_package_test.sh b/bin/prod/deploy_from_package_test.sh index 064de09..e86ad09 100755 --- a/bin/prod/deploy_from_package_test.sh +++ b/bin/prod/deploy_from_package_test.sh @@ -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" </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' } diff --git a/doc/implementation-report-2026-04-01-production-one-click-deploy-current-jar.md b/doc/implementation-report-2026-04-01-production-one-click-deploy-current-jar.md new file mode 100644 index 0000000..f61bf3d --- /dev/null +++ b/doc/implementation-report-2026-04-01-production-one-click-deploy-current-jar.md @@ -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` 等非正式后端包不会再误判 + - 正常部署链路仍然通过