npm install playwright pulled v1.59.1 but the Docker image ships
v1.52.0 browsers, causing a version mismatch crash. Pin to 1.52.0.
Also add ci/Dockerfile.test-runner for pre-building the image into
registry.gobha.me:5000/ci-test-runner:latest — eliminates npm install
from every CI run.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Add npm install playwright to test-runner Dockerfile — the
Playwright Docker image installs globally but require() from
/work can't resolve it. Local install fixes the module path.
2. Remove test-sqlite dependency from test-runners job so it runs
in parallel with DB tests instead of waiting for them.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Playwright Docker image already ships with playwright and browsers
pre-installed. The npm install was failing (exit code 1, hidden by
2>/dev/null) and blocking the build.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
DinD volume mounts don't work — the Docker daemon can't see the CI
runner's workspace volume. Instead, COPY ci/ into the Playwright
image at build time via dockerfile_inline. No volume detection needed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
In Gitea runner pods, the repo checkout lives in a Docker volume, not
a host path. The `.:/work` mount in docker-compose.ci.yml resolved to
the Docker daemon's CWD (empty), causing "No such file or directory".
Resolve the actual Docker volume backing the CI workspace at runtime
and pass it via CI_WORKSPACE_VOLUME env var. Falls back to `.` for
local (non-DinD) usage.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Two bugs preventing the test-runners CI job from passing:
1. Health check used GET /api/v1/auth/login — a POST-only route that
always returns 404. Changed to GET /api/v1/health which exists.
2. Bundled package install passed empty strings to FK-constrained
columns (global_settings.updated_by, workflows.created_by),
causing FOREIGN KEY constraint failures on every surface and
workflow package. Fixed by resolving the bootstrap admin user ID
at startup and threading it through the install path.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The test-runners job was failing because network_mode: host puts the
armature container on DinD's network namespace, unreachable from the
workflow container which is on a separate bridge network.
Fix: Remove host networking entirely. Add a test-runner service to the
CI compose override that runs Playwright tests on the same bridge
network as armature, using Docker DNS (http://armature:80).
Changes:
- docker-compose.ci.yml: Replace network_mode: host with healthcheck
on armature + Playwright test-runner service (depends_on: healthy)
- ci.yaml: Collapse 7 test-runners steps into 3 (checkout, compose
up --exit-code-from test-runner, teardown)
The previous fix (container IP resolution) still failed because the
CI runner and compose containers are on separate Docker networks.
- Add docker-compose.ci.yml override with network_mode: host so the
container shares the runner's network stack directly
- Add --connect-timeout 2 to curl in wait-for-healthy.sh so it fails
fast instead of hanging indefinitely on unreachable hosts
- Cap health check at 30s (server boots in 5-10s)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>