import asyncio import os import uuid from typing import Dict, Any, Optional class BuildQueueManager: def __init__(self): self._builds: Dict[str, Dict[str, Any]] = {} def get_build_status(self, build_id: str) -> Optional[Dict[str, Any]]: return self._builds.get(build_id) async def _execute_build_script(self, build_id: str, script_name: str, project_dir: str): script_path = os.path.join("scripts", script_name) if not os.path.exists(script_path): self._builds[build_id]["status"] = "failed" self._builds[build_id]["error"] = f"Script {script_name} not found" return try: proc = await asyncio.create_subprocess_exec( script_path, build_id, project_dir, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE ) try: stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=60.0) except asyncio.TimeoutError: proc.kill() self._builds[build_id]["status"] = "failed" self._builds[build_id]["error"] = "Build timed out after 60 seconds" return if proc.returncode == 0: self._builds[build_id]["status"] = "success" self._builds[build_id]["stdout"] = stdout.decode(errors="ignore") else: self._builds[build_id]["status"] = "failed" self._builds[build_id]["stdout"] = stdout.decode(errors="ignore") self._builds[build_id]["stderr"] = stderr.decode(errors="ignore") self._builds[build_id]["error"] = ( stderr.decode(errors="ignore") or stdout.decode(errors="ignore") or "Build script failed" ) except Exception as e: self._builds[build_id]["status"] = "failed" self._builds[build_id]["error"] = str(e) self._builds[build_id]["status"] = "failed" self._builds[build_id]["error"] = str(e) def trigger_build(self, target: str, project_dir: str = ".") -> str: build_id = f"bld_{uuid.uuid4().hex[:8]}" self._builds[build_id] = { "build_id": build_id, "target": target, "status": "queued", "project_dir": project_dir } script_map = { "apk": "build_apk.sh", "static": "build_static.sh", "docker": "build_docker.sh" } script_name = script_map.get(target) if not script_name: self._builds[build_id]["status"] = "failed" self._builds[build_id]["error"] = f"Unknown target: {target}" return build_id self._builds[build_id]["status"] = "building" asyncio.create_task(self._execute_build_script(build_id, script_name, project_dir)) return build_id build_queue = BuildQueueManager()