💾 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
This commit is contained in:
Doyle 2025-11-10 11:45:03 -05:00
parent 3213f574c6
commit b8fe41e59d
11 changed files with 31 additions and 7 deletions

View file

@ -68,6 +68,14 @@ DEBUG_CONSOLE=false
# UID=1000 # UID=1000
# GID=1000 # GID=1000
#==============#
# Node Options #
#==============#
# Used to adjust Node.js memory configuration (default: 6144 MiB)
# https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-mib
NODE_MAX_OLD_SPACE_SIZE=6144
#===============# #===============#
# Configuration # # Configuration #
#===============# #===============#

View file

@ -24,6 +24,7 @@ jobs:
BAN_DURATION: ${{ secrets.BAN_DURATION }} BAN_DURATION: ${{ secrets.BAN_DURATION }}
BAN_INTERVAL: ${{ secrets.BAN_INTERVAL }} BAN_INTERVAL: ${{ secrets.BAN_INTERVAL }}
NODE_ENV: CI NODE_ENV: CI
NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}'
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Use Node.js 20.x - name: Use Node.js 20.x

View file

@ -26,7 +26,7 @@ jobs:
username: ${{ secrets.REGISTRY_USERNAME }} username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }} password: ${{ secrets.REGISTRY_PASSWORD }}
- run: | - run: |
docker build --build-arg RUNNER_VERSION=${{ env.RUNNER_VERSION }} -t ${{ secrets.REGISTRY_LOGIN_SERVER }}/pwd9000-github-runner-lin:${{ env.RUNNER_VERSION }} . docker build --build-arg RUNNER_VERSION=${{ env.RUNNER_VERSION }} --build-arg NODE_MAX_OLD_SPACE_SIZE=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }} -t ${{ secrets.REGISTRY_LOGIN_SERVER }}/pwd9000-github-runner-lin:${{ env.RUNNER_VERSION }} .
- name: 'Push container image to ACR' - name: 'Push container image to ACR'
uses: azure/docker-login@v1 uses: azure/docker-login@v1

View file

@ -16,6 +16,8 @@ jobs:
name: Run frontend unit tests on Ubuntu name: Run frontend unit tests on Ubuntu
timeout-minutes: 60 timeout-minutes: 60
runs-on: ubuntu-latest runs-on: ubuntu-latest
env:
NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}'
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Use Node.js 20.x - name: Use Node.js 20.x
@ -38,6 +40,8 @@ jobs:
name: Run frontend unit tests on Windows name: Run frontend unit tests on Windows
timeout-minutes: 60 timeout-minutes: 60
runs-on: windows-latest runs-on: windows-latest
env:
NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}'
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Use Node.js 20.x - name: Use Node.js 20.x

View file

@ -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/ 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 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 RUN mkdir -p /app && chown node:node /app
WORKDIR /app WORKDIR /app
@ -39,8 +42,8 @@ RUN \
COPY --chown=node:node . . COPY --chown=node:node . .
RUN \ RUN \
# React client build # React client build with configurable memory
NODE_OPTIONS="--max-old-space-size=2048" npm run frontend; \ NODE_OPTIONS="--max-old-space-size=${NODE_MAX_OLD_SPACE_SIZE}" npm run frontend; \
npm prune --production; \ npm prune --production; \
npm cache clean --force npm cache clean --force

View file

@ -7,6 +7,10 @@ FROM node:20-alpine AS base-min
RUN apk add --no-cache jemalloc RUN apk add --no-cache jemalloc
# Set environment variable to use jemalloc # Set environment variable to use jemalloc
ENV LD_PRELOAD=/usr/lib/libjemalloc.so.2 ENV LD_PRELOAD=/usr/lib/libjemalloc.so.2
# Set configurable max-old-space-size with default
ARG NODE_MAX_OLD_SPACE_SIZE=6144
WORKDIR /app WORKDIR /app
RUN apk --no-cache add curl RUN apk --no-cache add curl
RUN npm config set fetch-retry-maxtimeout 600000 && \ 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=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/dist /app/packages/client/dist
COPY --from=client-package-build /app/packages/client/src /app/packages/client/src 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 RUN npm run build
# API setup (including client dist) # API setup (including client dist)

View file

@ -7,7 +7,7 @@
"server-dev": "echo 'please run this from the root directory'", "server-dev": "echo 'please run this from the root directory'",
"test": "cross-env NODE_ENV=test jest", "test": "cross-env NODE_ENV=test jest",
"b:test": "NODE_ENV=test bun jest", "b:test": "NODE_ENV=test bun jest",
"test:ci": "jest --ci", "test:ci": "jest --ci --logHeapUsage",
"add-balance": "node ./add-balance.js", "add-balance": "node ./add-balance.js",
"list-balances": "node ./list-balances.js", "list-balances": "node ./list-balances.js",
"user-stats": "node ./user-stats.js", "user-stats": "node ./user-stats.js",

View file

@ -11,3 +11,5 @@ OPENAI_API_KEY=your-api-key
BAN_VIOLATIONS=true BAN_VIOLATIONS=true
BAN_DURATION=7200000 BAN_DURATION=7200000
BAN_INTERVAL=20 BAN_INTERVAL=20
NODE_MAX_OLD_SPACE_SIZE=6144

View file

@ -16,3 +16,5 @@ process.env.ALLOW_EMAIL_LOGIN = 'true';
// This can be overridden in individual tests if needed // This can be overridden in individual tests if needed
jest.setTimeout(30000); jest.setTimeout(30000);
process.env.OPENAI_API_KEY = 'test'; process.env.OPENAI_API_KEY = 'test';
process.env.NODE_MAX_OLD_SPACE_SIZE = '6144';

View file

@ -12,7 +12,7 @@
"dev": "cross-env NODE_ENV=development vite", "dev": "cross-env NODE_ENV=development vite",
"preview-prod": "cross-env NODE_ENV=development vite preview", "preview-prod": "cross-env NODE_ENV=development vite preview",
"test": "cross-env NODE_ENV=development jest --watch", "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:test": "NODE_ENV=test bunx jest --watch",
"b:build": "NODE_ENV=production bun --bun vite build", "b:build": "NODE_ENV=production bun --bun vite build",
"b:dev": "NODE_ENV=development bunx vite" "b:dev": "NODE_ENV=development bunx vite"

View file

@ -23,7 +23,7 @@
"build:watch": "rollup -c -w", "build:watch": "rollup -c -w",
"rollup:api": "npx rollup -c server-rollup.config.js --bundleConfigAsCjs", "rollup:api": "npx rollup -c server-rollup.config.js --bundleConfigAsCjs",
"test": "jest --coverage --watch", "test": "jest --coverage --watch",
"test:ci": "jest --coverage --ci", "test:ci": "jest --coverage --ci --logHeapUsage",
"verify": "npm run test:ci", "verify": "npm run test:ci",
"b:clean": "bun run rimraf dist", "b:clean": "bun run rimraf dist",
"b:build": "bun run b:clean && bun run rollup -c --silent --bundleConfigAsCjs" "b:build": "bun run b:clean && bun run rollup -c --silent --bundleConfigAsCjs"