Skip to content

Commit d780ab0

Browse files
intechclaude
andauthored
fix(ci): stop the Node 24.21 healthcheck hang and cap job runtimes (#267)
## Summary The **Node 24** CI job hangs on every PR until GitHub's 6-hour limit. `node-version: "24"` now resolves to **v24.21.0**, whose `node:http2` client defers `RST_STREAM` while receiving (nodejs/node#65093, a v24-only adaptation of #64166). A stream closed with `req.close()` from its `'response'` handler before its body is read is never destroyed, so the client keeps its TCP connection open. The healthcheck test helper `httpStatus` uses exactly that pattern. As a result, the server's graceful `stop()` never completes and the integration suite never exits. The regression was reproduced on plain `node:http2` without Connectum: 24.20.0 exits, 24.21.0 hangs, 26.10.0 exits. It is a client-side issue; the server's Node version is irrelevant. - **Test.** `worker-components.test.ts` `httpStatus` drains the response body before closing the session. - **CI.** Every workflow job gets `timeout-minutes`: 15, and 30 for "Release & Publish". The slowest job over 224 successful runs took 116 s, so a hang now fails in minutes instead of hours. A related server-side reliability gap is **not** addressed here and will get its own PR: after `shutdown.timeout`, Connectum destroys HTTP/2 sessions but not raw sockets, so the process does not exit while a client holds TCP. ## Type of change - [ ] Bug fix (non-breaking) - [ ] New feature (non-breaking) - [ ] Breaking change (documented in migration guide) - [x] Documentation / chore / internal ## Test plan - [x] healthcheck integration suite in Docker: 16/16 with exit in about 1 s on `node:24.20.0`, `node:24.21.0` and `node:26.10.0`. Before the fix, 24.21.0 hung. - [x] `pnpm build && pnpm typecheck && pnpm test` pass locally (33/33 turbo tasks) - [x] `pnpm lint` passes locally. The only warning, `packages/events/src/broadcast.ts:18`, pre-exists on `main`. - [x] `pnpm release:contract` passes (`release.yml` gains only `timeout-minutes`) - [x] Every job has `timeout-minutes`, checked with `yq` over all 10 workflow files. - [ ] CI "Node 24" green on this PR is the end-to-end check. ## Parity coverage - [ ] Parity coverage added - [x] Parity N/A: test helper and CI configuration only, no RPC behaviour changes. ## Related issues / changes - Upstream: nodejs/node#65093 / #64166 (v24.21.0). - Unblocks the Node 24 job on #265 and future PRs. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Improvements** * Automated checks and maintenance workflows now have a 15-minute time limit, and release publishing has a 30-minute limit. * Health-check integration tests now wait for HTTP/2 responses to finish before reporting the status. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 937cc0f commit d780ab0

11 files changed

Lines changed: 37 additions & 4 deletions

File tree

‎.github/workflows/auto-assign.yml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ on:
77
jobs:
88
run:
99
runs-on: ubuntu-latest
10+
timeout-minutes: 15
1011
permissions:
1112
issues: write
1213
pull-requests: write

‎.github/workflows/auto-label.yml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ jobs:
1616
name: Label Pull Request
1717
if: github.event_name == 'pull_request'
1818
runs-on: ubuntu-latest
19+
timeout-minutes: 15
1920
steps:
2021
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
2122

@@ -85,6 +86,7 @@ jobs:
8586
name: Label Issue
8687
if: github.event_name == 'issues'
8788
runs-on: ubuntu-latest
89+
timeout-minutes: 15
8890
steps:
8991
- name: Apply triage and detect type
9092
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0

‎.github/workflows/bsr-publish.yml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ jobs:
2626
publish:
2727
name: Publish to Buf Schema Registry
2828
runs-on: ubuntu-latest
29+
timeout-minutes: 15
2930
steps:
3031
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
3132

‎.github/workflows/buf.yml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ jobs:
1818
lint:
1919
name: Lint & Breaking
2020
runs-on: ubuntu-latest
21+
timeout-minutes: 15
2122
strategy:
2223
matrix:
2324
package: [auth, events]

‎.github/workflows/ci.yml‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,15 @@ concurrency:
1313
permissions:
1414
contents: read
1515

16+
# Every job caps its runtime with timeout-minutes. Jobs finish in about two
17+
# minutes; without a cap a hung test (e.g. an HTTP/2 connection that never
18+
# closes) holds the runner for GitHub's 6-hour default before failing.
1619
jobs:
1720
# ── Lint, Typecheck, Audit (run once on dev Node) ──────────────────────
1821
quality:
1922
name: Typecheck, Lint & Test
2023
runs-on: ubuntu-latest
24+
timeout-minutes: 15
2125
steps:
2226
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
2327

@@ -50,6 +54,7 @@ jobs:
5054
test-node:
5155
name: "Node ${{ matrix.node-version }}"
5256
runs-on: ubuntu-latest
57+
timeout-minutes: 15
5358
strategy:
5459
fail-fast: false
5560
matrix:
@@ -83,6 +88,7 @@ jobs:
8388
test-amqp-broker:
8489
name: AMQP broker integration
8590
runs-on: ubuntu-latest
91+
timeout-minutes: 15
8692
services:
8793
rabbitmq:
8894
image: rabbitmq:4-alpine
@@ -117,6 +123,7 @@ jobs:
117123
test-redis-broker:
118124
name: "Redis protocol (${{ matrix.broker.name }})"
119125
runs-on: ubuntu-latest
126+
timeout-minutes: 15
120127
strategy:
121128
fail-fast: false
122129
matrix:
@@ -157,6 +164,7 @@ jobs:
157164
test-amqp-recovery:
158165
name: AMQP recovery (testcontainers)
159166
runs-on: ubuntu-latest
167+
timeout-minutes: 15
160168
continue-on-error: true
161169
steps:
162170
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
@@ -191,6 +199,7 @@ jobs:
191199
test-bun:
192200
name: Bun (${{ matrix.bun }})
193201
runs-on: ubuntu-latest
202+
timeout-minutes: 15
194203
strategy:
195204
fail-fast: false
196205
matrix:
@@ -228,6 +237,7 @@ jobs:
228237
test-esbuild:
229238
name: esbuild transpilation
230239
runs-on: ubuntu-latest
240+
timeout-minutes: 15
231241
steps:
232242
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
233243

‎.github/workflows/cli-scaffold-matrix.yml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ jobs:
3737
discover:
3838
name: discover combinations
3939
runs-on: ubuntu-latest
40+
timeout-minutes: 15
4041
outputs:
4142
combos: ${{ steps.list.outputs.combos }}
4243
steps:
@@ -54,6 +55,7 @@ jobs:
5455
name: "init ${{ matrix.combo.name }}"
5556
needs: discover
5657
runs-on: ubuntu-latest
58+
timeout-minutes: 15
5759
strategy:
5860
fail-fast: false
5961
matrix:

‎.github/workflows/create-release.yml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ jobs:
1515
release:
1616
name: Create Release
1717
runs-on: ubuntu-latest
18+
timeout-minutes: 15
1819
steps:
1920
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
2021
with:

‎.github/workflows/parity-gate.yml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ jobs:
2727
parity:
2828
name: HTTP ↔ in-process parity
2929
runs-on: ubuntu-latest
30+
timeout-minutes: 15
3031
steps:
3132
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
3233

‎.github/workflows/release.yml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ jobs:
1717
release:
1818
name: Release & Publish
1919
runs-on: ubuntu-latest
20+
# Longer than the CI jobs: a release run publishes 15 packages to npm.
21+
timeout-minutes: 30
2022
steps:
2123
- name: Generate App token
2224
id: app-token

‎.github/workflows/snapshot.yml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ jobs:
1616
snapshot:
1717
name: Publish PR Snapshot
1818
runs-on: ubuntu-latest
19+
timeout-minutes: 15
1920
steps:
2021
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
2122

@@ -37,6 +38,7 @@ jobs:
3738
name: "Release Gate (Node ${{ matrix.node-version }})"
3839
needs: snapshot
3940
runs-on: ubuntu-latest
41+
timeout-minutes: 15
4042
strategy:
4143
fail-fast: false
4244
matrix:

0 commit comments

Comments
 (0)