2025-09-24 09:30:42 +09:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
# preflight.sh - 前処理・環境チェック
|
|
|
|
|
|
# テスト実行前の統一前処理システム
|
|
|
|
|
|
|
|
|
|
|
|
# set -eは使わない(個々のテストが失敗しても全体を続行するため)
|
|
|
|
|
|
set -uo pipefail
|
|
|
|
|
|
|
|
|
|
|
|
# プリフライトチェック実行
|
|
|
|
|
|
preflight_all() {
|
|
|
|
|
|
echo "[INFO] Starting preflight checks..." >&2
|
|
|
|
|
|
|
|
|
|
|
|
# 基本環境チェック
|
|
|
|
|
|
if ! preflight_basic_env; then
|
|
|
|
|
|
echo "[ERROR] Basic environment check failed" >&2
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Nyashビルド確認
|
|
|
|
|
|
if ! preflight_nyash_build; then
|
|
|
|
|
|
echo "[ERROR] Nyash build check failed" >&2
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# プラグイン整合性チェック
|
|
|
|
|
|
if ! preflight_plugins; then
|
|
|
|
|
|
echo "[ERROR] Plugin integrity check failed" >&2
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 依存関係チェック
|
|
|
|
|
|
if ! preflight_dependencies; then
|
|
|
|
|
|
echo "[ERROR] Dependency check failed" >&2
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo "[INFO] All preflight checks passed ✓" >&2
|
|
|
|
|
|
return 0
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 基本環境チェック
|
|
|
|
|
|
preflight_basic_env() {
|
|
|
|
|
|
local required_commands=("cargo" "grep" "jq" "bc" "timeout")
|
|
|
|
|
|
local missing_commands=()
|
|
|
|
|
|
|
|
|
|
|
|
for cmd in "${required_commands[@]}"; do
|
|
|
|
|
|
if ! command -v "$cmd" &> /dev/null; then
|
|
|
|
|
|
missing_commands+=("$cmd")
|
|
|
|
|
|
fi
|
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
if [ ${#missing_commands[@]} -ne 0 ]; then
|
|
|
|
|
|
echo "[ERROR] Missing required commands: ${missing_commands[*]}" >&2
|
|
|
|
|
|
echo "[INFO] Please install missing commands and try again" >&2
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# ディスク容量チェック(最低1GB)
|
|
|
|
|
|
local available_mb
|
|
|
|
|
|
available_mb=$(df . | tail -n1 | awk '{print int($4/1024)}')
|
|
|
|
|
|
if [ "$available_mb" -lt 1024 ]; then
|
|
|
|
|
|
echo "[WARN] Low disk space: ${available_mb}MB available" >&2
|
|
|
|
|
|
echo "[INFO] Recommend at least 1GB for safe operation" >&2
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo "[INFO] Basic environment: OK" >&2
|
|
|
|
|
|
return 0
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Nyashビルド確認
|
|
|
|
|
|
preflight_nyash_build() {
|
|
|
|
|
|
local nyash_exe="./target/release/nyash"
|
|
|
|
|
|
|
|
|
|
|
|
# バイナリ存在確認
|
|
|
|
|
|
if [ ! -f "$nyash_exe" ]; then
|
|
|
|
|
|
echo "[ERROR] Nyash executable not found: $nyash_exe" >&2
|
|
|
|
|
|
echo "[INFO] Run 'cargo build --release' to build Nyash" >&2
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# バイナリ実行可能性確認
|
|
|
|
|
|
if [ ! -x "$nyash_exe" ]; then
|
|
|
|
|
|
echo "[ERROR] Nyash executable is not executable: $nyash_exe" >&2
|
|
|
|
|
|
chmod +x "$nyash_exe" 2>/dev/null || true
|
|
|
|
|
|
if [ ! -x "$nyash_exe" ]; then
|
|
|
|
|
|
echo "[ERROR] Failed to make executable" >&2
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
echo "[INFO] Made Nyash executable" >&2
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 基本動作確認
|
|
|
|
|
|
if ! "$nyash_exe" --version >/dev/null 2>&1; then
|
|
|
|
|
|
echo "[ERROR] Nyash version check failed" >&2
|
|
|
|
|
|
echo "[INFO] Binary may be corrupted, try rebuilding" >&2
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# バックエンド対応状況確認
|
|
|
|
|
|
local version_output
|
|
|
|
|
|
version_output=$("$nyash_exe" --version 2>&1)
|
|
|
|
|
|
|
|
|
|
|
|
if echo "$version_output" | grep -q "features.*llvm"; then
|
|
|
|
|
|
echo "[INFO] LLVM backend: Available" >&2
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "[WARN] LLVM backend: Not available in this build" >&2
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if echo "$version_output" | grep -q "features.*cranelift"; then
|
|
|
|
|
|
echo "[INFO] Cranelift JIT: Available" >&2
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "[WARN] Cranelift JIT: Not available in this build" >&2
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo "[INFO] Nyash build: OK" >&2
|
|
|
|
|
|
return 0
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# プラグイン整合性チェック
|
|
|
|
|
|
preflight_plugins() {
|
|
|
|
|
|
# plugin_manager.shから関数をインポート
|
|
|
|
|
|
local plugin_manager_path
|
|
|
|
|
|
plugin_manager_path="$(dirname "${BASH_SOURCE[0]}")/plugin_manager.sh"
|
|
|
|
|
|
|
|
|
|
|
|
if [ ! -f "$plugin_manager_path" ]; then
|
|
|
|
|
|
echo "[ERROR] Plugin manager not found: $plugin_manager_path" >&2
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
source "$plugin_manager_path"
|
|
|
|
|
|
|
|
|
|
|
|
# プラグイン整合性チェック実行
|
|
|
|
|
|
if ! check_plugin_integrity; then
|
|
|
|
|
|
echo "[ERROR] Plugin integrity check failed" >&2
|
|
|
|
|
|
echo "[INFO] Try rebuilding plugins with: tools/plugin-tester/target/release/plugin-tester build-all" >&2
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2025-09-26 00:27:02 +09:00
|
|
|
|
# Provider Verify(段階導入): nyash.toml の [verify.required_methods] / [types.*.required_methods]
|
|
|
|
|
|
# 既定 warn。SMOKES_PROVIDER_VERIFY_MODE=strict でエラー化。
|
|
|
|
|
|
local verify_mode="${SMOKES_PROVIDER_VERIFY_MODE:-warn}"
|
|
|
|
|
|
if [ -f "./target/release/nyash" ]; then
|
|
|
|
|
|
local tmp_preflight
|
|
|
|
|
|
tmp_preflight="/tmp/nyash_preflight_empty_$$.ny"
|
|
|
|
|
|
echo "/* preflight */" > "$tmp_preflight"
|
|
|
|
|
|
if NYASH_PROVIDER_VERIFY="$verify_mode" ./target/release/nyash "$tmp_preflight" >/dev/null 2>&1; then
|
|
|
|
|
|
echo "[INFO] Provider verify ($verify_mode): OK" >&2
|
|
|
|
|
|
else
|
|
|
|
|
|
if [ "$verify_mode" = "strict" ]; then
|
|
|
|
|
|
echo "[ERROR] Provider verify failed (strict)" >&2
|
|
|
|
|
|
rm -f "$tmp_preflight" 2>/dev/null || true
|
|
|
|
|
|
return 1
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "[WARN] Provider verify reported issues (mode=$verify_mode)" >&2
|
|
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
rm -f "$tmp_preflight" 2>/dev/null || true
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2025-09-24 09:30:42 +09:00
|
|
|
|
echo "[INFO] Plugin integrity: OK" >&2
|
|
|
|
|
|
return 0
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 依存関係チェック
|
|
|
|
|
|
preflight_dependencies() {
|
|
|
|
|
|
# Python LLVM関連チェック(オプション)
|
|
|
|
|
|
if [ -f "src/llvm_py/llvm_builder.py" ]; then
|
|
|
|
|
|
if command -v python3 &> /dev/null; then
|
|
|
|
|
|
if python3 -c "import llvmlite" 2>/dev/null; then
|
|
|
|
|
|
echo "[INFO] Python LLVM: Available" >&2
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "[WARN] Python LLVM: llvmlite not installed" >&2
|
|
|
|
|
|
echo "[INFO] Install with: pip install llvmlite" >&2
|
|
|
|
|
|
fi
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "[WARN] Python LLVM: python3 not available" >&2
|
|
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# プラグインテスター確認(オプション)
|
|
|
|
|
|
local plugin_tester="tools/plugin-tester/target/release/plugin-tester"
|
|
|
|
|
|
if [ -f "$plugin_tester" ]; then
|
|
|
|
|
|
echo "[INFO] Plugin tester: Available" >&2
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "[WARN] Plugin tester: Not built" >&2
|
|
|
|
|
|
echo "[INFO] Build with: cd tools/plugin-tester && cargo build --release" >&2
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Git確認(オプション)
|
|
|
|
|
|
if command -v git &> /dev/null && [ -d ".git" ]; then
|
|
|
|
|
|
local git_status
|
|
|
|
|
|
if git_status=$(git status --porcelain 2>/dev/null) && [ -n "$git_status" ]; then
|
|
|
|
|
|
echo "[WARN] Git: Working directory has uncommitted changes" >&2
|
|
|
|
|
|
echo "[INFO] Consider committing changes before running tests" >&2
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "[INFO] Git: Working directory clean" >&2
|
|
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo "[INFO] Dependencies: OK" >&2
|
|
|
|
|
|
return 0
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 環境情報出力
|
|
|
|
|
|
show_environment_info() {
|
|
|
|
|
|
cat << 'EOF'
|
|
|
|
|
|
===============================================
|
|
|
|
|
|
Environment Information
|
|
|
|
|
|
===============================================
|
|
|
|
|
|
EOF
|
|
|
|
|
|
|
|
|
|
|
|
echo "System: $(uname -a)"
|
|
|
|
|
|
echo "Working Directory: $(pwd)"
|
|
|
|
|
|
echo "Date: $(date)"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# Cargo情報
|
|
|
|
|
|
if command -v cargo &> /dev/null; then
|
|
|
|
|
|
echo "Cargo: $(cargo --version)"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Rust情報
|
|
|
|
|
|
if command -v rustc &> /dev/null; then
|
|
|
|
|
|
echo "Rust: $(rustc --version)"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Python情報
|
|
|
|
|
|
if command -v python3 &> /dev/null; then
|
|
|
|
|
|
echo "Python: $(python3 --version)"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# Nyash情報
|
|
|
|
|
|
if [ -f "./target/release/nyash" ]; then
|
|
|
|
|
|
echo "Nyash: $(./target/release/nyash --version 2>&1 | head -n1)"
|
|
|
|
|
|
echo "Features: $(./target/release/nyash --version 2>&1 | grep features || echo 'default')"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "==============================================="
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# プリフライト修復
|
|
|
|
|
|
preflight_repair() {
|
|
|
|
|
|
echo "[INFO] Attempting automatic repairs..." >&2
|
|
|
|
|
|
|
|
|
|
|
|
# Nyashバイナリの実行権限修復
|
|
|
|
|
|
if [ -f "./target/release/nyash" ] && [ ! -x "./target/release/nyash" ]; then
|
|
|
|
|
|
chmod +x "./target/release/nyash" 2>/dev/null || true
|
|
|
|
|
|
echo "[INFO] Fixed Nyash executable permissions" >&2
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# プラグイン再ビルド(オプション)
|
|
|
|
|
|
if [ "${PREFLIGHT_REBUILD_PLUGINS:-0}" = "1" ]; then
|
|
|
|
|
|
local plugin_tester="tools/plugin-tester/target/release/plugin-tester"
|
|
|
|
|
|
if [ -f "$plugin_tester" ]; then
|
|
|
|
|
|
echo "[INFO] Rebuilding plugins..." >&2
|
|
|
|
|
|
if "$plugin_tester" build-all 2>/dev/null; then
|
|
|
|
|
|
echo "[INFO] Plugin rebuild completed" >&2
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "[WARN] Plugin rebuild failed" >&2
|
|
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo "[INFO] Repair attempts completed" >&2
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 使用例とヘルプ
|
|
|
|
|
|
show_preflight_help() {
|
|
|
|
|
|
cat << 'EOF'
|
|
|
|
|
|
Preflight Checker for Smoke Tests v2
|
|
|
|
|
|
|
|
|
|
|
|
Usage:
|
|
|
|
|
|
source lib/preflight.sh
|
|
|
|
|
|
|
|
|
|
|
|
Functions:
|
|
|
|
|
|
preflight_all - Run all preflight checks
|
|
|
|
|
|
preflight_basic_env - Check basic environment
|
|
|
|
|
|
preflight_nyash_build - Check Nyash build
|
|
|
|
|
|
preflight_plugins - Check plugin integrity
|
|
|
|
|
|
preflight_dependencies - Check optional dependencies
|
|
|
|
|
|
show_environment_info - Display environment info
|
|
|
|
|
|
preflight_repair - Attempt automatic repairs
|
|
|
|
|
|
|
|
|
|
|
|
Environment Variables:
|
|
|
|
|
|
PREFLIGHT_REBUILD_PLUGINS=1 - Auto-rebuild plugins during repair
|
|
|
|
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
# Full preflight check
|
|
|
|
|
|
source lib/preflight.sh && preflight_all
|
|
|
|
|
|
|
|
|
|
|
|
# Show environment info
|
|
|
|
|
|
source lib/preflight.sh && show_environment_info
|
|
|
|
|
|
|
|
|
|
|
|
# Repair with plugin rebuild
|
|
|
|
|
|
PREFLIGHT_REBUILD_PLUGINS=1 source lib/preflight.sh && preflight_repair
|
|
|
|
|
|
EOF
|
2025-09-26 00:27:02 +09:00
|
|
|
|
}
|