Skip to content

Commit 67f7d91

Browse files
author
Etherpad Release Bot
committed
Merge branch 'develop'
2 parents da00ad7 + bb2ef93 commit 67f7d91

117 files changed

Lines changed: 4279 additions & 1937 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/backend-tests.yml

Lines changed: 32 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -66,24 +66,7 @@ jobs:
6666
run: pnpm build
6767
-
6868
name: Run the backend tests
69-
env:
70-
# --report-on-fatalerror and friends write a Node diagnostic report
71-
# (V8 stack, libuv handles, OS info) on fatal errors that bypass JS
72-
# handlers — the failure mode we've been chasing on Windows + Node
73-
# 24 since PR #7663. Reports land in node-report/ and are uploaded
74-
# as an artifact if the step fails.
75-
NODE_OPTIONS: "--report-on-fatalerror --report-uncaught-exception --report-on-signal --report-compact --report-directory=${{ github.workspace }}/node-report"
76-
run: |
77-
mkdir -p "${{ github.workspace }}/node-report"
78-
pnpm test
79-
- name: Upload Node diagnostic reports on failure
80-
if: ${{ failure() }}
81-
uses: actions/upload-artifact@v7
82-
with:
83-
name: node-diagnostic-report-${{ runner.os }}-node${{ matrix.node }}-${{ github.job }}
84-
path: node-report/
85-
if-no-files-found: ignore
86-
retention-days: 7
69+
run: pnpm test
8770
- name: Run the new vitest tests
8871
working-directory: src
8972
run: pnpm run test:vitest
@@ -153,19 +136,7 @@ jobs:
153136
ep_table_of_contents
154137
-
155138
name: Run the backend tests
156-
env:
157-
NODE_OPTIONS: "--report-on-fatalerror --report-uncaught-exception --report-on-signal --report-compact --report-directory=${{ github.workspace }}/node-report"
158-
run: |
159-
mkdir -p "${{ github.workspace }}/node-report"
160-
pnpm test
161-
- name: Upload Node diagnostic reports on failure
162-
if: ${{ failure() }}
163-
uses: actions/upload-artifact@v7
164-
with:
165-
name: node-diagnostic-report-${{ runner.os }}-node${{ matrix.node }}-${{ github.job }}
166-
path: node-report/
167-
if-no-files-found: ignore
168-
retention-days: 7
139+
run: pnpm test
169140
- name: Run the new vitest tests
170141
working-directory: src
171142
run: pnpm run test:vitest
@@ -180,7 +151,18 @@ jobs:
180151
fail-fast: false
181152
matrix:
182153
# Etherpad requires Node >= 24 (see package.json engines.node).
183-
node: ${{ fromJSON('[24]') }}
154+
# Windows pins Node 24.16.0, not the runner-default 24.15.0. Node 24.15.0's
155+
# bundled libuv (1.51.0) has a stack buffer overrun in the Windows TCP-connect
156+
# path (uv__tcp_connect), proven by a /GS __fastfail full-memory dump under the
157+
# backend suite's heavy localhost connection churn -- the long-standing Windows
158+
# backend silent-ELIFECYCLE flake (memory corruption, so no JS/Node
159+
# observability). Bisect: 24.15.0 crashes (4/4 on 127.0.0.1), 24.16.0
160+
# (libuv 1.52.1) is clean (0/8). Stays on the 24 LTS line. Pin explicitly
161+
# because setup-node's default check-latest:false reuses the runner's
162+
# pre-cached 24.15.0 for a bare "24".
163+
# Tracking: https://github.com/nodejs/node/issues/63620 — drop this pin
164+
# back to plain "24" once the fix is across the supported 24.x baseline.
165+
node: ${{ fromJSON('["24.16.0"]') }}
184166
name: Windows without plugins
185167
runs-on: windows-latest
186168
steps:
@@ -218,23 +200,9 @@ jobs:
218200
name: Run the backend tests
219201
shell: bash
220202
working-directory: src
221-
env:
222-
NODE_OPTIONS: "--report-on-fatalerror --report-uncaught-exception --report-on-signal --report-compact --report-directory=${{ github.workspace }}/node-report"
223-
run: |
224-
mkdir -p "${{ github.workspace }}/node-report"
225-
# --exit forces process.exit(failures) after the suite completes,
226-
# closing the post-suite event-loop drain window where Windows +
227-
# Node 24 hard-kills the process. Scoped to Windows so Linux/local
228-
# runs still surface real handle leaks via natural drain.
229-
pnpm test -- --exit
230-
- name: Upload Node diagnostic reports on failure
231-
if: ${{ failure() }}
232-
uses: actions/upload-artifact@v7
233-
with:
234-
name: node-diagnostic-report-${{ runner.os }}-node${{ matrix.node }}-${{ github.job }}
235-
path: node-report/
236-
if-no-files-found: ignore
237-
retention-days: 7
203+
# --exit makes mocha call process.exit() after the run so a leaked handle
204+
# cannot hang the job on Windows.
205+
run: pnpm test -- --exit
238206
- name: Run the new vitest tests
239207
working-directory: src
240208
run: pnpm run test:vitest
@@ -248,7 +216,18 @@ jobs:
248216
fail-fast: false
249217
matrix:
250218
# Etherpad requires Node >= 24 (see package.json engines.node).
251-
node: ${{ fromJSON('[24]') }}
219+
# Windows pins Node 24.16.0, not the runner-default 24.15.0. Node 24.15.0's
220+
# bundled libuv (1.51.0) has a stack buffer overrun in the Windows TCP-connect
221+
# path (uv__tcp_connect), proven by a /GS __fastfail full-memory dump under the
222+
# backend suite's heavy localhost connection churn -- the long-standing Windows
223+
# backend silent-ELIFECYCLE flake (memory corruption, so no JS/Node
224+
# observability). Bisect: 24.15.0 crashes (4/4 on 127.0.0.1), 24.16.0
225+
# (libuv 1.52.1) is clean (0/8). Stays on the 24 LTS line. Pin explicitly
226+
# because setup-node's default check-latest:false reuses the runner's
227+
# pre-cached 24.15.0 for a bare "24".
228+
# Tracking: https://github.com/nodejs/node/issues/63620 — drop this pin
229+
# back to plain "24" once the fix is across the supported 24.x baseline.
230+
node: ${{ fromJSON('["24.16.0"]') }}
252231
name: Windows with Plugins
253232
runs-on: windows-latest
254233

