diff --git a/scripts/build_release.py b/scripts/build_release.py index 385748c..853ffe0 100755 --- a/scripts/build_release.py +++ b/scripts/build_release.py @@ -13,6 +13,8 @@ import subprocess import sys import tarfile import tempfile +import time +import urllib.request ROOT = Path(__file__).resolve().parents[1] OUT_ROOT = Path(os.environ.get("TIMMY_RELEASE_DIR", "/root/timmy-releases")) @@ -89,8 +91,32 @@ def main() -> int: run(["git", "checkout", "--quiet", commit], tree) run(["npm", "ci", "--ignore-scripts"], tree) run(["npm", "test"], tree) - run(["npm", "run", "test:ui"], tree) - run(["npm", "run", "test:photo"], tree) + server_env = dict(os.environ) + server_env.update({"HOST": "127.0.0.1", "PORT": "4173", "TIMMY_VISION_ENABLED": "false"}) + server_log = (release_dir / "acceptance-server.log").open("w", encoding="utf-8") + server = subprocess.Popen(["node", "server.mjs"], cwd=tree, env=server_env, + stdout=server_log, stderr=subprocess.STDOUT, text=True) + try: + for _ in range(50): + if server.poll() is not None: + raise SystemExit("Acceptance server exited before readiness") + try: + urllib.request.urlopen("http://127.0.0.1:4173/", timeout=1).read(1) + break + except Exception: + time.sleep(0.1) + else: + raise SystemExit("Acceptance server did not become ready") + run(["npm", "run", "test:ui"], tree) + run(["npm", "run", "test:photo"], tree) + finally: + server.terminate() + try: + server.wait(timeout=5) + except subprocess.TimeoutExpired: + server.kill() + server.wait(timeout=5) + server_log.close() run(["npm", "audit", "--audit-level=high"], tree) for file in ("app.js", "server.mjs", "service-worker.js", "src/analysis.js", "src/domain.js", "src/vision-config.js", "src/vision-service.js"): run(["node", "--check", file], tree)