Commit graph

9 commits

Author SHA1 Message Date
1f1016a775 feat: add isolated E2E browser test pipeline for Forgejo Actions
Some checks failed
CI / Lint, type check, unit tests, coverage (push) Successful in 1m53s
CI / E2E browser tests (push) Failing after 11s
Implement per-job Docker-in-Docker (DinD) for E2E tests, giving each
job a completely isolated Docker daemon and network. This prevents
leakage to the host Docker or other containers.

The previous E2E approach failed because:
1. The Forgejo runner's container.docker_host was not set, causing
   the runner itself to try unix:///var/run/docker.sock and crash-loop.
2. The host DinD daemon had isolated networking — job containers
   running docker compose could not resolve 'dind' hostname or access
   host filesystem bind mounts (e.g. .:/app).

New approach — zero bind mounts, all COPY-based images:

- docker/backend.e2e.Dockerfile: multi-stage build from repo root.
  Copies gradlew + settings.gradle + backend/build.gradle to download
  dependencies in a cacheable layer, then copies backend/src and builds
  the bootJar. Runs the JAR directly on startup.

- docker/frontend.e2e.Dockerfile: multi-stage Node build → nginx.
  Reuses existing docker/nginx.conf for /api proxy to backend service.
  No volume mounts, fully self-contained.

- docker/playwright.e2e.Dockerfile: extends official Playwright image.
  Installs deps from package-lock.json, copies e2e tests + config.

- docker-compose.e2e.yml: zero bind mounts. Services depend on each
  other in order: postgres (healthy) → backend → frontend → playwright.
  Playwright waits for backend and frontend via curl loops before
  running tests.

- .forgejo/workflows/ci.yml: E2E job adds a 'dind' service container
  (docker:28-dind, privileged, no TLS). The job sets DOCKER_HOST to
  tcp://dind:2375 so the docker CLI inside the job talks to the
  per-job DinD daemon. The compose file is docker-compose.e2e.yml.

- Runner fix on tocke: added container.docker_host: 'tcp://dind:2375'
  to runner-config.yaml so the runner's own Docker client connects to
  the host DinD container, stopping the crash loop.

Key properties:
- Network isolation: each E2E job gets its own DinD with its own
  container network. No host container visibility.
- No bind mount leakage: all images use COPY instead of volume mounts.
  The per-job DinD has its own filesystem and can't see host paths.
- Deterministic: builds start from clean state every time. Image cache
  exists only within the per-job DinD lifetime.
- Lint-and-test job is untouched and remains green.
2026-05-19 18:07:12 +02:00
8e3632f05f fix: remove DOCKER_HOST from E2E job, now uses host docker socket
Some checks failed
CI / Lint, type check, unit tests, coverage (push) Successful in 1m54s
CI / E2E browser tests (push) Failing after 1s
2026-05-19 17:05:24 +02:00
10cc12154e fix: split coverage into separate backend and frontend steps
Some checks failed
CI / Lint, type check, unit tests, coverage (push) Failing after 18s
CI / E2E browser tests (push) Failing after 0s
- Backend coverage runs from repo root where gradlew lives
- Frontend coverage runs from frontend/ with working-directory
- No cd tricks that break relative paths
2026-05-19 16:49:50 +02:00
e4cfb873f0 fix: run backend coverage from repo root, not frontend dir
Some checks failed
CI / Lint, type check, unit tests, coverage (push) Failing after 1m41s
CI / E2E browser tests (push) Failing after 2s
- Remove working-directory: frontend from coverage step
- cd back to repo root for ./gradlew command, then cd frontend for npm
- Gradle wrapper lives at repo root, not in frontend/
2026-05-19 16:41:30 +02:00
b41124b141 fix: use git init + fetch checkout to handle non-empty workspace
Some checks failed
CI / Lint, type check, unit tests, coverage (push) Failing after 1m38s
CI / E2E browser tests (push) Failing after 2s
- Replace git clone . with git init + git fetch + git checkout FETCH_HEAD
  Runner pre-creates workspace directory, so git clone . fails
- Use GITHUB_SHA to fetch exact commit, matching original checkout behavior
- Add DOCKER_HOST=tcp://dind:2375 to E2E job step env
2026-05-19 16:32:47 +02:00
076fe1b299 fix: replace actions/checkout with direct git clone to preserve /git/ subpath
Some checks failed
CI / Lint, type check, unit tests, coverage (push) Failing after 1m43s
CI / E2E browser tests (push) Failing after 2s
- Replace actions/checkout@v4 with git clone in both jobs
- Clone URL: https://x-access-token:${FORGEJO_TOKEN}@srvr.nu/git/jocke/bilhej.git
- The checkout action constructed https://srvr.nu/jocke/bilhej/ dropping the /git/ subpath
- FORGEJO_TOKEN is automatically injected by Forgejo at runtime
- Remove ineffective GITHUB_SERVER_URL env var
2026-05-19 16:24:48 +02:00
3cc0cb88d2 fix: use GITHUB_SERVER_URL so checkout resolves Forgejo subpath
Some checks failed
CI / Lint, type check, unit tests, coverage (push) Failing after 43s
CI / E2E browser tests (push) Failing after 34s
- Rename FORGEJO_SERVER_URL to GITHUB_SERVER_URL
- The actions/checkout action reads GITHUB_SERVER_URL to construct the
  clone URL. The runner was cloning https://srvr.nu/jocke/bilhej/ instead
  of https://srvr.nu/git/jocke/bilhej/ because the /git/ subpath was lost
2026-05-19 16:16:41 +02:00
0be3bc473d fix: use github.com source for setup-java and set Forgejo server URL
Some checks failed
CI / Lint, type check, unit tests, coverage (push) Failing after 1m10s
CI / E2E browser tests (push) Failing after 35s
- Change actions/setup-java@v4 to https://github.com/actions/setup-java@v4
  (not mirrored on code.forgejo.org)
- Add FORGEJO_SERVER_URL env var set to https://srvr.nu/git
  (runner checkout was missing /git/ subpath prefix)
2026-05-19 16:07:28 +02:00
8892e0402b ci: add Forgejo lint, test, coverage and E2E workflow
Some checks failed
CI / Lint, type check, unit tests, coverage (push) Failing after 33s
CI / E2E browser tests (push) Failing after 26s
- Add .forgejo/workflows/ci.yml triggering on push/PR to master and develop
- Job lint-and-test: ESLint, vue-tsc type check, Vitest, JUnit, coverage
- Job e2e: Docker compose CI stack with Postgres, backend, frontend, Playwright
- Backend tests use H2 in-memory, no Postgres needed for unit tests
- E2E reuses existing docker-compose.ci.yml orchestration
- Strep env vars use fake test values since Stripe integration is deferred
2026-05-19 15:37:08 +02:00