@@ -315,23 +294,9 @@ jobs:
315294
name: Run the backend tests
316295
shell: bash
317296
working-directory: src
318-
env:
319-
NODE_OPTIONS: "--report-on-fatalerror --report-uncaught-exception --report-on-signal --report-compact --report-directory=${{ github.workspace }}/node-report"
320-
run: |
321-
mkdir -p "${{ github.workspace }}/node-report"
322-
# --exit forces process.exit(failures) after the suite completes,
323-
# closing the post-suite event-loop drain window where Windows +
324-
# Node 24 hard-kills the process. Scoped to Windows so Linux/local
325-
# runs still surface real handle leaks via natural drain.
326-
pnpm test -- --exit
327-
- name: Upload Node diagnostic reports on failure
328-
if: ${{ failure() }}
329-
uses: actions/upload-artifact@v7
330-
with:
331-
name: node-diagnostic-report-${{ runner.os }}-node${{ matrix.node }}-${{ github.job }}
332-
path: node-report/
333-
if-no-files-found: ignore
334-
retention-days: 7
297+
# --exit makes mocha call process.exit() after the run so a leaked handle
298+
# cannot hang the job on Windows.
299+
run: pnpm test -- --exit
335300
- name: Run the new vitest tests
336301
working-directory: src
337302
run: pnpm run test:vitest

.pr_agent.toml

Lines changed: 0 additions & 5 deletions
This file was deleted.

AGENTS.MD

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,38 @@ pnpm run plugins ls # List installed
211211
### Settings
212212
Configured via `settings.json`. A template is available at `settings.json.template`. Environment variables can override any setting using `"${ENV_VAR}"` or `"${ENV_VAR:default_value}"`.
213213

