This commit is contained in:
133
scripts/verify_phase6.sh
Normal file
133
scripts/verify_phase6.sh
Normal file
@@ -0,0 +1,133 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
. "$SCRIPT_DIR/verify_common.sh"
|
||||
|
||||
DB_URL="${DATABASE_URL:-host=/var/run/postgresql dbname=llm_intelligence user=long sslmode=disable}"
|
||||
SERVER_BIN="/tmp/llm_phase6_server"
|
||||
SERVER_LOG="/tmp/llm_phase6_server.log"
|
||||
SERVER_PORT="${PHASE6_PORT:-}"
|
||||
SERVER_PID=""
|
||||
|
||||
cleanup() {
|
||||
if [ -n "${SERVER_PID:-}" ] && kill -0 "$SERVER_PID" >/dev/null 2>&1; then
|
||||
kill "$SERVER_PID" >/dev/null 2>&1 || true
|
||||
wait "$SERVER_PID" >/dev/null 2>&1 || true
|
||||
fi
|
||||
rm -f "$SERVER_BIN"
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
port_in_use() {
|
||||
local port="$1"
|
||||
(echo >"/dev/tcp/127.0.0.1/$port") >/dev/null 2>&1
|
||||
}
|
||||
|
||||
reserve_server_port() {
|
||||
if [ -n "${SERVER_PORT:-}" ]; then
|
||||
return 0
|
||||
fi
|
||||
for candidate in $(seq 18080 18120); do
|
||||
if ! port_in_use "$candidate"; then
|
||||
SERVER_PORT="$candidate"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
start_server() {
|
||||
DATABASE_URL="$DB_URL" PORT="$SERVER_PORT" "$SERVER_BIN" >"$SERVER_LOG" 2>&1 &
|
||||
SERVER_PID=$!
|
||||
for _ in $(seq 1 20); do
|
||||
if ! kill -0 "$SERVER_PID" >/dev/null 2>&1; then
|
||||
return 1
|
||||
fi
|
||||
if curl -fsS "http://127.0.0.1:${SERVER_PORT}/health" >/tmp/llm_phase6_health.out 2>/tmp/llm_phase6_health.err &&
|
||||
grep -q '"status":"ok"' /tmp/llm_phase6_health.out; then
|
||||
return 0
|
||||
fi
|
||||
sleep 0.5
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
echo "=== Phase 6 综合验收检查 ==="
|
||||
|
||||
check_shell "Phase 1~5 总门禁通过" "bash scripts/verify_pre_phase6.sh"
|
||||
check_shell "全仓 Go 测试通过" "go test ./..."
|
||||
check_shell "脚本级采集器单测通过" "bash scripts/test.sh"
|
||||
check_shell "真实采集并输出今日日报" "bash scripts/run_real_pipeline.sh"
|
||||
check_shell "API Server 可构建" "go build -o /dev/null ./cmd/server"
|
||||
check_shell "健康检查脚本通过" "DATABASE_URL='$DB_URL' bash healthcheck.sh"
|
||||
check_shell "密钥未硬编码进源码" "grep -R -n 'sk-' cmd internal frontend/src scripts .github/workflows --include='*.go' --include='*.ts' --include='*.tsx' --include='*.sh' --include='*.yml' --include='*.yaml' --exclude='verify_phase6.sh' >/tmp/llm_phase6_secret_scan.out 2>/dev/null; test ! -s /tmp/llm_phase6_secret_scan.out"
|
||||
check_shell "最近 7 次采集成功率达到 95%" "psql \"$DB_URL\" -Atqc \"select coalesce(round(avg(case when success then 100 else 0 end),2),0) from (select success from collector_stats order by created_at desc limit 7) t;\" | awk '{ exit !(\$1 >= 95) }'"
|
||||
|
||||
if go build -o "$SERVER_BIN" ./cmd/server >/tmp/llm_phase6_server_build.out 2>/tmp/llm_phase6_server_build.err; then
|
||||
if reserve_server_port && start_server; then
|
||||
pass "API /health 可用"
|
||||
|
||||
set +e
|
||||
api_metrics="$(curl -sS -o /tmp/llm_phase6_models.json -w '%{http_code} %{time_total}' "http://127.0.0.1:${SERVER_PORT}/api/v1/models")"
|
||||
api_rc=$?
|
||||
set -e
|
||||
if [ "$api_rc" -eq 0 ]; then
|
||||
api_code="$(printf '%s' "$api_metrics" | awk '{print $1}')"
|
||||
api_time="$(printf '%s' "$api_metrics" | awk '{print $2}')"
|
||||
if [ "$api_code" = "200" ]; then
|
||||
pass "API /api/v1/models 返回 200"
|
||||
else
|
||||
fail "API /api/v1/models 返回异常状态 (HTTP ${api_code:-unknown})"
|
||||
fi
|
||||
|
||||
if awk "BEGIN { exit !($api_time < 0.5) }"; then
|
||||
pass "API 响应 < 500ms (当前: ${api_time}s)"
|
||||
else
|
||||
fail "API 响应 >= 500ms (当前: ${api_time}s)"
|
||||
fi
|
||||
|
||||
if grep -q '"data"' /tmp/llm_phase6_models.json; then
|
||||
pass "API 返回模型数据载荷"
|
||||
else
|
||||
fail "API 返回体缺少 data 字段"
|
||||
fi
|
||||
else
|
||||
fail "API /api/v1/models 请求失败"
|
||||
fi
|
||||
|
||||
set +e
|
||||
plan_metrics="$(curl -sS -o /tmp/llm_phase6_subscription_plans.json -w '%{http_code} %{time_total}' "http://127.0.0.1:${SERVER_PORT}/api/v1/subscription-plans")"
|
||||
plan_rc=$?
|
||||
set -e
|
||||
if [ "$plan_rc" -eq 0 ]; then
|
||||
plan_code="$(printf '%s' "$plan_metrics" | awk '{print $1}')"
|
||||
if [ "$plan_code" = "200" ]; then
|
||||
pass "API /api/v1/subscription-plans 返回 200"
|
||||
else
|
||||
fail "API /api/v1/subscription-plans 返回异常状态 (HTTP ${plan_code:-unknown})"
|
||||
fi
|
||||
|
||||
if grep -q '"data"' /tmp/llm_phase6_subscription_plans.json; then
|
||||
pass "API 返回套餐数据载荷"
|
||||
else
|
||||
fail "套餐 API 返回体缺少 data 字段"
|
||||
fi
|
||||
else
|
||||
fail "API /api/v1/subscription-plans 请求失败"
|
||||
fi
|
||||
else
|
||||
details="$(tr '\n' ' ' <"$SERVER_LOG" | sed 's/[[:space:]]\+/ /g' | sed 's/ $//')"
|
||||
fail "API Server 启动失败 (${details:-no server log})"
|
||||
fi
|
||||
else
|
||||
details="$(tr '\n' ' ' </tmp/llm_phase6_server_build.err | sed 's/[[:space:]]\+/ /g' | sed 's/ $//')"
|
||||
fail "API Server 构建失败 (${details:-unknown build error})"
|
||||
fi
|
||||
|
||||
check_shell "Phase 6 性能文档存在" "test -f docs/PERFORMANCE_TEST.md"
|
||||
check_shell "前端已具备测试入口" "cd frontend && npm run test -- --run >/tmp/llm_phase6_frontend_test.out 2>/tmp/llm_phase6_frontend_test.err"
|
||||
|
||||
finish_phase
|
||||
Reference in New Issue
Block a user