You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Every leg here covers something that could previously fail only in a user's
hands, ordered by the blind spot it closes.
The test databases were all in-memory, and in-memory SQLite pins its pool to
one connection - so the entire class of multi-connection failures a real
deployment can hit was invisible to every test run; it is exactly how a bug
that dropped completed measurements passed the whole suite. An environment
switch now redirects the test databases to real files, and CI reruns the
database-heavy packages that way against the daemon's real four-connection
pool. The hardware this daemon most often runs on - Raspberry Pi class ARM
Linux - was built in CI but never executed there; the native test job now
includes an ARM Linux runner running the full suite and boot smoke.
The deep-test workflow - the real service lifecycle on Windows, macOS and
Linux - only ran when someone remembered to dispatch it; it now also runs
every Saturday. The release binaries users actually download were never
executed before publish: a new job builds the snapshot artifacts with the
release's own pinned goreleaser, asserts the version stamp landed, boots the
Linux binary, then installs the deb the way a Debian user does - service
account created, unit auto-started, daemon provably de-rooted with only the
raw-socket capability - and removes it cleanly; the rpm installs and runs in
a Rocky Linux container. A downgrade gate makes the previous released binary
open a database created by the current commit, so a user who upgrades, hits
trouble, and steps back is not stranded - the existing migration tests only
ever looked forward.
A weekly canary runs the full suite and the fleet probe against the NEXT Go
release while it is still a candidate, so the next toolchain upgrade's
evidence accumulates during the rc window instead of compressing into a
deadline after security support has already lapsed. A weekly race-stress leg
runs the race detector five times over the concurrency-heavy packages and
again against real database files - two real races this month were
one-in-many events a single pass cannot reliably catch. A weekly fuzz run
finally gives real mutation time to the parsers that eat input this daemon
does not control: the existing RDNS and ASN targets, plus new targets for
the iperf3 server address an operator types, the JSON another program
(iperf3) prints - injected through the same exec seam production output
arrives through - and the sealed-passwords value that arrives in imported
backups.
And a browser smoke closes the one gap the frontend suite structurally
cannot: it proves the page's functions, but nothing proved the page PAINTS.
A real Chromium now loads the dashboard from a live daemon and asserts the
floor - panels and chart render, no console errors, no failed requests -
with deliberately coarse anchors, because fine-grained selectors rot into
flakes.
Co-Authored-By: Claude <noreply@anthropic.com>
./new_pingularity run -listen 127.0.0.1:9107 -db "$RUNNER_TEMP/downgrade.db" &
355
+
pid=$!
356
+
ok=
357
+
for i in $(seq 1 30); do
358
+
if curl -fsS http://127.0.0.1:9107/healthz >/dev/null 2>&1; then ok=1; break; fi
359
+
sleep 1
360
+
done
361
+
kill "$pid" 2>/dev/null || true
362
+
[ -n "$ok" ] || { echo "current build failed to create its own database"; exit 1; }
363
+
364
+
- name: previous release opens it
365
+
env:
366
+
GH_TOKEN: ${{ github.token }}
367
+
run: |
368
+
if ! gh release download --pattern '*linux_amd64.tar.gz' -D prev; then
369
+
echo "no prior release to test against - skipping"
370
+
exit 0
371
+
fi
372
+
tar xzf prev/*.tar.gz -C prev
373
+
./prev/pingularity version
374
+
./prev/pingularity run -listen 127.0.0.1:9108 -db "$RUNNER_TEMP/downgrade.db" > old.log 2>&1 &
375
+
pid=$!
376
+
ok=
377
+
for i in $(seq 1 30); do
378
+
if curl -fsS http://127.0.0.1:9108/healthz >/dev/null 2>&1; then ok=1; break; fi
379
+
sleep 1
380
+
done
381
+
kill "$pid" 2>/dev/null || true
382
+
[ -n "$ok" ] || { echo "the PREVIOUS release cannot open a database this commit creates - a user who downgrades is stranded"; tail -30 old.log; exit 1; }
383
+
if grep -ciE 'panic' old.log >/dev/null 2>&1 && [ "$(grep -ciE 'panic' old.log)" -gt 0 ]; then
384
+
echo "previous release panicked on the new schema:"; tail -30 old.log; exit 1
385
+
fi
386
+
echo "downgrade OK: previous release serves healthz on the new schema"
387
+
188
388
# Image gate: builds BOTH Dockerfiles from the exact context layout goreleaser
189
389
# stages (linux/<arch>/pingularity, COPY'd via $TARGETPLATFORM) and proves the
190
390
# three properties a broken image would otherwise first show in a user's
0 commit comments