diff --git a/.dockerignore b/.dockerignore index 8487d98..25602f6 100644 --- a/.dockerignore +++ b/.dockerignore @@ -14,7 +14,9 @@ artifacts docs deploy -n8n +n8n/** +!n8n/workflows/ +!n8n/workflows/** frontend *.tgz *.tar.gz diff --git a/backend/Dockerfile b/backend/Dockerfile index 1a48703..293ea96 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -26,6 +26,7 @@ RUN pip install --no-cache-dir -r requirements.lock COPY backend/tests ./tests COPY contracts ./contracts COPY scripts/check-contracts.py ./scripts/check-contracts.py +COPY n8n/workflows ./n8n/workflows USER app FROM runtime-base AS runtime diff --git a/frontend/e2e-live/smoke.spec.ts b/frontend/e2e-live/smoke.spec.ts index ecc28b5..778174b 100644 --- a/frontend/e2e-live/smoke.spec.ts +++ b/frontend/e2e-live/smoke.spec.ts @@ -26,6 +26,15 @@ test("non-destructive operator canary covers routes and grounded knowledge", asy await page.goto("/login"); await page.getByRole("button", { name: "Verken als Operationsmanager" }).click(); await expect(page).toHaveURL(/\/dashboard$/); + if (pageErrors.some((message) => message.toLowerCase().includes("dynamically imported module"))) { + // A deploy can replace the SPA between loading index.html and its lazy + // dashboard chunk. One clean reload must recover; a persistent chunk or + // server error is collected again and still fails the canary below. + pageErrors.length = 0; + await page.reload({ waitUntil: "domcontentloaded" }); + await expect(page).toHaveURL(/\/dashboard$/); + await expect(page.locator("main")).toBeVisible(); + } for (const [path, heading] of [ ["/vehicles", "Wagenpark"],