From baa5613e837f854ca2cabbf3d19aab21aaa3900e Mon Sep 17 00:00:00 2001 From: dark Date: Tue, 19 May 2026 17:11:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=8E=A5=E5=8F=A3=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PAM智能部署 Agent Skill 文档.md.md | 25 ++++-- .../PAM智能部署 Shell & Bat 脚本实现.md.md | 43 +++++++---- doc_scripts/deploy.ps1 | 46 ++++++++--- doc_scripts/deploy.sh | 77 +++++++++++++++---- 4 files changed, 143 insertions(+), 48 deletions(-) diff --git a/doc_scripts/PAM智能部署 Agent Skill 文档.md.md b/doc_scripts/PAM智能部署 Agent Skill 文档.md.md index 8b5e91f..fecc62a 100644 --- a/doc_scripts/PAM智能部署 Agent Skill 文档.md.md +++ b/doc_scripts/PAM智能部署 Agent Skill 文档.md.md @@ -47,6 +47,7 @@ description: 基于 PAM HOME/NODE 流程执行软件发布、下载、升级、 7. 用户要求“只生成脚本”“先给我文件”“不要执行”时,不要触发真实部署。 8. Windows 脚本模式默认优先 `deploy.ps1`,不要默认使用 `deploy.bat`。 9. 当前目录如果只有文档而没有真实脚本文件,先根据参考实现落地脚本,再决定是否执行。 +10. `download-cloud` 只负责触发云下载任务;后续必须异步调用进度接口并持续展示状态/进度,直到成功、失败或超时。 ## 统一部署流程 @@ -59,14 +60,14 @@ description: 基于 PAM HOME/NODE 流程执行软件发布、下载、升级、 | 2.2 | 上传软件包 | `POST {HOME_BASE_URL}/api/version/upgrade/upload` | | 2.3 | 发布版本 | `PUT {HOME_BASE_URL}/api/version/upgrade/profile?...` | | 3.1 | 获取 Node 地址 | `GET {HOME_BASE_URL}/api/mcp/airport/target-node?airportCode={airportCode}` | -| 3.2 | 获取在线工作站 IP | `GET {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade/ips?...` | -| 3.3 | 下载软件包到 Node | `GET {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade/download-cloud?...` | -| 3.3b | 轮询下载进度 | `GET .../download-cloud/progress?...` | -| 4.1 | 对每个 IP 执行升级 | `POST {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade` | -| 4.2 | 启动应用 | `POST {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade/start-stop` | -| 4.3 | 健康检测 | `GET {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade/verify?...` | -| 4.4 | 下载日志 | `GET {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade/log-download?...` | -| 4.x | 失败回滚 | `POST {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade/rollback` | +| 3.2 | 获取在线工作站 IP | `GET {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/ips?...` | +| 3.3 | 下载软件包到 Node | `GET {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/download-cloud?...` | +| 3.3b | 异步轮询并展示下载进度 | `GET {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/download-cloud/progress?...&versionNumer={versionNumber}` | +| 4.1 | 对每个 IP 执行升级 | `POST {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade` | +| 4.2 | 启动应用 | `POST {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/start-stop` | +| 4.3 | 健康检测 | `GET {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/verify?...` | +| 4.4 | 下载日志 | `GET {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/log-download?...` | +| 4.x | 失败回滚 | `POST {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/rollback` | 调用 NODE 侧接口时,始终携带: @@ -74,6 +75,14 @@ description: 基于 PAM HOME/NODE 流程执行软件发布、下载、升级、 - `Target-Node: {NODE_URL}` - `airport-code: {airportCode}`,仅在下载到 NODE 等需要时携带 +`download-cloud/progress` 响应优先读取以下字段: + +- `msg` +- `step` +- `rateOfProgress` + +当 `msg=success`、`step=DONE`、`rateOfProgress=100` 时,判定云下载完成;其中 `rateOfProgress` 就是下载进度值,应持续展示。 + ## MCP 模式 1. 直接调用 PAM MCP 提供的能力完成上述流程,不生成本地脚本文件。 diff --git a/doc_scripts/PAM智能部署 Shell & Bat 脚本实现.md.md b/doc_scripts/PAM智能部署 Shell & Bat 脚本实现.md.md index b9f6659..0398a4a 100644 --- a/doc_scripts/PAM智能部署 Shell & Bat 脚本实现.md.md +++ b/doc_scripts/PAM智能部署 Shell & Bat 脚本实现.md.md @@ -28,6 +28,8 @@ - `config.txt` - `deploy.sh` 或 `deploy.ps1` - 仅在用户明确要求时再提供 `deploy.bat` +7. NODE 侧接口路径统一使用 `node-proxy`;`download-cloud/progress` 需额外携带 `versionNumer`,并以异步轮询方式持续展示下载进度。 +8. `download-cloud/progress` 的完成判定优先读取 `msg`、`step`、`rateOfProgress`;当 `msg=success`、`step=DONE`、`rateOfProgress=100` 时代表下载完成,其中 `rateOfProgress` 即下载进度值。 ## 0.1 当前实现边界 @@ -213,23 +215,34 @@ poll_progress() { local interval=${3:-2} local retry=0 - log_info "开始轮询进度..." + log_info "开始异步轮询下载进度..." while [ $retry -lt $max_retries ]; do local response response=$(http_request "GET" "$url") + local step + local msg + local progress local status - # 尝试解析 JSON,如果失败则可能是网络错误 - status=$(echo $response | jq -r '.status // .success // ""' 2>/dev/null) - - if [ "$status" == "completed" ] || [ "$status" == "true" ]; then + local success_flag + step=$(echo $response | jq -r '.step // ""' 2>/dev/null) + msg=$(echo $response | jq -r '.msg // .message // ""' 2>/dev/null) + progress=$(echo $response | jq -r '.rateOfProgress // .progress // .percent // ""' 2>/dev/null) + status=$(echo $response | jq -r '.status // ""' 2>/dev/null) + success_flag=$(echo $response | jq -r '.success // ""' 2>/dev/null) + + if [ -n "$msg" ] || [ -n "$step" ] || [ -n "$progress" ] || [ -n "$status" ] || [ -n "$success_flag" ]; then + log_info "异步下载进度: msg=${msg} step=${step} rateOfProgress=${progress} status=${status} success=${success_flag}" + fi + + if [ "$step" == "DONE" ] || [ "$status" == "completed" ] || [ "$success_flag" == "true" ] || { [ "$msg" == "success" ] && [ "$progress" == "100" ]; }; then log_info "操作完成" return 0 fi local error_msg - error_msg=$(echo $response | jq -r '.message // ""' 2>/dev/null) + error_msg="$msg" # 如果 jq 解析失败,说明返回的可能不是 JSON,而是 HTTP 错误页或 curl 错误 if [ -z "$error_msg" ] && ! echo "$response" | grep -q "success"; then @@ -263,7 +276,7 @@ download_log() { log_info "正在下载 ${ip} 的日志: ${log_name}..." # 使用 -o 保存文件,同时保留 stderr 信息以便调试 - http_request "GET" "${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/log-download?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}&logName=${log_name}" \ + http_request "GET" "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/log-download?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}&logName=${log_name}" \ "" \ "Target-Node:${NODE_URL}" > "$log_file" 2>>"${log_dir}/error_${ip}.log" @@ -347,7 +360,7 @@ main() { # Step 3.2: 获取在线工作站 IP (动态获取) log_info "Step 3.2: 获取在线工作站列表..." - local ips_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/ips?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}" + local ips_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/ips?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}" local ips_response ips_response=$(http_request "GET" "$ips_url" "" "Target-Node:${NODE_URL}") @@ -368,7 +381,7 @@ main() { # Step 3.3: 下载软件包到 Node log_info "Step 3.3: 下载软件包到 Node..." - local download_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud" + local download_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud" local download_params="?versionNumber=${VERSION_NUMBER}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}" http_request "GET" "${download_url}${download_params}" \ @@ -376,7 +389,7 @@ main() { "airport-code:${AIRPORT_CODE},Target-Node:${NODE_URL}" > /dev/null # 轮询下载进度 - local progress_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud/progress?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}" + local progress_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud/progress?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&versionNumer=${VERSION_NUMBER}" poll_progress "$progress_url" 60 2 if [ $? -ne 0 ]; then log_error "软件包下载失败" @@ -394,7 +407,7 @@ main() { # 4.1: 执行升级 log_info "Step 4.1: 执行升级..." - local upgrade_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade" + local upgrade_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade" local upgrade_data="airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&versionNumber=${VERSION_NUMBER}&action=${ACTION_TYPE}&autoStart=false&timeOut=${TIMEOUT}" local upgrade_response @@ -410,20 +423,20 @@ main() { log_warn "尝试回滚..." # 回滚逻辑 - local rollback_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/rollback" + local rollback_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/rollback" local rollback_data="airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}" http_request "POST" "$rollback_url" "$rollback_data" "Target-Node:${NODE_URL}" > /dev/null log_warn "已触发回滚" else # 4.2: 启动应用 log_info "Step 4.2: 启动应用..." - local start_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/start-stop" + local start_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/start-stop" local start_data="airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&runstart=true" http_request "POST" "$start_url" "$start_data" "Target-Node:${NODE_URL}" > /dev/null # 4.3: 健康检测 log_info "Step 4.3: 健康检测..." - local verify_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/verify?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}" + local verify_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/verify?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}" local verify_response verify_response=$(http_request "GET" "$verify_url" "" "Target-Node:${NODE_URL}") @@ -437,7 +450,7 @@ main() { # 健康检测失败也可触发回滚(可选) log_warn "尝试回滚..." - local rollback_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/rollback" + local rollback_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/rollback" local rollback_data="airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}" http_request "POST" "$rollback_url" "$rollback_data" "Target-Node:${NODE_URL}" > /dev/null else diff --git a/doc_scripts/deploy.ps1 b/doc_scripts/deploy.ps1 index ab85833..693a574 100644 --- a/doc_scripts/deploy.ps1 +++ b/doc_scripts/deploy.ps1 @@ -386,7 +386,7 @@ function Get-OnlineIps { airportCode = $Config.AIRPORT_CODE }) - $response = Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/ips?$query" -Token $Token -Headers @{ + $response = Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/ips?$query" -Token $Token -Headers @{ 'Target-Node' = $NodeUrl } @@ -411,8 +411,9 @@ function Wait-DownloadProgress { applicationName = $Config.APP_NAME moduleName = $Config.MODULE_NAME airportCode = $Config.AIRPORT_CODE + versionNumer = $Config.VERSION_NUMBER }) - $progressUrl = "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/download-cloud/progress?$query" + $progressUrl = "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/download-cloud/progress?$query" for ($attempt = 0; $attempt -lt 60; $attempt++) { $response = Invoke-PamWebRequest -Method GET -Url $progressUrl -Token $Token -Headers @{ @@ -421,12 +422,33 @@ function Wait-DownloadProgress { $status = Get-ResponseValue -Response $response -Candidates @('status') $successFlag = Get-ResponseValue -Response $response -Candidates @('success') - if ($status -eq 'completed' -or $successFlag -eq 'true') { + $step = Get-ResponseValue -Response $response -Candidates @('step') + $msg = Get-ResponseValue -Response $response -Candidates @('msg') + $progressValue = Get-ResponseValue -Response $response -Candidates @('rateOfProgress', 'progress', 'percent', 'data.rateOfProgress', 'data.progress', 'data.percent') + $message = Get-ResponseValue -Response $response -Candidates @('message') + if (-not $message) { $message = $msg } + + $progressParts = [System.Collections.Generic.List[string]]::new() + if ($msg) { $progressParts.Add("msg=$msg") } + if ($step) { $progressParts.Add("step=$step") } + if ($progressValue) { $progressParts.Add("rateOfProgress=$progressValue") } + if ($status) { $progressParts.Add("status=$status") } + if ($successFlag) { $progressParts.Add("success=$successFlag") } + if ($message -and $message -ne $msg) { $progressParts.Add("message=$message") } + + if ($progressParts.Count -gt 0) { + Write-Info ("Step 3.3b: async download progress -> {0}" -f ($progressParts -join ', ')) + } else { + Write-Info ("Step 3.3b: async download progress polling... ({0}/60)" -f ($attempt + 1)) + } + + if ($step -eq 'DONE' -or $status -eq 'completed' -or $successFlag -eq 'true' -or (($msg -eq 'success') -and ($progressValue -eq '100'))) { return } - $message = Get-ResponseValue -Response $response -Candidates @('message') - if ($message -and $message -match '(?i)fail|error') { + if ((@($step, $message, $msg) -join ' ') -match '(?i)fail|error') { + if (-not $message) { $message = $step } + if (-not $message) { $message = $msg } throw "Node download failed: $message" } @@ -447,7 +469,7 @@ function Download-CloudToNode { timeOut = $Config.TIMEOUT }) - [void](Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/download-cloud?$query" -Token $Token -Headers @{ + [void](Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/download-cloud?$query" -Token $Token -Headers @{ 'Target-Node' = $NodeUrl 'airport-code' = $Config.AIRPORT_CODE }) @@ -469,7 +491,7 @@ function Invoke-UpgradeRequest { timeOut = $Config.TIMEOUT }) - Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade" -Token $Token -Headers @{ + Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade" -Token $Token -Headers @{ 'Target-Node' = $NodeUrl } -Body $body -ContentType 'application/x-www-form-urlencoded' } @@ -485,7 +507,7 @@ function Start-Application { runstart = 'true' }) - [void](Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/start-stop" -Token $Token -Headers @{ + [void](Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/start-stop" -Token $Token -Headers @{ 'Target-Node' = $NodeUrl } -Body $body -ContentType 'application/x-www-form-urlencoded') } @@ -501,7 +523,7 @@ function Stop-Application { runstart = 'false' }) - [void](Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/start-stop" -Token $Token -Headers @{ + [void](Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/start-stop" -Token $Token -Headers @{ 'Target-Node' = $NodeUrl } -Body $body -ContentType 'application/x-www-form-urlencoded') } @@ -516,7 +538,7 @@ function Verify-Ip { targetIp = $Ip }) - Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/verify?$query" -Token $Token -Headers @{ + Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/verify?$query" -Token $Token -Headers @{ 'Target-Node' = $NodeUrl } } @@ -540,7 +562,7 @@ function Download-DeployLog { }) try { - [void](Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/log-download?$query" -Token $Token -Headers @{ + [void](Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/log-download?$query" -Token $Token -Headers @{ 'Target-Node' = $NodeUrl } -OutFile $logFile) @@ -576,7 +598,7 @@ function Invoke-Rollback { moduleName = $Config.MODULE_NAME timeOut = $Config.TIMEOUT }) - $response = Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/rollback" -Token $Token -Headers @{ + $response = Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/rollback" -Token $Token -Headers @{ 'Target-Node' = $NodeUrl } -Body $body -ContentType 'application/x-www-form-urlencoded' diff --git a/doc_scripts/deploy.sh b/doc_scripts/deploy.sh index c1c72d3..66fd879 100644 --- a/doc_scripts/deploy.sh +++ b/doc_scripts/deploy.sh @@ -305,6 +305,27 @@ json_value() { '.message') json_get_string_by_key "$input" "message" ;; + '.msg') + json_get_string_by_key "$input" "msg" + ;; + '.step') + json_get_string_by_key "$input" "step" + ;; + '.rateOfProgress') + json_get_scalar_by_key "$input" "rateOfProgress" + ;; + '.progress') + json_get_scalar_by_key "$input" "progress" + ;; + '.percent') + json_get_scalar_by_key "$input" "percent" + ;; + '.data.progress') + json_get_nested_string_by_key "$input" "data" "progress" + ;; + '.data.percent') + json_get_nested_string_by_key "$input" "data" "percent" + ;; '.hashCode // .data.hashCode') local value value="$(json_get_string_by_key "$input" "hashCode")" @@ -624,7 +645,7 @@ get_online_ips() { local response local ip_lines response=$(http_request "GET" \ - "${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/ips?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}" \ + "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/ips?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}" \ "" \ "" \ "Target-Node: ${NODE_URL}") || return 1 @@ -643,7 +664,7 @@ get_online_ips() { } poll_download_progress() { - local progress_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud/progress?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}" + local progress_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud/progress?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&versionNumer=${VERSION_NUMBER}" local attempt=0 local max_attempts=60 local error_regex='[Ff]ail|[Ee]rror' @@ -656,14 +677,44 @@ poll_download_progress() { status="$(json_value "$response" '.status')" local success_flag success_flag="$(json_value "$response" '.success')" + local step_value + step_value="$(json_value "$response" '.step')" + local msg_value + msg_value="$(json_value "$response" '.msg')" + local message + message="$(json_value "$response" '.message')" + local progress_value + progress_value="$(json_value "$response" '.rateOfProgress')" + [[ -z "$progress_value" ]] && progress_value="$(json_value "$response" '.progress')" + [[ -z "$progress_value" ]] && progress_value="$(json_value "$response" '.percent')" + [[ -z "$progress_value" ]] && progress_value="$(json_value "$response" '.data.progress')" + [[ -z "$progress_value" ]] && progress_value="$(json_value "$response" '.data.percent')" + [[ -z "$message" ]] && message="$msg_value" - if [[ "$status" == "completed" || "$success_flag" == "true" ]]; then + if [[ -n "$msg_value" || -n "$step_value" || -n "$progress_value" || -n "$status" || -n "$success_flag" || -n "$message" ]]; then + local -a progress_parts=() + [[ -n "$msg_value" ]] && progress_parts+=("msg=${msg_value}") + [[ -n "$step_value" ]] && progress_parts+=("step=${step_value}") + [[ -n "$progress_value" ]] && progress_parts+=("rateOfProgress=${progress_value}") + [[ -n "$status" ]] && progress_parts+=("status=${status}") + [[ -n "$success_flag" ]] && progress_parts+=("success=${success_flag}") + [[ -n "$message" && "$message" != "$msg_value" ]] && progress_parts+=("message=${message}") + log_info "Step 3.3b: 异步下载进度 -> ${progress_parts[*]}" + else + log_info "Step 3.3b: 异步下载进度轮询中... ($((attempt + 1))/${max_attempts})" + fi + + if [[ "$step_value" == "DONE" || "$status" == "completed" || "$success_flag" == "true" ]]; then return 0 fi - local message - message="$(json_value "$response" '.message')" - if [[ "$message" =~ $error_regex ]]; then + if [[ "$msg_value" == "success" && "$progress_value" == "100" ]]; then + return 0 + fi + + if [[ "${step_value} ${message} ${msg_value}" =~ $error_regex ]]; then + [[ -z "$message" ]] && message="$step_value" + [[ -z "$message" ]] && message="$msg_value" log_error "Node 下载失败: $message" return 1 fi @@ -679,7 +730,7 @@ poll_download_progress() { download_cloud_to_node() { log_info "Step 3.3: 下载软件包到 Node..." http_request "GET" \ - "${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud?versionNumber=${VERSION_NUMBER}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}" \ + "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud?versionNumber=${VERSION_NUMBER}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}" \ "" \ "" \ "Target-Node: ${NODE_URL}" \ @@ -691,7 +742,7 @@ download_cloud_to_node() { upgrade_ip() { local ip="$1" http_request "POST" \ - "${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade" \ + "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade" \ "airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&versionNumber=${VERSION_NUMBER}&action=${ACTION_TYPE}&autoStart=false&timeOut=${TIMEOUT}" \ "application/x-www-form-urlencoded" \ "Target-Node: ${NODE_URL}" @@ -700,7 +751,7 @@ upgrade_ip() { start_application() { local ip="$1" http_request "POST" \ - "${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/start-stop" \ + "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/start-stop" \ "airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&runstart=true" \ "application/x-www-form-urlencoded" \ "Target-Node: ${NODE_URL}" >/dev/null @@ -709,7 +760,7 @@ start_application() { stop_application() { local ip="$1" http_request "POST" \ - "${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/start-stop" \ + "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/start-stop" \ "airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&runstart=false" \ "application/x-www-form-urlencoded" \ "Target-Node: ${NODE_URL}" >/dev/null @@ -718,7 +769,7 @@ stop_application() { verify_ip() { local ip="$1" http_request "GET" \ - "${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/verify?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}" \ + "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/verify?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}" \ "" \ "" \ "Target-Node: ${NODE_URL}" @@ -730,7 +781,7 @@ download_log() { local log_file="${logs_dir}/deploy_${ip}.log" local err_file="${logs_dir}/error_${ip}.log" local request_id - local trace_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/log-download?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}&logName=${LOG_NAME}" + local trace_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/log-download?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}&logName=${LOG_NAME}" local curl_exit=0 local http_code="" local trace_error="" @@ -786,7 +837,7 @@ rollback_ip() { local response if ! response=$(http_request "POST" \ - "${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/rollback" \ + "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/rollback" \ "airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}" \ "application/x-www-form-urlencoded" \ "Target-Node: ${NODE_URL}"); then