214+
## Releasing
215+
216+
Releases are driven almost entirely by GitHub Actions. A maintainer dispatches **one** workflow; the version bump, tagging, GitHub Release, Docker images, and snap all cascade off the pushed tag. The npm publish is a separate manual dispatch.
217+
218+
### Prerequisites (check these before dispatching)
219+
- **A `# X.Y.Z` changelog section for the _target_ version must already be at the top of `CHANGELOG.md`.** `bin/release.ts` aborts with `No changelog record for X.Y.Z, please create changelog record` if it's missing. Write the section before dispatching.
220+
- **All four `package.json` files must agree on the current version:** root `package.json`, `src/package.json`, `admin/package.json`, `bin/package.json`. `release.ts` reads the *current* version from **`src/package.json`** and computes the next with `semver.inc(current, type)`. If the files are out of sync (e.g. one was hand-edited), the computed target is wrong and the changelog guard fails. *(This exact desync — `src`/`bin` left at 3.3.0 while root/admin were 3.2.0 — blocked the 3.3.0 release in June 2026.)*
221+
222+
### Cutting a release
223+
1. **Actions → "Release etherpad"** → Run workflow (`workflow_dispatch`), choose `patch` / `minor` / `major`. Cadence is monthly **minors** (3.0.0 → 3.1.0 → 3.2.0 → …); use `major` only for breaking changes.
224+
2. The **Prepare release** step runs `bin/release.ts`, which:
225+
- sanity-checks the tree (clean working dir, on `develop`, `develop`/`master` upstreams in sync, `../ether.github.com` cloned & clean on `master`);
226+
- bumps the version in all four `package.json` files;
227+
- commits `bump version`, merges `develop``master`, creates both `X.Y.Z` **and** `vX.Y.Z` tags, merges `master` back to `develop`;
228+
- builds and stages the versioned docs into the website repo (see **Documentation** below).
229+
3. The **Push after release** step (`bin/push-after-release.sh`) pushes `master`, `develop`, the tag, `--tags`, and the `ether.github.com` docs commit.
230+
4. The pushed **`vX.Y.Z` tag auto-triggers** three workflows:
231+
- `handleRelease.yml` → builds Etherpad, extracts the matching changelog section via `generateChangelog` (`bin/generateReleaseNotes.ts`), and publishes the **GitHub Release** (`make_latest: true`);
232+
- `docker.yml` → builds & pushes the Docker images;
233+
- `snap-publish.yml` → publishes the snap.
234+
5. **npm publish is a separate manual step:** dispatch **"releaseEtherpad.yaml"** (`workflow_dispatch`), which runs `npm publish --provenance --access public` via npm **OIDC trusted publishing**. It is *not* fired by the tag.
235+
236+
### Documentation
237+
238+
Two distinct things, both important:
239+
240+
**1. Per-PR doc updates — your responsibility in every behaviour-change PR.**
241+
The `doc/` workspace holds the user/admin/API docs (Markdown + AsciiDoc). Whenever a PR changes API responses, CLI flags, settings keys, hooks, or error formats, update the relevant files in `doc/` **in the same PR** — don't defer it to release time. The HTTP API reference is `doc/api/http_api.{md,adoc}` (keep both in sync). Preview locally with `pnpm run makeDocs`.
242+
243+
**2. Release-time versioned docs publishing — automated, no manual step.**
244+
During a release, `release.ts` runs `pnpm run makeDocs` (→ `bin/make_docs.ts`) to render `doc/` into `out/doc/`, then copies it into the sibling website repo at `../ether.github.com/public/doc/vX.Y.Z`, bumps that repo's version, and commits `X.Y.Z docs`; `push-after-release.sh` pushes it, publishing the versioned docs on etherpad.org. This requires `ether.github.com` checked out as a **sibling directory** — the **Release etherpad** workflow checks it out automatically. If you ever run `release.ts` by hand, clone it first: `cd .. && git clone git@github.com:ether/ether.github.com.git`.
245+
214246
## Monorepo Structure
215247

216248
This project uses pnpm workspaces. The workspaces are:

0 commit comments

Comments
 (0)