#!/bin/bash # ============================================================ # OpenDance Studio —— Windows 客户端一键验证 # # 依次执行:脚本编译检查 → 无头单元/集成测试 → 应用启动检查 # 任一环节失败即退出非 0。 # # 用法:GODOT_BIN=/path/to/godot bash build/verify.sh # ============================================================ set -uo pipefail PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" cd "$PROJECT_DIR" GODOT_BIN="${GODOT_BIN:-}" if [ -z "$GODOT_BIN" ]; then for candidate in godot godot4 Godot; do if command -v "$candidate" >/dev/null 2>&1; then GODOT_BIN="$candidate"; break; fi done fi if [ -z "$GODOT_BIN" ]; then echo "错误:未找到 Godot。请用 GODOT_BIN=<路径> 指定。" >&2 exit 1 fi FAILED=0 echo "============================================================" echo " 0/5 版本号一致性(project.godot / project.yaml / export_presets.cfg)" echo "============================================================" if bash "$PROJECT_DIR/build/check-version.sh"; then : else echo "✗ 版本一致性校验失败" FAILED=1 fi echo "" echo "============================================================" echo " 1/5 产物 PE 版本资源(Windows 属性页显示的版本)" echo "============================================================" EXPORTED_EXE="$PROJECT_DIR/build/windows/OpenDance.exe" EXPECTED_VERSION="$(sed -n 's/^config\/version="\(.*\)"$/\1/p' "$PROJECT_DIR/project.godot" | head -1)" if [ -f "$EXPORTED_EXE" ]; then if bash "$PROJECT_DIR/build/check-pe-version.sh" "$EXPORTED_EXE" "$EXPECTED_VERSION"; then : else echo "✗ 已导出 exe 的 PE 版本资源与 v$EXPECTED_VERSION 不一致(属性页会显示错版本)" FAILED=1 fi else echo "· 尚未导出 build/windows/OpenDance.exe,跳过(打包时 package-release.sh 会强制校验)" fi echo "" echo "============================================================" echo " 2/5 脚本编译检查" echo "============================================================" IMPORT_LOG=$(mktemp) "$GODOT_BIN" --headless --path "$PROJECT_DIR" --import >"$IMPORT_LOG" 2>&1 if grep -qE "SCRIPT ERROR|Parse Error|Compile Error" "$IMPORT_LOG"; then echo "✗ 存在脚本编译错误:" grep -E "SCRIPT ERROR|Parse Error|Compile Error" "$IMPORT_LOG" | head -20 FAILED=1 else echo "✓ 全部脚本编译通过" fi rm -f "$IMPORT_LOG" echo "" echo "============================================================" echo " 3/5 无头测试(单元 + 真实 API 集成)" echo "============================================================" TEST_LOG=$(mktemp) "$GODOT_BIN" --headless --path "$PROJECT_DIR" --script res://tests/run_tests.gd >"$TEST_LOG" 2>&1 TEST_STATUS=$? grep -E "^(== 结果|全部通过)" "$TEST_LOG" || true if [ "$TEST_STATUS" -ne 0 ]; then echo "✗ 测试失败(退出码 $TEST_STATUS)" grep -E "✗" "$TEST_LOG" | head -20 FAILED=1 else echo "✓ 测试全部通过" fi rm -f "$TEST_LOG" echo "" echo "============================================================" echo " 4/5 应用启动检查(180 帧)" echo "============================================================" RUN_LOG=$(mktemp) timeout 120 "$GODOT_BIN" --headless --path "$PROJECT_DIR" --quit-after 180 >"$RUN_LOG" 2>&1 RUN_STATUS=$? if [ "$RUN_STATUS" -ne 0 ]; then echo "✗ 启动失败(退出码 $RUN_STATUS)" tail -20 "$RUN_LOG" FAILED=1 elif grep -qE "SCRIPT ERROR|ERROR:" "$RUN_LOG"; then echo "✗ 启动过程有错误:" grep -E "SCRIPT ERROR|ERROR:" "$RUN_LOG" | head -10 FAILED=1 else echo "✓ 应用启动正常,无运行时错误" fi rm -f "$RUN_LOG" echo "" if [ "$FAILED" -ne 0 ]; then echo "============================================================" echo " 验证失败" echo "============================================================" exit 1 fi echo "============================================================" echo " 验证全部通过" echo "============================================================"