Files
Brancheneinstufung2/scripts/validate_deployment.py

89 lines
3.0 KiB
Python

import os
import sys
def check_path(path, description, context_dir="."):
# Cleanup path string
path = path.strip().strip('"').strip("'")
# Ignore internal docker volumes or absolute paths that might be inside container
if not path.startswith("./") and not path.startswith("/") and not path.startswith(".."):
# Assume named volume or config setting
return True
# Split host:container mapping
host_path_raw = path.split(":")[0]
# Resolve relative paths relative to CWD
if host_path_raw.startswith("./"):
host_path = os.path.join(os.getcwd(), host_path_raw[2:])
elif host_path_raw.startswith("../"):
host_path = os.path.abspath(host_path_raw)
else:
host_path = host_path_raw
if os.path.exists(host_path):
print(f"✅ FOUND: {description} -> {host_path_raw}")
return True
else:
print(f"❌ MISSING: {description} -> {host_path_raw}")
return False
def validate_compose_text():
print("--- 🚀 Starting Pre-Flight Check (Text-Based) ---")
if not os.path.exists("docker-compose.yml"):
print("❌ CRITICAL: docker-compose.yml not found!")
return
with open("docker-compose.yml", "r") as f:
lines = f.readlines()
current_service = "Unknown"
all_valid = True
in_volumes = False
for line in lines:
line = line.rstrip()
clean_line = line.strip()
# Detect Service Block (heuristic)
if line.startswith(" ") and not line.startswith(" ") and ":" in line and not clean_line.startswith("#"):
current_service = clean_line.replace(":", "")
print(f"\nScanning Service: [{current_service}]")
in_volumes = False
continue
# Check Context
if "context:" in clean_line:
path = clean_line.split("context:")[1].strip()
if not check_path(path, f"Build Context ({current_service})"):
all_valid = False
# Check Env File
if clean_line.startswith("- .env"):
if not check_path(".env", f"Env File ({current_service})"):
all_valid = False
# Check Volumes Block Start
if clean_line.startswith("volumes:"):
in_volumes = True
continue
# Check Volume Entries
if in_volumes and clean_line.startswith("-") and ":" in clean_line:
# Simple heuristic to stop reading volumes if indentation changes or new block starts
if not line.startswith(" -"):
in_volumes = False
else:
vol_path = clean_line[1:].strip() # Remove dash
if not check_path(vol_path, f"Volume ({current_service})"):
all_valid = False
print("\n--- 🏁 Result ---")
if all_valid:
print("✅ READY FOR TAKEOFF: All referenced files and directories exist.")
else:
print("❌ ABORT: Missing files detected. Migration would fail.")
if __name__ == "__main__":
validate_compose_text()