#!/usr/bin/env bash # 部署冒烟:每项打 ✅/❌,最后汇总。只读检查,不改任何状态(最后的 dm-agent 会留一条审计——预期行为)。 # 在仓库根目录运行:bash deploy/smoke.sh cd "$(dirname "$0")/.." [ -f .env ] && set -a && . ./.env && set +a COMPOSE="docker compose -f deploy/docker-compose.yml" WH_DB="${DM_WH_DB:-dm}" DW_SCHEMA="${DM_DW_SCHEMA:-dm_dw}" PORT_FLINK="${DM_PORT_FLINK:-8081}" PORT_APP="${DM_PORT_APP:-8501}" PORT_DAGSTER="${DM_PORT_DAGSTER:-3070}" PORT_NEO4J_BOLT="${DM_PORT_NEO4J_BOLT:-7687}" PASS=0; FAIL=0 ck() { # ck <名称> <命令...> local name="$1"; shift if "$@" >/dev/null 2>&1; then echo "✅ $name"; PASS=$((PASS+1)); else echo "❌ $name"; FAIL=$((FAIL+1)); fi } sr() { $COMPOSE exec -T starrocks mysql -h127.0.0.1 -P9030 -uroot -N -e "$1" 2>/dev/null; } echo "===== smoke =====" ck "StarRocks SELECT 1" $COMPOSE exec -T starrocks mysql -h127.0.0.1 -P9030 -uroot -e "SELECT 1" N19=$(sr "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$WH_DB' AND table_name NOT LIKE 'raw_u8__%'" | tr -d '[:space:]') [ "${N19:-0}" -ge 19 ] && { echo "✅ 业务表数量 $N19 (>=19)"; PASS=$((PASS+1)); } || { echo "❌ 业务表数量 ${N19:-0} (<19)"; FAIL=$((FAIL+1)); } NROWS=$(sr "SELECT COUNT(*) FROM $WH_DB.material" | tr -d '[:space:]') [ "${NROWS:-0}" -gt 0 ] && { echo "✅ material 行数 $NROWS"; PASS=$((PASS+1)); } || { echo "❌ material 空"; FAIL=$((FAIL+1)); } NADS=$(sr "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$DW_SCHEMA' AND table_name LIKE 'ads_%'" | tr -d '[:space:]') [ "${NADS:-0}" -ge 3 ] && { echo "✅ ADS 宽表数 $NADS"; PASS=$((PASS+1)); } || { echo "❌ ADS 宽表数 ${NADS:-0} (<3)"; FAIL=$((FAIL+1)); } RUNNING=$(curl -s "http://127.0.0.1:$PORT_FLINK/jobs/overview" | python3 -c "import sys,json;print(sum(1 for j in json.load(sys.stdin).get('jobs',[]) if j['state']=='RUNNING'))" 2>/dev/null || echo 0) [ "${RUNNING:-0}" -ge 1 ] && { echo "✅ Flink RUNNING 作业 $RUNNING"; PASS=$((PASS+1)); } || { echo "❌ Flink 无 RUNNING 作业"; FAIL=$((FAIL+1)); } ck "Neo4j bolt 端口" bash -c "/dev/null | grep -q sim-u8; then ck "仿真 U8 TDS 可达" bash -c "/dev/null 2>&1 && return 0; sleep 10; done; return 1; } ck "Dagster $PORT_DAGSTER" dagster_up AUD_BEFORE=$(wc -l < ./data/logs/audit_log.jsonl 2>/dev/null || echo 0) if $COMPOSE run --rm --no-deps dm-cli dm-agent "物料 M0001 现在总库存多少?" 2>/dev/null | grep -q "12"; then echo "✅ 智能体 E2E(M0001=12)"; PASS=$((PASS+1)) else echo "❌ 智能体 E2E"; FAIL=$((FAIL+1)) fi AUD_AFTER=$(wc -l < ./data/logs/audit_log.jsonl 2>/dev/null || echo 0) [ "${AUD_AFTER:-0}" -gt "${AUD_BEFORE:-0}" ] && { echo "✅ 审计新增 $((AUD_AFTER-AUD_BEFORE)) 条"; PASS=$((PASS+1)); } || { echo "❌ 审计未新增"; FAIL=$((FAIL+1)); } echo "===== smoke 结果:$PASS 过 / $FAIL 挂 =====" exit $([ "$FAIL" -eq 0 ] && echo 0 || echo 1)