P5: OSS readiness — docs site, contributor onboarding, e2e harness #23
+14
-13
@@ -1,12 +1,19 @@
|
|||||||
# P5-06 — End-to-end test suite.
|
# P5-06 — End-to-end test suite.
|
||||||
#
|
#
|
||||||
# Spec : docs/superpowers/specs/2026-05-07-p5-oss-readiness-design.md
|
# Spec : docs/superpowers/specs/2026-05-07-p5-oss-readiness-design.md
|
||||||
# Stack: e2e/compose.e2e.yml (server + agent + rest-server)
|
# Stack: e2e/compose.e2e.yml (server + agent + rest-server + playwright)
|
||||||
# Tests: e2e/playwright/tests/*.spec.ts
|
# Tests: e2e/playwright/tests/*.spec.ts
|
||||||
#
|
#
|
||||||
# Triggered on every PR into main and on workflow_dispatch. Runs
|
# Triggered on every PR into main and on workflow_dispatch. Runs
|
||||||
# longer than the unit-test workflow (~3-4 minutes for a clean run);
|
# longer than the unit-test workflow (~3-4 minutes for a clean run);
|
||||||
# kept separate so a slow e2e doesn't block the fast lint/test loop.
|
# kept separate so a slow e2e doesn't block the fast lint/test loop.
|
||||||
|
#
|
||||||
|
# Networking note: every interaction with the server (health probe,
|
||||||
|
# Playwright) happens from a container on the compose `rmnet`
|
||||||
|
# network, addressing the server as `http://server:8080`. We can't
|
||||||
|
# rely on `127.0.0.1:8080` because Gitea's runner executes steps
|
||||||
|
# inside its own container, where compose's host port-publish is
|
||||||
|
# not visible.
|
||||||
|
|
||||||
name: e2e
|
name: e2e
|
||||||
|
|
||||||
@@ -33,7 +40,8 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
set -eu
|
set -eu
|
||||||
for i in $(seq 1 30); do
|
for i in $(seq 1 30); do
|
||||||
if curl -fsS http://127.0.0.1:8080/api/version >/dev/null 2>&1; then
|
if docker run --rm --network e2e_rmnet curlimages/curl:8.10.1 \
|
||||||
|
-fsS http://server:8080/api/version >/dev/null 2>&1; then
|
||||||
echo "server up"; exit 0
|
echo "server up"; exit 0
|
||||||
fi
|
fi
|
||||||
sleep 2
|
sleep 2
|
||||||
@@ -60,22 +68,15 @@ jobs:
|
|||||||
- name: Start the agent
|
- name: Start the agent
|
||||||
run: docker compose -f e2e/compose.e2e.yml up -d agent
|
run: docker compose -f e2e/compose.e2e.yml up -d agent
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- name: Prepare report mounts
|
||||||
with:
|
|
||||||
node-version: '20'
|
|
||||||
|
|
||||||
- name: Install Playwright
|
|
||||||
working-directory: e2e/playwright
|
|
||||||
run: |
|
run: |
|
||||||
npm install --no-audit --no-fund
|
mkdir -p e2e/playwright/playwright-report e2e/playwright/test-results
|
||||||
npx playwright install --with-deps chromium
|
chmod -R a+rwX e2e/playwright/playwright-report e2e/playwright/test-results
|
||||||
|
|
||||||
- name: Run Playwright tests
|
- name: Run Playwright tests
|
||||||
working-directory: e2e/playwright
|
|
||||||
env:
|
env:
|
||||||
RM_BASE_URL: http://127.0.0.1:8080
|
|
||||||
RM_BOOTSTRAP_TOKEN: ${{ env.RM_BOOTSTRAP_TOKEN }}
|
RM_BOOTSTRAP_TOKEN: ${{ env.RM_BOOTSTRAP_TOKEN }}
|
||||||
run: npx playwright test
|
run: docker compose -f e2e/compose.e2e.yml run --rm playwright
|
||||||
|
|
||||||
- name: Compose logs (on failure)
|
- name: Compose logs (on failure)
|
||||||
if: failure()
|
if: failure()
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# Playwright runner for the e2e suite. Built and run by
|
||||||
|
# e2e/compose.e2e.yml so the test process sits on the same docker
|
||||||
|
# network as the server, agent, and rest-server. The previous setup
|
||||||
|
# ran Playwright on the workflow runner host and reached the server
|
||||||
|
# via 127.0.0.1:8080; that fails on Gitea's act-style runners
|
||||||
|
# because the workflow steps execute inside a runner container,
|
||||||
|
# not on the host where compose publishes its ports.
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/playwright:v1.50.0-jammy
|
||||||
|
|
||||||
|
WORKDIR /work
|
||||||
|
|
||||||
|
# Install npm deps in a separate layer keyed off package.json so
|
||||||
|
# changes to specs don't bust the dep cache.
|
||||||
|
COPY e2e/playwright/package.json /work/package.json
|
||||||
|
RUN npm install --no-audit --no-fund
|
||||||
|
|
||||||
|
COPY e2e/playwright/ /work/
|
||||||
|
|
||||||
|
ENV CI=1
|
||||||
|
ENTRYPOINT ["npx", "playwright", "test"]
|
||||||
@@ -63,6 +63,27 @@ services:
|
|||||||
- agent-state:/var/lib/restic-manager-agent
|
- agent-state:/var/lib/restic-manager-agent
|
||||||
networks: [rmnet]
|
networks: [rmnet]
|
||||||
|
|
||||||
|
# Playwright test runner. Profile-gated so `compose up` doesn't
|
||||||
|
# start it; CI runs it via `compose run --rm playwright`. Lives on
|
||||||
|
# rmnet so it can reach the server via its compose-network DNS
|
||||||
|
# name rather than depending on host port-publish (which doesn't
|
||||||
|
# work on Gitea's container-based runners).
|
||||||
|
playwright:
|
||||||
|
profiles: [test]
|
||||||
|
build:
|
||||||
|
context: ..
|
||||||
|
dockerfile: e2e/Dockerfile.playwright
|
||||||
|
environment:
|
||||||
|
RM_BASE_URL: "http://server:8080"
|
||||||
|
RM_BOOTSTRAP_TOKEN: "${RM_BOOTSTRAP_TOKEN:-}"
|
||||||
|
volumes:
|
||||||
|
- ./playwright/playwright-report:/work/playwright-report
|
||||||
|
- ./playwright/test-results:/work/test-results
|
||||||
|
depends_on:
|
||||||
|
- server
|
||||||
|
- agent
|
||||||
|
networks: [rmnet]
|
||||||
|
|
||||||
# One-shot init container that drops a couple of files into the
|
# One-shot init container that drops a couple of files into the
|
||||||
# source volume so backups have something to snapshot.
|
# source volume so backups have something to snapshot.
|
||||||
source-fixture:
|
source-fixture:
|
||||||
|
|||||||
Reference in New Issue
Block a user