Files
hakorune/tools/smokes/v2/lib/preflight.sh

300 lines
9.2 KiB
Bash
Raw Normal View History

#!/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
# 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
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
}