David Prince
production: clean source snapshot — no history bloat
71b4454
Raw
History Blame Contribute Delete
3.03 kB
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()