Repository navigation
Conversation
CI splits the Node suite over 8 shards, each with its own server, so these only fail in a full run against a single server: - The sandbox hook-event test listed the test plugin's events with limit 100; a full run records more. The plugin's events-list route now accepts `ids` for a direct lookup. - The sandbox user-list check required exactly one user, but the passkey setup test adds a second. - In a crowded root folder the dragged media row sat at the viewport's bottom edge, where dnd-kit auto-scrolls and the drop target moves. pointerDrag now scrolls the source to the centre and re-measures the target during the drag. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Under Endform (ENDFORM=true) Playwright starts e2e/endform-server.ts as its webServer on the CLI machine. It runs the normal global setup with EMDASH_E2E_BUILD=production and serves the setup state on 127.0.0.1:4446, which an auto fixture fetches on each runner. Endform proxies loopback traffic from its runners back to the CLI machine, so every test runs on its own runner against the one built server. A gzip proxy in front of the built server compresses /_astro/ assets once, since each runner starts with an empty cache and downloads the admin bundle through the tunnel. About 25 tests that assumed they ran alone against one database now create their own data. Specs that reset the whole site run in a separate exclusive project, and tests that wipe every comment or toggle search for a collection are limited by tag. CI runs this as one job in .github/workflows/endform-e2e.yml. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The repository runs Endform for more than one organization, so the GitHub App's OIDC sign-in can't pick this one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ostenbom
force-pushed
the
e2e/dev-output-build
branch
from
October 27, 2026 20:49
a1be93e to
7f36235
Compare
ostenbom
force-pushed
the
e2e/endform-dev-output
branch
from
October 27, 2026 20:49
42e744c to
5396210
Compare
9 of 22 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What does this PR do?
Runs the Node Playwright suite on Endform against the dev-output build (
astro build --devOutput) from #6, which this PR is stacked on. It is one of four PRs comparing ways to speed up the E2E sweep (see Related PRs). Instead of 8 GitHub shards, one CI job builds and serves the site, and Endform runs every test on its own remote runner (concurrency 64, organizationjOXdcdjD), proxying the runners' localhost traffic back to that job.The Endform layer is the same in this PR and its counterpart, so the two differ only in the build under test. It is squashed from the prototype on #4, which has the commit-by-commit history and the triage notes.
Why each part is needed
playwright.config.tsswitches onENDFORM=truefullyParallel,globalSetupis replaced by awebServer, and specs that reset the whole site (setup-wizard,passkey-full-setup-virtual-auth) move to a separateexclusiveproject. Native runs are unchanged.e2e/endform-server.tsEMDASH_E2E_BUILD=productionon the CLI machine and serves the setup state (token, seeded IDs) on127.0.0.1:4446. On a runner the temp file that global setup writes doesn't exist.e2e/fixtures/index.ts,refresh-server-pat.tsendform.config.tsproxyNetworkHosts: ["<loopback>"]carries the runners' requests forlocalhost:4444/127.0.0.1:4446back to the CI job. Concurrency limits: 64 overall, 1 for theexclusiveproject, and 1 each for tests tagged@commentsand@search.additionalFiles: ["e2e/fixtures/assets/*"]sends the test image;dir/**sends nothing on Endform 0.81.5.e2e/fixtures/compression-proxy.ts(built server moves to127.0.0.1:4447)lib.js5.7 MB, 1.26 MB gzipped). The proxy gzips each/_astro/asset once and serves it from memory; compressing per request saturated the CI machine at concurrency 64.content-*,redirects,media-library,allowed-domains,i18n,visual-editing,plugin-editor-extensions…) and thecreatePostfixturepage.route..github/workflows/endform-e2e.ymlubuntu-latestjob: install, build the fixture's dependencies, run thechromiumproject and then theexclusiveproject on Endform. Authenticates with OIDC through the Endform GitHub App, so no secret is stored.package.json:endform0.81.5,tsx4.21.0endform-server.ts.Known Endform issues, both handed off to Endform: a
keepalivefetch sent duringpagehideis sometimes lost through the proxy (visual-editing"flushes unsaved edits when navigating away", absorbed by CI's one retry), and theadditionalFilesglob above.How much it helps
Bottom line: after syncing with upstream, a real production build cuts the Node E2E time by about 60% with the 8-shard layout unchanged (#7: slowest shard 7.1 → 2.8 min). A dev-output build saves about a quarter (#6: 7.1 → 5.5 min) and fails on Endform at concurrency 64 on every attempt (#8). The production build on Endform (#9) runs the whole suite in one job in under 6 minutes, install and build included.
Local, native Playwright, 1 worker, full Node suite (378 tests), same Mac, run back to back:
astro devastro devmainastro build --devOutputastro build+dangerouslyEnableTestHooksastro build+ runtimeEMDASH_INSECURE_TEST_BYPASS(prototype)* The same flaky test both times:
media-library.spec.ts"moves one local media item into a visible folder by dragging", which fails about 1 run in 3 when the root folder is crowded. It isn't specific to production builds.CI, GitHub Actions
ubuntu-latest, after syncing with upstreammain(c1efce5cc):astro devmainastro build --devOutputastro build+dangerouslyEnableTestHooksastro build --devOutputon Endformastro build+dangerouslyEnableTestHookson Endformastro build+ runtime switch on EndformFor the shard rows, wall time is the slowest shard's "Run Node E2E" step and runner time is that step summed over all 8 shards. Install, build and the Cloudflare step are left out because they don't change between methods. emdash-cms#4317 now builds the fixtures before that step, which is why every shard number is lower than before the sync. Before the sync, against the older baseline (8.0 min, 42.6 shard-min), the shard results were the same picture: #6 −26% and #7 −51%, and on Endform #9 took 4m55s with no retries. For the Endform rows, wall time is the whole job, install and build included.
***
visual-editing.spec.ts"flushes unsaved edits when navigating away", the known Endform keepalive issue, andmedia-library.spec.ts"matches the compact responsive folder layout".** The same dev-output build passes natively (344 of 344), and its client bundles are within 3% of the production build's (4.9 MB vs 4.8 MB of gzipped JS). The extra time is most likely server-side rendering in development mode, which the one shared server can't keep up with at 64 tests at once. That is the same gap as in the native timings (10.3 vs 6.0 min). Not profiled further.
Runs after the sync: #6 CI, #7 CI, #8 Endform E2E, #9 Endform E2E. Before the sync: #6, #7, #8, #9. One or two runs each, so treat small differences as noise.
Other checks: Smoke Isolated Install passes after the sync, since upstream now installs the newest Node 22 for it. Browser Tests (the admin Vitest browser suite, which none of these PRs touch) still fails intermittently on these runners. It fails with "Failed to fetch dynamically imported module" / "Cannot connect to the iframe" on a different file each attempt, and once locally with a timing assertion (
PortableTextEditor.test.tsx, toolbar fade) that passes 3 of 3 times on its own. After the sync it passed first time on #6 and #10, and on the third attempt on #7.Related PRs
astro build --devOutputastro builddangerouslyEnableTestHooksoptionastro build --devOutputastro buildastro buildwith a runtime env switchType of change
Your connection to this change
Checklist
pnpm typecheckpassespnpm lintpassespnpm testpasses (or targeted tests for my change): the Endform E2E workflow on this PR (see table)pnpm formathas been runAI assistance disclosure
Screenshots / test output
Not applicable. Timings are in the table above.
🤖 Generated with Claude Code