Files
pangolin/.github/workflows/test.yml
T
Parikshith 938d7f145c fix(ci): pin Node to 24.18.1 to match runtime; surface app startup logs
The `test` job intermittently fails at "Wait for app availability" because
`npm run dev` crashes on startup:

    node::RemoveEnvironmentCleanupHook(...) at ../src/api/hooks.cc:142
    Assertion failed: (env) != nullptr
      Statement::~Statement()  [better-sqlite3/build/Release/better_sqlite3.node]

Node >= 24.19.0 added node::ObjectWrap cleanup hooks that are incompatible
with NAN-style native addons such as better-sqlite3 (11.9.1, this project's
pinned version), tripping that assertion on teardown. It is intermittent (a
race during native cleanup), so the job fails on some runs and passes on
others.

The app ships on Node 24.18.1 (both Dockerfiles and .nvmrc), which predates
the breaking change, so production is unaffected. Only CI hit it, because
`setup-node` with `node-version: '24'` floats to the latest 24.x (24.20.0 at
time of failure). Pinning CI to 24.18.1 makes it test the version that
actually ships and avoids the regression.

Also capture `npm run dev` output to app.log and fail fast (printing it) if
the process exits early, so a future startup failure is diagnosable instead
of surfacing only as "App failed to start" after a 25s wait.

(Longer term, upgrading better-sqlite3 to v12+ restores Node 24.19+ support;
pinning the runtime is the minimal, prod-matching fix.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-08 16:22:39 +05:30

92 lines
2.5 KiB
YAML

name: Run Tests
permissions:
contents: read
on:
pull_request:
branches:
- main
- dev
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Install Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
# Pin to the version the app actually ships on (Dockerfile / .nvmrc).
# A bare '24' floats to the latest 24.x; Node >= 24.19.0 added
# node::ObjectWrap cleanup hooks that crash better-sqlite3 on teardown
# ("Assertion failed: (env) != nullptr" in RemoveEnvironmentCleanupHook),
# which intermittently kills `npm run dev` in the step below.
node-version: '24.18.1'
- name: Copy config file
run: cp config/config.example.yml config/config.yml
- name: Install dependencies
run: npm ci
- name: Create database index.ts
run: npm run set:sqlite
- name: Create build file
run: npm run set:oss
- name: Generate database migrations
run: npm run db:generate
- name: Apply database migrations
run: npm run db:push
- name: Test with tsc
run: npx tsc --noEmit
- name: Start app in background
run: |
nohup npm run dev > app.log 2>&1 &
echo $! > app.pid
- name: Wait for app availability
run: |
for i in {1..5}; do
if curl --silent --fail http://localhost:3002/auth/login; then
echo "App is up"
exit 0
fi
# Fail fast (and show why) if the process already exited.
if ! kill -0 "$(cat app.pid)" 2>/dev/null; then
echo "App process exited before becoming available. Output:"
cat app.log
exit 1
fi
echo "Waiting for the app... attempt $i"
sleep 5
done
echo "App failed to start. Output:"
cat app.log
exit 1
build-sqlite:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Build Docker image sqlite
run: make dev-build-sqlite
build-postgres:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Build Docker image pg
run: make dev-build-pg