#!/usr/bin/env sh set -uo pipefail PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)" FAILURE_COUNT=0 FAILURE_NAMES="" run_gate() { local name="$1" shift printf '\n[%s]\n' "$name" if ! "$@"; then FAILURE_COUNT=$((FAILURE_COUNT + 1)) FAILURE_NAMES="${FAILURE_NAMES}\n- ${name}" fi } backend_tests() { if command -v java >/dev/null 2>&1 && command -v mvn >/dev/null 2>&1; then mvn -s "$PROJECT_ROOT/backend/maven-settings.xml" \ -Dmaven.repo.local="$PROJECT_ROOT/backend/local-maven" \ -f "$PROJECT_ROOT/backend/pom.xml" test elif command -v docker >/dev/null 2>&1; then docker run --rm -v "$PROJECT_ROOT:/workspace" -w /workspace/backend \ eclipse-temurin:21-jdk-alpine sh -c \ 'rm -rf /tmp/maven && mkdir -p /tmp/maven && cd /tmp/maven && jar xf /workspace/backend/maven.zip && chmod +x /tmp/maven/apache-maven-3.9.6/bin/mvn && /tmp/maven/apache-maven-3.9.6/bin/mvn -s /workspace/backend/maven-settings.xml -Dmaven.repo.local=/workspace/backend/local-maven -f /workspace/backend/pom.xml test' else printf '未找到 JDK 21 + Maven,且 Docker 不可用。\n' >&2 return 127 fi } admin_typecheck() { cd "$PROJECT_ROOT/admin-web" && npm run type-check } admin_build() { cd "$PROJECT_ROOT/admin-web" && npm run build } miniapp_typecheck() { local tsc="$PROJECT_ROOT/admin-web/node_modules/.bin/tsc" if [ ! -x "$tsc" ]; then printf '缺少 TypeScript 编译器;请先在 admin-web 执行 npm ci。\n' >&2 return 127 fi "$tsc" -p "$PROJECT_ROOT/miniapp/tsconfig.json" --noEmit } e2e_tests() { cd "$PROJECT_ROOT" && python -m pytest tests/e2e -q } printf '善缘丹阳 V1.1 — Phase 01 基线检查\n项目目录: %s\n' "$PROJECT_ROOT" run_gate 'Git repository' git -C "$PROJECT_ROOT" status --short --branch run_gate 'Backend unit tests' backend_tests run_gate 'Admin type-check' admin_typecheck run_gate 'Admin production build' admin_build run_gate 'Miniapp TypeScript' miniapp_typecheck run_gate 'V1.1 E2E collection and execution' e2e_tests printf '\n[Summary]\n' if [ "$FAILURE_COUNT" -eq 0 ]; then printf '全部 Phase 01 基线门禁通过。\n' exit 0 fi printf '失败门禁: %s\n' "$FAILURE_COUNT" printf '%b\n' "$FAILURE_NAMES" exit 1