Files
pangolin/scripts/e2e-smoke.sh
T
wangjia b3cbeef7cf test(e2e): 第5刀a L4 进程级冒烟编排 + HTTP 段
真起 server 二进制(sqlite + Redis)跑 HTTP 用户旅程,验证 in-process 测试给不了的
信心(二进制起/迁移/路由/鉴权/DB 端到端):
- scripts/e2e-smoke.sh:起栈编排(Redis 三选一:已有 addr / docker / 内嵌 miniredis
  兜底)+ 随机端口 + trap 清理;调 Go driver
- server/test/e2e/smoke_test.go (tag e2e):造用户(复用 argon2 HashPassword)
  → 登录 → /v1/me(dp_uuid/plan/email) → /v1/usage 鉴权 + 无 token 401
- server/test/e2e/miniredis (tag e2e):无 docker 时 Redis 兜底 launcher
- 本地绿;go build/test ./...(无 tag)仍 25 包绿,tag e2e 文件被静默跳过

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 06:59:39 +08:00

110 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# e2e-smoke.sh — L4 后端进程级端到端冒烟。
#
# 真起打包好的 server 二进制(sqlite 临时库 + Redis),跑一条真 HTTP/gRPC over TCP/TLS
# 的用户旅程,验证 in-process 测试给不了的信心:二进制能起、迁移能跑、路由/鉴权/DB
# 端到端通、用量真入库真从 API 读出。
#
# 用法: bash scripts/e2e-smoke.sh
# 依赖: go · openssl · python3(取随机端口) · curl
# Redis 三选一:E2E_REDIS_ADDR(已有) > docker(redis:7-alpine) > 内嵌 miniredis
#
# 阶段: 5a = HTTP 段(登录→/v1/me→/v1/usage);5b 起 gRPC 全链路(enroll+ReportUsage)。
# 全部断言在 Go driver: server/test/e2e/smoke_test.go(build tag e2e)。
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
TMP="$(mktemp -d)"
REDIS_CID=""
MR_PID=""
SERVER_PID=""
REDIS_ADDR_RESOLVED=""
cleanup() {
if [ -n "$SERVER_PID" ]; then kill "$SERVER_PID" 2>/dev/null || true; wait "$SERVER_PID" 2>/dev/null || true; fi
if [ -n "$MR_PID" ]; then kill "$MR_PID" 2>/dev/null || true; wait "$MR_PID" 2>/dev/null || true; fi
pkill -f 'test/e2e/miniredis' 2>/dev/null || true
[ -n "$REDIS_CID" ] && docker rm -f "$REDIS_CID" >/dev/null 2>&1 || true
rm -rf "$TMP"
}
trap cleanup EXIT
rand_port() {
python3 -c 'import socket;s=socket.socket();s.bind(("",0));print(s.getsockname()[1]);s.close()'
}
# start_redis — 按优先级落一个真 TCP Redis,地址写入 REDIS_ADDR_RESOLVED。
start_redis() {
if [ -n "${E2E_REDIS_ADDR:-}" ]; then
REDIS_ADDR_RESOLVED="$E2E_REDIS_ADDR"
echo "[e2e] 用已有 Redis $REDIS_ADDR_RESOLVED"
return
fi
if docker info >/dev/null 2>&1; then
local p; p="$(rand_port)"
REDIS_CID="$(docker run -d -p "$p:6379" redis:7-alpine)"
REDIS_ADDR_RESOLVED="127.0.0.1:$p"
echo "[e2e] docker Redis $REDIS_ADDR_RESOLVED"
return
fi
echo "[e2e] 无 docker,用内嵌 miniredis 兜底 ..."
( cd server && go run -tags e2e ./test/e2e/miniredis ) > "$TMP/mr.addr" 2>"$TMP/mr.log" &
MR_PID=$!
for _ in $(seq 1 120); do [ -s "$TMP/mr.addr" ] && break; sleep 0.25; done
REDIS_ADDR_RESOLVED="$(head -1 "$TMP/mr.addr" 2>/dev/null || true)"
[ -n "$REDIS_ADDR_RESOLVED" ] || { echo "[e2e] ✗ miniredis 起失败:" >&2; cat "$TMP/mr.log" >&2; exit 1; }
echo "[e2e] miniredis Redis $REDIS_ADDR_RESOLVED"
}
HTTP_PORT="$(rand_port)"
start_redis
echo "[e2e] 生成 JWT 密钥 ..."
openssl genrsa -out "$TMP/jwt_private.pem" 2048 2>/dev/null
openssl rsa -in "$TMP/jwt_private.pem" -pubout -out "$TMP/jwt_public.pem" 2>/dev/null
echo "[e2e] go build server + migrate ..."
( cd server && go build -o "$TMP/server" ./cmd/server && go build -o "$TMP/migrate" ./cmd/migrate )
DB_FILE="$TMP/e2e.db"
echo "[e2e] migrate(sqlite) ..."
DB_DRIVER=sqlite DB_DSN="$DB_FILE" "$TMP/migrate" up
echo "[e2e] 起 server :$HTTP_PORT ..."
DB_DRIVER=sqlite DB_DSN="$DB_FILE" \
REDIS_ADDR="$REDIS_ADDR_RESOLVED" \
ADDR=":$HTTP_PORT" \
JWT_PRIVATE_KEY_PATH="$TMP/jwt_private.pem" \
JWT_KEY_ID="e2e-key-1" \
JWT_PUBLIC_KEYS="e2e-key-1:$TMP/jwt_public.pem" \
WEBHOOK_SECRET="e2e-webhook-secret-000000000000000000" \
NODE_DERIVE_KEY="e2e-derive-key-0000000000000000000000" \
"$TMP/server" > "$TMP/server.log" 2>&1 &
SERVER_PID=$!
echo "[e2e] 等待 /healthz ..."
ok=0
for _ in $(seq 1 40); do
if curl -fsS "http://127.0.0.1:$HTTP_PORT/healthz" >/dev/null 2>&1; then ok=1; break; fi
if ! kill -0 "$SERVER_PID" 2>/dev/null; then
echo "[e2e] ✗ server 启动即退出,日志:" >&2; cat "$TMP/server.log" >&2; exit 1
fi
sleep 0.5
done
[ "$ok" = 1 ] || { echo "[e2e] ✗ /healthz 超时,日志:" >&2; cat "$TMP/server.log" >&2; exit 1; }
echo "[e2e] 控制面健康。"
echo "[e2e] 跑 Go driver ..."
(
cd server
E2E_HTTP="http://127.0.0.1:$HTTP_PORT" \
E2E_DB_DSN="$DB_FILE" \
E2E_SERVER_LOG="$TMP/server.log" \
DB_DRIVER=sqlite \
go test -tags e2e ./test/e2e -run TestE2ESmoke -count=1 -v
)
echo "[e2e] ✓ PASS — 进程级端到端冒烟通过"