CI v2-integration: hosted runner never reaches tests — TIMEOUT waiting for questdb (fixture network reachability) #860

Closed
opened 2026-11-11 10:09:37 -05:00 by dohertj2 · 3 comments
Owner

Hosted v2-integration.yml has never reached its test step. Both nightly runs on record fail in start throwaway fixtures:

  • run 1137 (2026-11-10 02:44Z): TIMEOUT waiting for questdb
  • run 1213 (2026-11-11 02:44Z, master b36e688f): ready: postgres, ready: postgres query, seeded: postgres, ready: sql server, then TIMEOUT waiting for questdb after 120 s

so assert not-all-skipped then fails with trx not found.

Probably not QuestDB-specific (hypothesis, not verified on the runner). Postgres and SQL Server readiness both go through docker exec. The QuestDB wait is the first network probe: curl http://$(fixture_host):$QDB_HTTP_PORT/..., where fixture_host (scripts/ci/integration-fixtures.sh) is the job container's default-gateway IP (ip route) when /.dockerenv exists, else 127.0.0.1. If the act_runner job container can't reach host-published ports through that gateway (separate job network, host firewall, or no ip binary so it falls back to 127.0.0.1), every later network wait (opc-plc, opc-plc NAT) and every test endpoint would fail the same way.

Next step: in a dispatched run, print fixture_host, command -v ip, ip route, docker network ls, and the job container's networks; try curl against the QuestDB container IP (docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}') and against the gateway. Possible fixes: attach the fixture containers to the job container's network and address them by name, or set FIXTURE_HOST explicitly.

Blocks #818's floor raise: MIN_EXECUTED 440 → 448 (v2-integration.yml) waits on a hosted TRX showing Driver.OpcUaClient.trx executed=9 and Driver.OpcUaClient.Browser.trx executed=12. Locally, with the same CI filter and the CI-style throwaway NAT container plus its exported cert, those counts are 9 and 12 with 0 skipped (2026-11-11).

Hosted `v2-integration.yml` has never reached its test step. Both nightly runs on record fail in `start throwaway fixtures`: - run 1137 (2026-11-10 02:44Z): `TIMEOUT waiting for questdb` - run 1213 (2026-11-11 02:44Z, master `b36e688f`): `ready: postgres`, `ready: postgres query`, `seeded: postgres`, `ready: sql server`, then `TIMEOUT waiting for questdb` after 120 s so `assert not-all-skipped` then fails with `trx not found`. **Probably not QuestDB-specific (hypothesis, not verified on the runner).** Postgres and SQL Server readiness both go through `docker exec`. The QuestDB wait is the **first network probe**: `curl http://$(fixture_host):$QDB_HTTP_PORT/...`, where `fixture_host` (`scripts/ci/integration-fixtures.sh`) is the job container's default-gateway IP (`ip route`) when `/.dockerenv` exists, else 127.0.0.1. If the act_runner job container can't reach host-published ports through that gateway (separate job network, host firewall, or no `ip` binary so it falls back to 127.0.0.1), every later network wait (opc-plc, opc-plc NAT) and every test endpoint would fail the same way. Next step: in a dispatched run, print `fixture_host`, `command -v ip`, `ip route`, `docker network ls`, and the job container's networks; try `curl` against the QuestDB container IP (`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'`) and against the gateway. Possible fixes: attach the fixture containers to the job container's network and address them by name, or set `FIXTURE_HOST` explicitly. **Blocks #818's floor raise:** `MIN_EXECUTED` 440 → 448 (`v2-integration.yml`) waits on a hosted TRX showing `Driver.OpcUaClient.trx` executed=9 and `Driver.OpcUaClient.Browser.trx` executed=12. Locally, with the same CI filter and the CI-style throwaway NAT container plus its exported cert, those counts are 9 and 12 with 0 skipped (2026-11-11).
dohertj2 added the type:bugtype:infrapriority:p2 labels 2026-11-11 10:09:37 -05:00
Author
Owner

Likely root cause fixed (4b68729a), Pushed to master in e857135e. the job image catthehacker/ubuntu:act-latest ships no ip, so fixture_host() fell back to 127.0.0.1 inside the job container (network traefik) and every published-port probe timed out — QuestDB is just the first one probed over the network. The script now reads the default gateway from /proc/net/route (plain bash) and logs the chosen host. Verified locally in that exact image on a user-defined network (gateway parsed, published port answered 200). Keeping open until the next nightly v2-integration run shows the fixtures ready; if the runner host firewalls bridge→published-port traffic it will still time out and needs a host-side fix.

Likely root cause fixed (`4b68729a`), Pushed to master in `e857135e`. the job image `catthehacker/ubuntu:act-latest` ships no `ip`, so `fixture_host()` fell back to 127.0.0.1 inside the job container (network `traefik`) and every published-port probe timed out — QuestDB is just the first one probed over the network. The script now reads the default gateway from /proc/net/route (plain bash) and logs the chosen host. Verified locally in that exact image on a user-defined network (gateway parsed, published port answered 200). Keeping open until the next nightly `v2-integration` run shows the fixtures ready; if the runner host firewalls bridge→published-port traffic it will still time out and needs a host-side fix.
Author
Owner

Progress. The first hosted run since 4b68729a was a manual dispatch, run 1224 on 88698ca0. It got past the old timeout but failed one step earlier, at container start: Bind for :::19000 failed: port is already allocated. The runner's docker daemon is shared, so a fixed host port can already be taken.

Fix: b114779b on fix/860-ci-fixture-ports.

  • Each fixture retries one port higher when its port is taken, and the tests are given the ports actually used. opc-plc keeps the host port equal to its listen port, because its advertised endpoint depends on it.
  • Container names carry the run id, so a concurrent run's down cannot remove them.
  • A new logs subcommand replaces the workflow's hard-coded container list.

Local check: with 19000 already taken, QuestDB moved to 18813/19001 and every fixture reached ready. logs and down both found the suffixed containers.

A hosted run has been dispatched on the branch to confirm before merging.

Progress. The first hosted run since `4b68729a` was a manual dispatch, run 1224 on `88698ca0`. It got past the old timeout but failed one step earlier, at container start: `Bind for :::19000 failed: port is already allocated`. The runner's docker daemon is shared, so a fixed host port can already be taken. **Fix:** `b114779b` on `fix/860-ci-fixture-ports`. - Each fixture retries one port higher when its port is taken, and the tests are given the ports actually used. opc-plc keeps the host port equal to its listen port, because its advertised endpoint depends on it. - Container names carry the run id, so a concurrent run's `down` cannot remove them. - A new `logs` subcommand replaces the workflow's hard-coded container list. **Local check:** with 19000 already taken, QuestDB moved to 18813/19001 and every fixture reached ready. `logs` and `down` both found the suffixed containers. A hosted run has been dispatched on the branch to confirm before merging.
Author
Owner

Fixed and hosted-verified. Integration run 1225 on b114779b passed, the first v2-integration run ever to complete on the runner. Port 19000 was busy again on the runner, and the fixture script moved QuestDB to 18813/19001 as designed. 525 tests executed, 40 skipped, with every project green. Merged to master in 43f8b8e8.

Fixed and hosted-verified. Integration run 1225 on `b114779b` **passed**, the first `v2-integration` run ever to complete on the runner. Port 19000 was busy again on the runner, and the fixture script moved QuestDB to 18813/19001 as designed. 525 tests executed, 40 skipped, with every project green. Merged to master in `43f8b8e8`.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dohertj2/lmxopcua#860