Skip to content

fix(ci): use webpack fallback for Node 26 compat build to stop OOM - #8611

Merged
diegosouzapw merged 1 commit into
diegosouzapw:release/v3.8.49from
Prudhvivuda:fix/8090-node-24-26-compat
Jul 27, 2026
Merged

diegosouzapw merged 1 commit into
diegosouzapw:release/v3.8.49from
Prudhvivuda:fix/8090-node-24-26-compat

Conversation

@Prudhvivuda

Copy link
Copy Markdown
Contributor

Summary

compat-build-26 in .github/workflows/nightly-compat.yml is the only place in the whole CI matrix that runs npm run build on Node 26 (ci.yml pins CI_NODE_VERSION: "24"). It failed every nightly with the runner-reclaimed signature ("The runner has received a shutdown signal" / "The operation was canceled", no exit code) always at the same Turbopack compile phase — a classic GitHub-runner OOM kill on the memory-constrained ubuntu-latest runner.

Root cause is documented in the codebase itself (scripts/build/build-next-isolated.mjs #6409 note; docs/reference/ENVIRONMENT.md): Turbopack's native (Rust, off-V8-heap) allocation is not bounded by --max-old-space-size and peaks far above webpack on OmniRoute's large module graph, heavier still under Node 26. The endorsed escape hatch for RAM-constrained environments is the webpack fallback (OMNIROUTE_USE_TURBOPACK=0), which this job was not using.

This switches only the compat-build-26 build step to the webpack fallback. It still validates that the app builds on Node 26 (the point of the compat job) at a much lower memory peak. Turbopack-on-Node-24 stays covered by ci.yml's build job (OMNIROUTE_USE_TURBOPACK: "1"). The compat-tests shard failures were a separate class already fixed by #8390/#8386/#8381/#8383.

Test plan

  • New tests/unit/nightly-compat-node26-webpack-8090.test.ts regression guard: parses the workflow and asserts compat-build-26 keeps both npm run build and OMNIROUTE_USE_TURBOPACK: "0", so a future edit can't silently revert to the OOM-prone path. Fails on base (0 occurrences of the env var), passes after.
  • Green on Node 22.8.0 and Node 23.10.0; typecheck:core clean; eslint clean; workflow YAML validated.
  • Caveat: the live Node 26 OOM resolution can't be reproduced locally (no Node 24/26 binary available here); it should be confirmed on the next nightly-compat run. The fix is grounded in the codebase's documented Turbopack-native-memory behavior + the fact that the identical build already passes with webpack in main CI.

Closes #8090
Refs #6949, #6409

The `compat-build-26` job in nightly-compat.yml is the only place in the CI
matrix that runs `npm run build` on Node 26 (ci.yml pins CI_NODE_VERSION=24).
It failed every nightly with the runner-reclaimed signature ("The runner has
received a shutdown signal" / "The operation was canceled", no exit code),
always at the same Turbopack compile phase — the classic OOM-kill pattern on
the memory-constrained ubuntu-latest runner.

Root cause: Turbopack's native (Rust, off-V8-heap) allocation is not bounded by
--max-old-space-size and peaks far higher than webpack on OmniRoute's large
module graph (diegosouzapw#6409), heavier still under Node 26. Raising the heap does not
help — the codebase's own documented escape hatch for RAM-constrained
environments is the webpack fallback (OMNIROUTE_USE_TURBOPACK=0; see
docs/reference/ENVIRONMENT.md and scripts/build/build-next-isolated.mjs).

Wire that fallback into the Node 26 compat build: it still validates the app
builds on Node 26 (the point of the job) at a much lower memory peak.
Turbopack-on-Node-24 stays covered by ci.yml's build job.

Adds a regression guard (tests/unit/nightly-compat-node26-webpack-8090.test.ts)
asserting the job keeps the webpack fallback so it cannot silently regress.

Class 1 of the triage (shard test failures) was already resolved by diegosouzapw#8390,
diegosouzapw#8386, diegosouzapw#8381, diegosouzapw#8383.

Closes diegosouzapw#8090
Refs diegosouzapw#6949 diegosouzapw#6409
@diegosouzapw
diegosouzapw merged commit 71f80ae into diegosouzapw:release/v3.8.49 Jul 27, 2026
5 checks passed
@diegosouzapw diegosouzapw mentioned this pull request Jul 28, 2026
HouMinXi pushed a commit to HouMinXi/OmniRoute that referenced this pull request Aug 2, 2026
…iegosouzapw#8611)

The `compat-build-26` job in nightly-compat.yml is the only place in the CI
matrix that runs `npm run build` on Node 26 (ci.yml pins CI_NODE_VERSION=24).
It failed every nightly with the runner-reclaimed signature ("The runner has
received a shutdown signal" / "The operation was canceled", no exit code),
always at the same Turbopack compile phase — the classic OOM-kill pattern on
the memory-constrained ubuntu-latest runner.

Root cause: Turbopack's native (Rust, off-V8-heap) allocation is not bounded by
--max-old-space-size and peaks far higher than webpack on OmniRoute's large
module graph (diegosouzapw#6409), heavier still under Node 26. Raising the heap does not
help — the codebase's own documented escape hatch for RAM-constrained
environments is the webpack fallback (OMNIROUTE_USE_TURBOPACK=0; see
docs/reference/ENVIRONMENT.md and scripts/build/build-next-isolated.mjs).

Wire that fallback into the Node 26 compat build: it still validates the app
builds on Node 26 (the point of the job) at a much lower memory peak.
Turbopack-on-Node-24 stays covered by ci.yml's build job.

Adds a regression guard (tests/unit/nightly-compat-node26-webpack-8090.test.ts)
asserting the job keeps the webpack fallback so it cannot silently regress.

Class 1 of the triage (shard test failures) was already resolved by diegosouzapw#8390,
diegosouzapw#8386, diegosouzapw#8381, diegosouzapw#8383.

Closes diegosouzapw#8090
Refs diegosouzapw#6949 diegosouzapw#6409
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…iegosouzapw#8611)

The `compat-build-26` job in nightly-compat.yml is the only place in the CI
matrix that runs `npm run build` on Node 26 (ci.yml pins CI_NODE_VERSION=24).
It failed every nightly with the runner-reclaimed signature ("The runner has
received a shutdown signal" / "The operation was canceled", no exit code),
always at the same Turbopack compile phase — the classic OOM-kill pattern on
the memory-constrained ubuntu-latest runner.

Root cause: Turbopack's native (Rust, off-V8-heap) allocation is not bounded by
--max-old-space-size and peaks far higher than webpack on OmniRoute's large
module graph (diegosouzapw#6409), heavier still under Node 26. Raising the heap does not
help — the codebase's own documented escape hatch for RAM-constrained
environments is the webpack fallback (OMNIROUTE_USE_TURBOPACK=0; see
docs/reference/ENVIRONMENT.md and scripts/build/build-next-isolated.mjs).

Wire that fallback into the Node 26 compat build: it still validates the app
builds on Node 26 (the point of the job) at a much lower memory peak.
Turbopack-on-Node-24 stays covered by ci.yml's build job.

Adds a regression guard (tests/unit/nightly-compat-node26-webpack-8090.test.ts)
asserting the job keeps the webpack fallback so it cannot silently regress.

Class 1 of the triage (shard test failures) was already resolved by diegosouzapw#8390,
diegosouzapw#8386, diegosouzapw#8381, diegosouzapw#8383.

Closes diegosouzapw#8090
Refs diegosouzapw#6949 diegosouzapw#6409
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🌙 nightly-compat: Node 24/26 failures on release/v3.8.49

2 participants