mirror of
https://github.com/hpd840321/starRiverProperty.git
synced 2026-06-09 08:20:31 +08:00
fix: relocate cwos-portal decompiled output to correct path; remove nested directory
Former-commit-id: dc30d42a8c55ed8b2382a41dc2434233fbed9930
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env bash
|
||||
# 将 V1 运行包 cw_lib 中的电梯四模块 jar 用 CFR 反编译到本仓库 tools/v1-decompiled/ 下,
|
||||
# 供与 maven-cw-elevator-application 源码逐类比对(不依赖历史 artifacts 手工目录)。
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
MV_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
REPO_ROOT="$(cd "$MV_ROOT/.." && pwd)"
|
||||
|
||||
# V1 解压目录(含 cw_lib)
|
||||
: "${V1_RUN_DIR:=${REPO_ROOT}/cw-elevator-application-V1.0.0.20211103}"
|
||||
CW_LIB="${V1_RUN_DIR}/cw_lib"
|
||||
|
||||
# CFR:优先环境变量,其次仓库 artifacts
|
||||
: "${CFR_JAR:=${REPO_ROOT}/artifacts/decompiled/v1-cfr-compare-20211103/cfr-0.152.jar}"
|
||||
if [[ ! -f "$CFR_JAR" ]]; then
|
||||
echo "ERROR: CFR not found: $CFR_JAR" >&2
|
||||
echo "Set CFR_JAR to a local cfr-*.jar path." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 输出根目录(可用环境变量覆盖)
|
||||
: "${V1_DECOMP_OUT:=${MV_ROOT}/tools/v1-decompiled/cfr-from-cw-lib}"
|
||||
TIMESTAMP="$(date +%Y%m%d-%H%M%S)"
|
||||
OUT="${V1_DECOMP_OUT}-${TIMESTAMP}"
|
||||
FINAL_LINK="${MV_ROOT}/tools/v1-decompiled/cfr-from-cw-lib-current"
|
||||
|
||||
MODULES=(
|
||||
"cw-elevator-application-common-1.0-SNAPSHOT.jar"
|
||||
"cw-elevator-application-data-1.0-SNAPSHOT.jar"
|
||||
"cw-elevator-application-service-1.0-SNAPSHOT.jar"
|
||||
"cw-elevator-application-web-1.0-SNAPSHOT.jar"
|
||||
)
|
||||
|
||||
echo "V1 cw_lib: $CW_LIB"
|
||||
echo "CFR: $CFR_JAR"
|
||||
echo "Output: $OUT"
|
||||
mkdir -p "$OUT"
|
||||
|
||||
for j in "${MODULES[@]}"; do
|
||||
jar_path="${CW_LIB}/${j}"
|
||||
if [[ ! -f "$jar_path" ]]; then
|
||||
echo "WARNING: missing $jar_path — skip"
|
||||
continue
|
||||
fi
|
||||
mod="${j%.jar}"
|
||||
dest="${OUT}/${mod}"
|
||||
mkdir -p "$dest"
|
||||
echo ">>> Decompiling $j -> $dest"
|
||||
java -jar "$CFR_JAR" "$jar_path" \
|
||||
--outputdir "$dest" \
|
||||
--silent true
|
||||
done
|
||||
|
||||
# 可选:V1 fat jar(体积大,默认关闭)
|
||||
if [[ "${DECOMPILE_V1_FAT_JAR:-0}" == "1" ]]; then
|
||||
FAT="${V1_RUN_DIR}/cw-elevator-application-V1.0.0.20211103.jar"
|
||||
if [[ -f "$FAT" ]]; then
|
||||
echo ">>> Decompiling fat jar (may take several minutes)..."
|
||||
java -jar "$CFR_JAR" "$FAT" \
|
||||
--outputdir "${OUT}/cw-elevator-application-V1.0.0.20211103-fat" \
|
||||
--silent true
|
||||
else
|
||||
echo "WARNING: fat jar not found: $FAT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 写元数据
|
||||
{
|
||||
echo "generated_utc: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
||||
echo "v1_run_dir: $V1_RUN_DIR"
|
||||
echo "cfr_jar: $CFR_JAR"
|
||||
echo "modules:"
|
||||
for j in "${MODULES[@]}"; do echo " - $j"; done
|
||||
} > "${OUT}/MANIFEST.txt"
|
||||
|
||||
ln -sfn "$OUT" "$FINAL_LINK"
|
||||
echo ""
|
||||
echo "Done. Latest symlink: $FINAL_LINK -> $OUT"
|
||||
echo "Manifest: ${OUT}/MANIFEST.txt"
|
||||
@@ -2,6 +2,9 @@
|
||||
# 完整接口测试:V1/V2 单机冒烟 + 双端对拍 + 套件总览 Markdown。
|
||||
# 前置:两 JAR 已分别启动(默认 http://127.0.0.1:18080 为 V1、18081 为 V2),且配置同一数据源/Redis。
|
||||
# 用法:在 maven-cw-elevator-application 目录执行 ./scripts/run_full_elevator_api_suite.sh
|
||||
#
|
||||
# ELEVATOR_SUITE_STRICT=1:冒烟与对拍失败时脚本退出非 0(默认由 run_v1v2_parity_automated.sh 传入)。
|
||||
# ELEVATOR_SUITE_STRICT=0:与旧行为一致,冒烟/对拍用「|| true」始终生成总览(便于无服务时只看单元测试)。
|
||||
set -euo pipefail
|
||||
|
||||
REPO="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
@@ -13,6 +16,18 @@ export PIP_DISABLE_PIP_VERSION_CHECK=1
|
||||
export ELEVATOR_BASE_OLD="${ELEVATOR_BASE_OLD:-http://127.0.0.1:18080}"
|
||||
export ELEVATOR_BASE_NEW="${ELEVATOR_BASE_NEW:-http://127.0.0.1:18081}"
|
||||
|
||||
SUITE_STRICT="${ELEVATOR_SUITE_STRICT:-0}"
|
||||
SUITE_FAIL=0
|
||||
|
||||
_py_maybe_ignore() {
|
||||
if [[ "${SUITE_STRICT}" == "1" ]]; then
|
||||
python3 -m pytest "$@" && return 0
|
||||
return 1
|
||||
fi
|
||||
python3 -m pytest "$@" || true
|
||||
return 0
|
||||
}
|
||||
|
||||
cd "$TOOL"
|
||||
python3 -m pip install -q -r requirements.txt 2>/dev/null || true
|
||||
|
||||
@@ -25,16 +40,16 @@ echo "==> 单元(compare 逻辑)"
|
||||
python3 -m pytest tests/test_unit_compare.py -q --tb=short
|
||||
|
||||
echo "==> 冒烟 V1 ($ELEVATOR_BASE_OLD) [需该地址可访问 /actuator/health 等健康端点]"
|
||||
python3 -m pytest tests/test_smoke_catalog.py -m smoke \
|
||||
--smoke-base="$ELEVATOR_BASE_OLD" --smoke-label=v1_legacy $PTF || true
|
||||
_py_maybe_ignore tests/test_smoke_catalog.py -m smoke \
|
||||
--smoke-base="$ELEVATOR_BASE_OLD" --smoke-label=v1_legacy $PTF || SUITE_FAIL=1
|
||||
|
||||
echo "==> 冒烟 V2 ($ELEVATOR_BASE_NEW) [需该地址可访问 /actuator/health 等健康端点]"
|
||||
python3 -m pytest tests/test_smoke_catalog.py -m smoke \
|
||||
--smoke-base="$ELEVATOR_BASE_NEW" --smoke-label=v2_build $PTF || true
|
||||
_py_maybe_ignore tests/test_smoke_catalog.py -m smoke \
|
||||
--smoke-base="$ELEVATOR_BASE_NEW" --smoke-label=v2_build $PTF || SUITE_FAIL=1
|
||||
|
||||
echo "==> 横向对拍(两实例均需通过健康探针)"
|
||||
python3 -m pytest tests/test_parity_endpoints.py -m live $PTF \
|
||||
--base-old="$ELEVATOR_BASE_OLD" --base-new="$ELEVATOR_BASE_NEW" || true
|
||||
echo "==> 横向对拍(两实例均需通过健康探针) [ELEVATOR_SUITE_STRICT=${SUITE_STRICT} ELEVATOR_PARITY_BOUNDARY=${ELEVATOR_PARITY_BOUNDARY:-0}]"
|
||||
_py_maybe_ignore tests/test_parity_endpoints.py -m live $PTF \
|
||||
--base-old="$ELEVATOR_BASE_OLD" --base-new="$ELEVATOR_BASE_NEW" || SUITE_FAIL=1
|
||||
|
||||
SUITE_TS="$(date +%Y%m%d-%H%M%S)"
|
||||
_pick_newer() {
|
||||
@@ -62,3 +77,8 @@ if [[ -z "$SMOKE_V1" && -z "$SMOKE_V2" && -z "$PARITY" ]]; then
|
||||
echo " 快速探活: curl -s -o /dev/null -w '%{http_code}' $ELEVATOR_BASE_OLD/actuator/health"
|
||||
fi
|
||||
rm -f "$MARKER"
|
||||
|
||||
if [[ "${SUITE_FAIL}" -ne 0 ]]; then
|
||||
echo "==> 套件步骤存在失败 (ELEVATOR_SUITE_STRICT=${SUITE_STRICT}, exit=${SUITE_FAIL})" >&2
|
||||
fi
|
||||
exit "${SUITE_FAIL}"
|
||||
|
||||
@@ -0,0 +1,225 @@
|
||||
#!/usr/bin/env bash
|
||||
# 一键:构建 V2 → sync-jars → 后台启动 V1/V2(默认同 deploy 配置、异端口)→ 健康等待 → 跑完整 API 套件。
|
||||
#
|
||||
# 【能力边界|审阅说明】
|
||||
# - 会做:按 api_catalog.json 对 V1/V2 **顺序**发 HTTP(冒烟 + 双端对拍),比对返回(compare_mode:code_only / deep / status_only),
|
||||
# 产出 report/smoke-*.md、parity-*.md、SUITE-*.md;strict 模式下不一致则 pytest 失败、脚本非 0。
|
||||
# - 不会做:**并发压测**(无固定 RPS、并发连接数、持续时间、p95 延迟统计);若需压测请另用 hey/wrk/k6 等指向同一 ELEVATOR_BASE_OLD/NEW。
|
||||
#
|
||||
# 用法(在 maven-cw-elevator-application 目录):
|
||||
# ./scripts/run_v1v2_parity_automated.sh
|
||||
#
|
||||
# 环境变量(节选):
|
||||
# ELEVATOR_SKIP_BUILD=1 跳过 mvn package(已有 target JAR)
|
||||
# ELEVATOR_SKIP_SYNC=1 跳过 deploy/sync-jars.sh(deploy 下已有 JAR)
|
||||
# ELEVATOR_SKIP_START=1 不启动进程,仅跑套件(需已监听 ELEVATOR_BASE_OLD/NEW)
|
||||
# ELEVATOR_SUITE_STRICT=1 默认值;smoke/parity 失败则脚本非 0(传给 run_full_elevator_api_suite.sh)
|
||||
# ELEVATOR_SUITE_STRICT=0 smoke/parity 与旧版一致用 || true,便于只看报告
|
||||
# ELEVATOR_PARITY_BOUNDARY=0 对拍仅基线体,不合并 boundary_patches(默认本脚本为 1)
|
||||
# ELEVATOR_PORT_V1=18080 ELEVATOR_PORT_V2=18081
|
||||
# ELEVATOR_STARTUP_TIMEOUT=240 单端就绪最长等待秒数
|
||||
# ELEVATOR_AUTO_KILL=1 默认退出时结束本脚本启动的 java 子进程
|
||||
# ELEVATOR_JAVA_OPTS 传给两边的 JVM(如 -Xmx512m)
|
||||
# ELEVATOR_USE_ENV_JAVA=1 使用当前 JAVA_HOME(见 deploy/common-java.sh)
|
||||
# ELEVATOR_PARITY_OFFLINE=1 默认:禁用 Consul(笔记本无 8500 / 避免误连 JAR 内嵌机房地址)。
|
||||
# ELEVATOR_PARITY_OFFLINE=0 使用 deploy/*/bootstrap.properties 中的 Consul(默认 host 192.168.3.12:8500,与该机 Docker consul 一致)。
|
||||
#
|
||||
set -euo pipefail
|
||||
|
||||
REPO="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
DEPLOY="${REPO}/deploy"
|
||||
PARITY_OFFLINE_PROPS="${DEPLOY}/parity-offline-overrides.properties"
|
||||
TOOL="${REPO}/tools/elevator_api_parity"
|
||||
SCRIPTS="${REPO}/scripts"
|
||||
|
||||
# shellcheck source=../deploy/common-java.sh
|
||||
source "${DEPLOY}/common-java.sh"
|
||||
|
||||
MERGE="${DEPLOY}/merge-redis-json.sh"
|
||||
PORT_V1="${ELEVATOR_PORT_V1:-18080}"
|
||||
PORT_V2="${ELEVATOR_PORT_V2:-18081}"
|
||||
BASE_V1="${ELEVATOR_BASE_OLD:-http://127.0.0.1:${PORT_V1}}"
|
||||
BASE_V2="${ELEVATOR_BASE_NEW:-http://127.0.0.1:${PORT_V2}}"
|
||||
START_TIMEOUT="${ELEVATOR_STARTUP_TIMEOUT:-240}"
|
||||
AUTO_KILL="${ELEVATOR_AUTO_KILL:-1}"
|
||||
|
||||
export ELEVATOR_BASE_OLD="$BASE_V1"
|
||||
export ELEVATOR_BASE_NEW="$BASE_V2"
|
||||
export ELEVATOR_SUITE_STRICT="${ELEVATOR_SUITE_STRICT:-1}"
|
||||
# 对拍时展开 api_catalog 中 boundary_patches(入参边界);设为 0 仅跑基线 default 体以缩短耗时
|
||||
export ELEVATOR_PARITY_BOUNDARY="${ELEVATOR_PARITY_BOUNDARY:-1}"
|
||||
|
||||
PID_DIR=""
|
||||
STARTED_V1=""
|
||||
STARTED_V2=""
|
||||
|
||||
cleanup() {
|
||||
if [[ "${AUTO_KILL}" != "1" ]] || [[ -z "${PID_DIR}" ]] || [[ ! -d "${PID_DIR}" ]]; then
|
||||
return 0
|
||||
fi
|
||||
for key in v1 v2; do
|
||||
f="${PID_DIR}/${key}.pid"
|
||||
if [[ -f "$f" ]]; then
|
||||
pid="$(cat "$f" 2>/dev/null || true)"
|
||||
if [[ -n "${pid}" ]] && kill -0 "$pid" 2>/dev/null; then
|
||||
echo "==> 停止 ${key} (pid ${pid})"
|
||||
kill "$pid" 2>/dev/null || true
|
||||
wait "$pid" 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
done
|
||||
rm -rf "${PID_DIR}"
|
||||
}
|
||||
|
||||
trap cleanup EXIT INT TERM
|
||||
|
||||
_port_in_use() {
|
||||
local port="$1"
|
||||
if command -v nc >/dev/null 2>&1; then
|
||||
nc -z 127.0.0.1 "$port" 2>/dev/null
|
||||
return $?
|
||||
fi
|
||||
timeout 0.3 bash -c "echo >/dev/tcp/127.0.0.1/${port}" 2>/dev/null
|
||||
}
|
||||
|
||||
_wait_healthy() {
|
||||
local base="$1"
|
||||
local label="$2"
|
||||
local pid_file="$3"
|
||||
local log_file="$4"
|
||||
local end=$(( $(date +%s) + START_TIMEOUT ))
|
||||
echo "==> 等待就绪 ${label} (${base}),最长 ${START_TIMEOUT}s"
|
||||
while (( $(date +%s) < end )); do
|
||||
if [[ -f "${pid_file}" ]]; then
|
||||
local pid=""
|
||||
pid="$(cat "${pid_file}" 2>/dev/null || true)"
|
||||
if [[ -n "${pid}" ]] && ! kill -0 "${pid}" 2>/dev/null; then
|
||||
echo "ERROR: ${label} 进程已退出(pid=${pid}),无需继续等待健康检查。" >&2
|
||||
echo " 请检查日志: ${log_file}" >&2
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
for path in /actuator/health /health; do
|
||||
code="$(curl -s -o /tmp/elev_h$$ -w '%{http_code}' "${base}${path}" 2>/dev/null || echo 0)"
|
||||
if [[ "${code}" == "200" ]] && grep -qiE 'up|"status"[[:space:]]*:[[:space:]]*"OK"' /tmp/elev_h$$ 2>/dev/null; then
|
||||
rm -f /tmp/elev_h$$
|
||||
echo " OK ${label} ${path}"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
sleep 2
|
||||
done
|
||||
rm -f /tmp/elev_h$$
|
||||
echo "ERROR: ${label} 在 ${START_TIMEOUT}s 内未通过健康检查: ${base}" >&2
|
||||
return 1
|
||||
}
|
||||
|
||||
_pick_java_home
|
||||
if [[ ! -x "${JAVA_HOME}/bin/java" ]]; then
|
||||
echo "ERROR: 未找到 JDK。请安装 openjdk-8-jdk 或设置 JAVA_HOME / ELEVATOR_USE_ENV_JAVA=1" >&2
|
||||
exit 1
|
||||
fi
|
||||
JAVA="${JAVA_HOME}/bin/java"
|
||||
OPEN_FLAGS=()
|
||||
while IFS= read -r line; do
|
||||
[[ -n "${line}" ]] && OPEN_FLAGS+=("${line}")
|
||||
done < <(_jdk8_open_flags "$JAVA")
|
||||
|
||||
if [[ ! -x "${MERGE}" ]]; then
|
||||
chmod +x "${MERGE}" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if [[ "${ELEVATOR_SKIP_BUILD:-0}" != "1" ]]; then
|
||||
OLD_TARGET_JAR="${REPO}/cw-elevator-application-starter/target/cw-elevator-application-2.0.0.jar"
|
||||
OLD_DEPLOY_JAR="${DEPLOY}/v2-maven/cw-elevator-application-2.0.0.jar"
|
||||
echo "==> 删除旧 V2 JAR(确保全量重编译产物)"
|
||||
rm -f "${OLD_TARGET_JAR}" "${OLD_DEPLOY_JAR}"
|
||||
echo "==> mvn package (skip tests)"
|
||||
(cd "${REPO}" && mvn -q -DskipTests clean package)
|
||||
else
|
||||
echo "==> 跳过构建 (ELEVATOR_SKIP_BUILD=1)"
|
||||
fi
|
||||
|
||||
if [[ "${ELEVATOR_SKIP_SYNC:-0}" != "1" ]]; then
|
||||
echo "==> sync-jars(V1 来自仓库根 cw-elevator-application-V1.0.0.20211103/)"
|
||||
# 默认用当前 Maven data 模块覆盖 V1 fat-jar 内嵌 data JAR,避免历史包与源码分片实现分叉导致 record_page 等对拍假差异;纯正历史 V1 请 ELEVATOR_SKIP_SYNC=1 或 PARITY_PATCH_V1_DATA=0
|
||||
export PARITY_PATCH_V1_DATA="${PARITY_PATCH_V1_DATA:-1}"
|
||||
bash "${DEPLOY}/sync-jars.sh"
|
||||
else
|
||||
echo "==> 跳过 sync-jars (ELEVATOR_SKIP_SYNC=1)"
|
||||
fi
|
||||
|
||||
V1_DIR="${DEPLOY}/v1-legacy"
|
||||
V2_DIR="${DEPLOY}/v2-maven"
|
||||
JAR_V1="${V1_DIR}/cw-elevator-application-V1.0.0.20211103.jar"
|
||||
JAR_V2="${V2_DIR}/cw-elevator-application-2.0.0.jar"
|
||||
if [[ ! -f "${JAR_V1}" ]] || [[ ! -f "${JAR_V2}" ]]; then
|
||||
echo "ERROR: 缺少 JAR。请执行 ${DEPLOY}/sync-jars.sh 或先 mvn package。" >&2
|
||||
echo " 期望: ${JAR_V1}" >&2
|
||||
echo " ${JAR_V2}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
LOG_DIR="${REPO}/.elevator-parity-logs"
|
||||
mkdir -p "${LOG_DIR}"
|
||||
|
||||
if [[ "${ELEVATOR_SKIP_START:-0}" != "1" ]]; then
|
||||
if _port_in_use "${PORT_V1}" && [[ "${ELEVATOR_ALLOW_BUSY_PORTS:-0}" != "1" ]]; then
|
||||
echo "ERROR: 端口 ${PORT_V1} 已被占用。可先停占用进程,或设 ELEVATOR_SKIP_START=1 使用已启动实例。" >&2
|
||||
exit 1
|
||||
fi
|
||||
if _port_in_use "${PORT_V2}" && [[ "${ELEVATOR_ALLOW_BUSY_PORTS:-0}" != "1" ]]; then
|
||||
echo "ERROR: 端口 ${PORT_V2} 已被占用。" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PID_DIR="$(mktemp -d "${REPO}/.elevator-parity-pids.XXXXXX")"
|
||||
|
||||
# Consul:若脚本未加载 bootstrap、且无本地 Consul,JAR 内嵌地址会导致 agentServiceRegister 失败→整进程退出(日志见 TransportException 8500)。
|
||||
OFF_JVM=()
|
||||
LOC_CHAIN_V1="file:${V1_DIR}/bootstrap.properties,file:${V1_DIR}/application.properties,file:${V1_DIR}/redis-override.properties"
|
||||
LOC_CHAIN_V2="file:${V2_DIR}/bootstrap.properties,file:${V2_DIR}/application.properties,file:${V2_DIR}/redis-override.properties"
|
||||
if [[ "${ELEVATOR_PARITY_OFFLINE:-1}" == "1" ]] && [[ -f "${PARITY_OFFLINE_PROPS}" ]]; then
|
||||
LOC_CHAIN_V1+=",file:${PARITY_OFFLINE_PROPS}"
|
||||
LOC_CHAIN_V2+=",file:${PARITY_OFFLINE_PROPS}"
|
||||
# 覆盖 Spring Cloud 先于 spring.config 解析的 classpath bootstrap,避免仍指向机房 Consul
|
||||
OFF_JVM=("-Dspring.cloud.consul.enabled=false")
|
||||
echo "==> Consul: 离线模式(ELEVATOR_PARITY_OFFLINE=1,禁用注册)。若在本机 192.168.3.12 已有 Docker Consul,可改用 ELEVATOR_PARITY_OFFLINE=0"
|
||||
else
|
||||
echo "==> Consul: 联机模式(ELEVATOR_PARITY_OFFLINE=0,按 bootstrap 连接 Consul,deploy 默认 192.168.3.12:8500)"
|
||||
fi
|
||||
|
||||
echo "==> 启动 V1 :${PORT_V1}"
|
||||
export SPRING_APPLICATION_JSON="$("${MERGE}" "${V1_DIR}/redis-override.properties")"
|
||||
# shellcheck disable=SC2086
|
||||
nohup "${JAVA}" "${OPEN_FLAGS[@]}" "${OFF_JVM[@]}" ${ELEVATOR_JAVA_OPTS:-} -jar "${JAR_V1}" \
|
||||
--spring.config.location="${LOC_CHAIN_V1}" \
|
||||
--server.port="${PORT_V1}" >>"${LOG_DIR}/v1-legacy.log" 2>&1 &
|
||||
echo $! > "${PID_DIR}/v1.pid"
|
||||
STARTED_V1=1
|
||||
|
||||
echo "==> 启动 V2 :${PORT_V2}"
|
||||
export SPRING_APPLICATION_JSON="$("${MERGE}" "${V2_DIR}/redis-override.properties")"
|
||||
# shellcheck disable=SC2086
|
||||
nohup "${JAVA}" "${OPEN_FLAGS[@]}" "${OFF_JVM[@]}" ${ELEVATOR_JAVA_OPTS:-} -jar "${JAR_V2}" \
|
||||
--spring.config.location="${LOC_CHAIN_V2}" \
|
||||
--server.port="${PORT_V2}" >>"${LOG_DIR}/v2-maven.log" 2>&1 &
|
||||
echo $! > "${PID_DIR}/v2.pid"
|
||||
STARTED_V2=1
|
||||
|
||||
unset SPRING_APPLICATION_JSON
|
||||
|
||||
echo " V1 pid=$(cat "${PID_DIR}/v1.pid") log=${LOG_DIR}/v1-legacy.log"
|
||||
echo " V2 pid=$(cat "${PID_DIR}/v2.pid") log=${LOG_DIR}/v2-maven.log"
|
||||
|
||||
_wait_healthy "${BASE_V1}" "V1" "${PID_DIR}/v1.pid" "${LOG_DIR}/v1-legacy.log" || exit 1
|
||||
_wait_healthy "${BASE_V2}" "V2" "${PID_DIR}/v2.pid" "${LOG_DIR}/v2-maven.log" || exit 1
|
||||
else
|
||||
echo "==> 跳过启动 (ELEVATOR_SKIP_START=1),假定 ${BASE_V1} / ${BASE_V2} 已可用"
|
||||
fi
|
||||
|
||||
echo "==> 完整 API 套件(ELEVATOR_SUITE_STRICT=${ELEVATOR_SUITE_STRICT})"
|
||||
bash "${SCRIPTS}/run_full_elevator_api_suite.sh"
|
||||
SUITE_EXIT=$?
|
||||
|
||||
exit "${SUITE_EXIT}"
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
#!/usr/bin/env bash
|
||||
# 校验私服上 intelligent-cwoscomponent 2.9.2 线是否「可解析」:父 POM、interface、rest 均存在,
|
||||
# 且 rest 的 POM 必须声明对 intelligent-cwoscomponent-interface 的依赖(否则仅依赖 rest 时编译缺 client 包)。
|
||||
#
|
||||
# 环境变量:
|
||||
# NEXUS_PUBLIC_BASE 默认 http://192.168.3.12:8081/repository/maven-public/
|
||||
# ELEVATOR_ICOMP_VER 默认 2.9.2-xinghewan
|
||||
# CURL_OPTS 追加传给 curl(如内网 Basic:-u user:pass)
|
||||
#
|
||||
# 退出码:0 校验通过;1 缺文件或 rest POM 不完整
|
||||
set -euo pipefail
|
||||
|
||||
NEXUS_PUBLIC_BASE="${NEXUS_PUBLIC_BASE:-http://192.168.3.12:8081/repository/maven-public/}"
|
||||
ICOMP_VER="${ELEVATOR_ICOMP_VER:-2.9.2-xinghewan}"
|
||||
BASE="${NEXUS_PUBLIC_BASE%/}/"
|
||||
|
||||
die() { echo "ERROR: $*" >&2; exit 1; }
|
||||
|
||||
need_curl() { command -v curl >/dev/null 2>&1 || die "需要 curl"; }
|
||||
|
||||
fetch() {
|
||||
local url="$1"
|
||||
local out
|
||||
if ! out="$(curl -sfL ${CURL_OPTS:-} "$url" 2>&1)"; then
|
||||
echo "ERROR: 无法拉取: $url" >&2
|
||||
echo "$out" >&2
|
||||
exit 1
|
||||
fi
|
||||
printf '%s' "$out"
|
||||
}
|
||||
|
||||
need_curl
|
||||
|
||||
G="cn/cloudwalk/intelligent"
|
||||
PARENT_URL="${BASE}${G}/intelligent-cwoscomponent/${ICOMP_VER}/intelligent-cwoscomponent-${ICOMP_VER}.pom"
|
||||
IFACE_POM_URL="${BASE}${G}/intelligent-cwoscomponent-interface/${ICOMP_VER}/intelligent-cwoscomponent-interface-${ICOMP_VER}.pom"
|
||||
IFACE_JAR_URL="${BASE}${G}/intelligent-cwoscomponent-interface/${ICOMP_VER}/intelligent-cwoscomponent-interface-${ICOMP_VER}.jar"
|
||||
REST_POM_URL="${BASE}${G}/intelligent-cwoscomponent-rest/${ICOMP_VER}/intelligent-cwoscomponent-rest-${ICOMP_VER}.pom"
|
||||
REST_JAR_URL="${BASE}${G}/intelligent-cwoscomponent-rest/${ICOMP_VER}/intelligent-cwoscomponent-rest-${ICOMP_VER}.jar"
|
||||
|
||||
echo "==> NEXUS_PUBLIC_BASE=$NEXUS_PUBLIC_BASE"
|
||||
echo "==> 检查父 POM: $PARENT_URL"
|
||||
fetch "$PARENT_URL" >/dev/null
|
||||
|
||||
echo "==> 检查 interface POM + JAR"
|
||||
fetch "$IFACE_POM_URL" >/dev/null
|
||||
curl -sfL ${CURL_OPTS:-} -o /dev/null -I "$IFACE_JAR_URL" || die "interface JAR 不可访问: $IFACE_JAR_URL"
|
||||
|
||||
echo "==> 检查 rest POM + JAR"
|
||||
rest_pom="$(fetch "$REST_POM_URL")"
|
||||
curl -sfL ${CURL_OPTS:-} -o /dev/null -I "$REST_JAR_URL" || die "rest JAR 不可访问: $REST_JAR_URL"
|
||||
|
||||
if ! printf '%s' "$rest_pom" | grep -qE '<artifactId>intelligent-cwoscomponent-interface</artifactId>'; then
|
||||
die "rest 的 POM 未声明 intelligent-cwoscomponent-interface(常见原因:deploy-file 未带 -DpomFile,Nexus 生成了空模型 POM)。请在 Nexus 删除该版本 rest 构件后,用 deploy_intelligent_cwoscomponent_to_nexus.sh 按 cw_lib 内 .pom 重新上传。"
|
||||
fi
|
||||
|
||||
echo "OK: 私服 intelligent-cwoscomponent(${ICOMP_VER})父 POM + interface + rest 齐全,且 rest POM 声明 interface。"
|
||||
Reference in New Issue
Block a user