diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 850f769..26e1f4b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,13 +49,17 @@ jobs: # Hard resource ceiling so a runaway test-storybook (one headless Chromium per Jest # worker) can't OOM the runner host — it fails its own container instead. The real cap # is `--maxWorkers=2` in test-storybook:ci; this is the belt-and-suspenders guardrail. - # 6g (was 4g): build-storybook alone (compodoc + full Angular AOT build) measured ~5.8GB - # peak RSS locally, leaving too little headroom at 4g. + # 4g is enough: verified by running this job's exact steps (npm ci, playwright install, + # build-storybook, test-storybook:ci) in `docker run --cpus=2 --memory=4g + # --memory-swap=4g node:24-bookworm` locally — completes clean, no OOM. (An earlier + # unconstrained local RSS measurement of build-storybook alone suggested ~5.8GB was + # needed, but that number reflects what Node/V8 is willing to use when memory is + # plentiful, not what the job actually needs under a real cgroup cap.) # NB: requires the Gitea act_runner to allow container jobs (docker mode). If the runner # is host-only, drop this `container:` block and rely on the worker cap alone. container: image: node:24-bookworm - options: --cpus=2 --memory=6g --memory-swap=6g + options: --cpus=2 --memory=4g --memory-swap=4g timeout-minutes: 15 steps: - uses: actions/checkout@v4 diff --git a/.storybook/main.ts b/.storybook/main.ts index 12a3b69..d51adc7 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -17,5 +17,12 @@ const config: StorybookConfig = { // Serve the vendored CIBG package so preview-head.html can its CSS (and its // relative font/icon/image url()s resolve) — mirrors index.html for the real app. staticDirs: ['../public'], + // Webpack's own auto-DefinePlugin (from `optimization.nodeEnv`) and Storybook's preset both + // define `process.env.NODE_ENV` on the same compile, which webpack warns about as + // "Conflicting values" even though they resolve to the same string. Disable the redundant one. + webpackFinal: async (config) => { + config.optimization = { ...config.optimization, nodeEnv: false }; + return config; + }, }; export default config;