From 6d896c781ef945517a90c9aa567d96a8d7eaff48 Mon Sep 17 00:00:00 2001 From: arkon Date: Tue, 19 May 2026 10:41:42 +0200 Subject: [PATCH] ci: add server boot smoke test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI was running typecheck + lint + format only, which let plugin registration regressions reach master — the @fastify/multipart conflict in #90 crashed the server at startup but passed CI. The boot smoke spawns the web server on a non-default port, polls /api/status for up to 30s, and dumps the log on failure (either early exit or no-ready). Catches: plugin registration conflicts, route registration errors, import cycles, and any other failure between process start and app.listen() resolving. Auto-installs tmux on the runner since createMultiplexer() throws without it (mux-factory.ts:17). ubuntu-latest already ships tmux, so the install branch is normally a no-op. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/ci.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1ff65968..e718c423 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,6 +34,32 @@ jobs: - name: Format check run: npm run format:check + - name: Server boot smoke test + run: | + set -u + if ! command -v tmux >/dev/null; then + sudo apt-get update -qq + sudo apt-get install -y tmux + fi + npx tsx src/index.ts web --port 3151 > /tmp/boot.log 2>&1 & + SERVER_PID=$! + trap "kill $SERVER_PID 2>/dev/null || true" EXIT + for i in $(seq 1 30); do + if curl -fsS http://localhost:3151/api/status -o /dev/null; then + echo "Server booted in ${i}s" + exit 0 + fi + if ! kill -0 $SERVER_PID 2>/dev/null; then + echo "Server exited before becoming ready. Logs:" + cat /tmp/boot.log + exit 1 + fi + sleep 1 + done + echo "Server did not respond on /api/status within 30s. Logs:" + cat /tmp/boot.log + exit 1 + # Note: The test suite is intentionally excluded from CI. # Tests spawn real tmux sessions and require a full system environment. # Run tests locally with: npx vitest run test/.test.ts