From b9792160e29242f8df5e2d8dc673ea05b81fc471 Mon Sep 17 00:00:00 2001 From: Doyle <873891+chrisdoyle@users.noreply.github.com> Date: Thu, 25 Dec 2025 16:17:17 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=BE=20feat:=20Add=20Memory=20Configura?= =?UTF-8?q?tion=20Options=20for=20CI=20unit=20tests=20(#10567)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 💾 feat: Add Memory Configuration Options for CI unit tests - configured GitHub Actions workflows with configurable Node.js heap allocation, defaults to 6144 MiB - added heap usage logging for memory monitoring and debugging - increased Docker frontend build memory allocation to ensure consistent memory limits - optimized Jest timeout for tokenSplit test * 💾 feat: Add Memory Configuration Options for CI unit tests - responding to PR feedback from Copilot --- .env.example | 12 ++++++++++++ .github/workflows/backend-review.yml | 1 + .github/workflows/frontend-review.yml | 4 ++++ Dockerfile | 7 +++++-- Dockerfile.multi | 6 +++++- api/package.json | 2 +- api/test/.env.test.example | 4 ++++ client/package.json | 2 +- packages/data-provider/package.json | 2 +- 9 files changed, 34 insertions(+), 6 deletions(-) diff --git a/.env.example b/.env.example index f6930b8564..0f9c58dab9 100644 --- a/.env.example +++ b/.env.example @@ -68,6 +68,18 @@ DEBUG_CONSOLE=false # UID=1000 # GID=1000 +#==============# +# Node Options # +#==============# + +# NOTE: NODE_MAX_OLD_SPACE_SIZE is NOT recognized by Node.js directly. +# This variable is used as a build argument for Docker or CI/CD workflows, +# and is NOT used by Node.js to set the heap size at runtime. +# To configure Node.js memory, use NODE_OPTIONS, e.g.: +# NODE_OPTIONS="--max-old-space-size=6144" +# See: https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-mib +NODE_MAX_OLD_SPACE_SIZE=6144 + #===============# # Configuration # #===============# diff --git a/.github/workflows/backend-review.yml b/.github/workflows/backend-review.yml index 8375f398c3..2379b8fee7 100644 --- a/.github/workflows/backend-review.yml +++ b/.github/workflows/backend-review.yml @@ -24,6 +24,7 @@ jobs: BAN_DURATION: ${{ secrets.BAN_DURATION }} BAN_INTERVAL: ${{ secrets.BAN_INTERVAL }} NODE_ENV: CI + NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}' steps: - uses: actions/checkout@v4 - name: Use Node.js 20.x diff --git a/.github/workflows/frontend-review.yml b/.github/workflows/frontend-review.yml index 907d07d307..989e2e4abe 100644 --- a/.github/workflows/frontend-review.yml +++ b/.github/workflows/frontend-review.yml @@ -16,6 +16,8 @@ jobs: name: Run frontend unit tests on Ubuntu timeout-minutes: 60 runs-on: ubuntu-latest + env: + NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}' steps: - uses: actions/checkout@v4 - name: Use Node.js 20.x @@ -38,6 +40,8 @@ jobs: name: Run frontend unit tests on Windows timeout-minutes: 60 runs-on: windows-latest + env: + NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}' steps: - uses: actions/checkout@v4 - name: Use Node.js 20.x diff --git a/Dockerfile b/Dockerfile index 1d40714e90..9c490b63cd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,6 +14,9 @@ ENV LD_PRELOAD=/usr/lib/libjemalloc.so.2 COPY --from=ghcr.io/astral-sh/uv:0.9.5-python3.12-alpine /usr/local/bin/uv /usr/local/bin/uvx /bin/ RUN uv --version +# Set configurable max-old-space-size with default +ARG NODE_MAX_OLD_SPACE_SIZE=6144 + RUN mkdir -p /app && chown node:node /app WORKDIR /app @@ -39,8 +42,8 @@ RUN \ COPY --chown=node:node . . RUN \ - # React client build - NODE_OPTIONS="--max-old-space-size=2048" npm run frontend; \ + # React client build with configurable memory + NODE_OPTIONS="--max-old-space-size=${NODE_MAX_OLD_SPACE_SIZE}" npm run frontend; \ npm prune --production; \ npm cache clean --force diff --git a/Dockerfile.multi b/Dockerfile.multi index 89a07087f0..fee3550ada 100644 --- a/Dockerfile.multi +++ b/Dockerfile.multi @@ -1,12 +1,16 @@ # Dockerfile.multi # v0.8.2-rc1 +# Set configurable max-old-space-size with default +ARG NODE_MAX_OLD_SPACE_SIZE=6144 + # Base for all builds FROM node:20-alpine AS base-min # Install jemalloc RUN apk add --no-cache jemalloc # Set environment variable to use jemalloc ENV LD_PRELOAD=/usr/lib/libjemalloc.so.2 + WORKDIR /app RUN apk --no-cache add curl RUN npm config set fetch-retry-maxtimeout 600000 && \ @@ -59,7 +63,7 @@ COPY client ./ COPY --from=data-provider-build /app/packages/data-provider/dist /app/packages/data-provider/dist COPY --from=client-package-build /app/packages/client/dist /app/packages/client/dist COPY --from=client-package-build /app/packages/client/src /app/packages/client/src -ENV NODE_OPTIONS="--max-old-space-size=2048" +ENV NODE_OPTIONS="--max-old-space-size=${NODE_MAX_OLD_SPACE_SIZE}" RUN npm run build # API setup (including client dist) diff --git a/api/package.json b/api/package.json index 771b2e102b..e2509200eb 100644 --- a/api/package.json +++ b/api/package.json @@ -7,7 +7,7 @@ "server-dev": "echo 'please run this from the root directory'", "test": "cross-env NODE_ENV=test jest", "b:test": "NODE_ENV=test bun jest", - "test:ci": "jest --ci", + "test:ci": "jest --ci --logHeapUsage", "add-balance": "node ./add-balance.js", "list-balances": "node ./list-balances.js", "user-stats": "node ./user-stats.js", diff --git a/api/test/.env.test.example b/api/test/.env.test.example index 9b7a75a996..587a739cc3 100644 --- a/api/test/.env.test.example +++ b/api/test/.env.test.example @@ -11,3 +11,7 @@ OPENAI_API_KEY=your-api-key BAN_VIOLATIONS=true BAN_DURATION=7200000 BAN_INTERVAL=20 + +# NODE_MAX_OLD_SPACE_SIZE is only used as a Docker build argument. +# Node.js does NOT recognize this environment variable for heap size. +NODE_MAX_OLD_SPACE_SIZE=6144 diff --git a/client/package.json b/client/package.json index 519df48051..ed64522e3c 100644 --- a/client/package.json +++ b/client/package.json @@ -12,7 +12,7 @@ "dev": "cross-env NODE_ENV=development vite", "preview-prod": "cross-env NODE_ENV=development vite preview", "test": "cross-env NODE_ENV=development jest --watch", - "test:ci": "cross-env NODE_ENV=development jest --ci", + "test:ci": "cross-env NODE_ENV=development jest --ci --logHeapUsage", "b:test": "NODE_ENV=test bunx jest --watch", "b:build": "NODE_ENV=production bun --bun vite build", "b:dev": "NODE_ENV=development bunx vite" diff --git a/packages/data-provider/package.json b/packages/data-provider/package.json index 5966ca9e0f..4d03d5f2f0 100644 --- a/packages/data-provider/package.json +++ b/packages/data-provider/package.json @@ -23,7 +23,7 @@ "build:watch": "rollup -c -w", "rollup:api": "npx rollup -c server-rollup.config.js --bundleConfigAsCjs", "test": "jest --coverage --watch", - "test:ci": "jest --coverage --ci", + "test:ci": "jest --coverage --ci --logHeapUsage", "verify": "npm run test:ci", "b:clean": "bun run rimraf dist", "b:build": "bun run b:clean && bun run rollup -c --silent --bundleConfigAsCjs"