Spaces:
Sleeping
Sleeping
| 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() | |