The matrix spawned one runner per scenario, so the Traefik, Crowdsec and whoami images were pulled — and Crowdsec booted — once per scenario. Run the whole suite in a single job with `make -k e2e` instead: Docker caches the images locally so they are pulled only once, and `-k` keeps the remaining scenarios running after a failure (make still exits non-zero). Scenarios already share the canonical `crowdsec` container name and the 8000 port, so they were meant to run sequentially anyway. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1.7 KiB
End-to-end test suite
These tests spin up real Traefik + Crowdsec containers and exercise the plugin in the same conditions Traefik uses in production: loaded from a local path, no module download, no mocking.
Each scenario lives in its own directory under scenarios/ and owns:
docker-compose.yml— the stack to spin uprun.sh— orchestration + assertions- optional fixtures (
acquis.yaml,ban.html, ...)
Running locally
Prerequisites: docker, docker compose, curl, bash.
Run a single scenario:
./tests/e2e/scenarios/stream-mode/run.sh
# or
make e2e_stream-mode
Run everything:
make e2e
Scenarios run sequentially on a single host: they share the canonical
crowdsec container name (so cscli commands work uniformly) and the same
8000:80 port. Each scenario uses its own Docker Compose project
(-p e2e-<scenario>) and tears its stack down on exit, so the next one
starts clean. make e2e runs them one after another; Docker reuses the
images pulled by the first scenario, so the Traefik / Crowdsec / whoami
images are downloaded only once for the whole suite.
Writing a new scenario
- Copy
scenarios/stream-mode/as a template. - Rename
container_names (keepcrowdsecfor the LAPI container). - Edit
run.shto express the behavior under test. - Add the scenario name to
E2E_SCENARIOSin theMakefile.
CI
.github/workflows/e2e.yml runs the whole suite in a single job
(make -k e2e) on every PR and push to main. -k lets the remaining
scenarios run after a failure so the logs cover all of them, while make
still exits non-zero if any scenario failed. On failure, the per-scenario
logs (/tmp/e2e-*.log) are uploaded as an artifact named e2e-logs.