ci: smoke test helper against matrix of Etherpad versions#3
Merged
Conversation
Boot a real Etherpad (v2.6.1 released tag + develop tip) with this
helper + ep_font_color installed, hit /p/<id>, and assert HTTP 200 plus
a clean server log. Had we had this matrix in April 2026, the #7543
CJS/ESM interop regression would have been caught on the first PR to
migrate plugins onto template({skip: () => settings.toolbar…}) — instead
it propagated to every ether/* plugin and broke every Etherpad user on
v2.5.x / v2.6.x until a bug report came in days later.
Depends on #2 (the try/catch swallow of skip() throws) to pass against
v2.6.1, since v2.6.1 still has the core interop bug.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Etherpad installs plugins into src/plugin_packages/.versions/… via its own pnpm workspace, not the standard node_modules/ tree. The version sanity check was using Node's default resolver and failing with 'Cannot find module ./node_modules/ep_plugin_helpers/package.json'. Find the package.json under src/plugin_packages/ instead, so the check actually proves what it claims.
Two follow-ups after first real run against v2.6.1: 1. The log scan matched our own [WARN] line from the swallowed skip() throw, which is the *success* signal, not a crash. Pin the grep to [ERROR]-level entries so only genuine crashes fail the job. 2. Version equality between the locally-installed helper and the one pnpm resolved was brittle — pnpm can pull a transitive newer copy from npm and that is not a problem, as long as the pad still loads. Drop the hard check; keep it as informational output.
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.
Summary
Follow-up to #2. Adds a GitHub Actions matrix that boots a real
Etherpad (released `v2.6.1` tag + `develop` tip) with this helper
plus a representative consumer (`ep_font_color`) installed, hits
`/p/`, and asserts the page renders (HTTP 200 + no `TypeError`
in the server log).
Why
Had this matrix existed in April 2026, the ether/etherpad#7543 CJS/ESM
interop regression would have been caught on the first PR to migrate
plugins onto `template({skip: () => settings.toolbar…})`. Instead it
propagated silently to every `ether/*` plugin and broke every Etherpad
user on `v2.5.x` / `v2.6.x` until a bug report landed days later.
Catching this class of regression at the helper layer is much cheaper
than waiting for each consumer plugin to run its own integration tests.
Matrix choice
Two rungs is enough to cover "still works on released" and "hasn't
broken on unreleased". A third rung (say a prior major) is easy to
add later but doubles CI runtime for diminishing returns.
Dependency
Depends on #2 merging first. Against `v2.6.1` the matrix will
fail without that fix, because `v2.6.1` still has the core interop
bug and `ep_font_color`'s `skip()` predicate would throw.
Test plan
`v2.6.1` rung fail with the #7543 crash pattern — verifying
the matrix is actually load-bearing.
🤖 Generated with Claude Code