[CL-CI-API-TSC-OOM] CI(API): heap 4096 для tsc — фикс OOM #916

Merged
andrei merged 4 commits from fix/claude-ci-api-tsc-oom into master 2026-06-26 19:30:04 +00:00
Owner

Что сделано

В .forgejo/workflows/ci.yml, job API, шаг Typecheck: npx tsc --noEmitNODE_OPTIONS=--max-old-space-size=4096 npx tsc --noEmit. Обновлён устаревший комментарий.

Зачем

CI/API падал (d0392b61, d0c0d9c3). Реальная причина из CI-лога (forgejo actions task 29990): после prisma migrate deploy шаг Typecheck вылетал в JS heap OOMFATAL ERROR: Ineffective mark-compacts near heap limit, ~2024MB при auto-heap ~2069MB. Рост кодовой базы (merge feature/turkish-whatsapp-b2b) перерос auto-default heap job-контейнера (≈ container_mem/2). Прежний фикс (поднятие --memory до 4g) дал лишь ~2069MB, чего уже не хватает.

Шаг Typecheck в job API был единственным без явного heap-лимита; job App и Contracts Typecheck + vitest-степ уже используют NODE_OPTIONS=--max-old-space-size=4096 и зелёные на этом же runner. Поэтому App-джоб проходил, а API — нет.

План тестирования

  • Из CI-лога (task 29990) подтверждено: единственный шаг до падения — Typecheck (OOM сразу после migrate deploy); до eslint/guards/vitest джоб не доходил.
  • Локально все CI/API-степы зелёные (env-specific OOM не воспроизводится на машине с большим RAM — там auto-heap выше).
  • pre-push [RADICAL]: prisma generate + app build (176 routes) + api vitest (189 passed) — PASS.
  • Финальная верификация — повторный прогон CI на этой ветке (heap 4096MB снимает OOM).

Где могу ошибаться

  • OOM env-specific: локально не воспроизвёл, доверяю CI-логу + 3 зелёным прецедентам (App/Contracts/vitest с тем же флагом на том же runner). Если CI на ветке всё же красный — fallback: поднять --memory runner-контейнера или явный node --max-old-space-size.
  • Старый комментарий утверждал «tsc игнорирует NODE_OPTIONS» — опроверг зелёными job App/Contracts; если окажется, что App просто требует меньше памяти, потребуется прямой node --max-old-space-size=4096 node_modules/typescript/bin/tsc.
## Что сделано В `.forgejo/workflows/ci.yml`, job **API**, шаг **Typecheck**: `npx tsc --noEmit` → `NODE_OPTIONS=--max-old-space-size=4096 npx tsc --noEmit`. Обновлён устаревший комментарий. ## Зачем CI/API падал (d0392b61, d0c0d9c3). Реальная причина из CI-лога (forgejo actions task 29990): после `prisma migrate deploy` шаг Typecheck вылетал в **JS heap OOM** — `FATAL ERROR: Ineffective mark-compacts near heap limit`, ~2024MB при auto-heap ~2069MB. Рост кодовой базы (merge `feature/turkish-whatsapp-b2b`) перерос auto-default heap job-контейнера (≈ container_mem/2). Прежний фикс (поднятие `--memory` до 4g) дал лишь ~2069MB, чего уже не хватает. Шаг Typecheck в job API был единственным без явного heap-лимита; job **App** и **Contracts** Typecheck + vitest-степ уже используют `NODE_OPTIONS=--max-old-space-size=4096` и **зелёные** на этом же runner. Поэтому App-джоб проходил, а API — нет. ## План тестирования - Из CI-лога (task 29990) подтверждено: единственный шаг до падения — Typecheck (OOM сразу после `migrate deploy`); до eslint/guards/vitest джоб не доходил. - Локально все CI/API-степы зелёные (env-specific OOM не воспроизводится на машине с большим RAM — там auto-heap выше). - pre-push [RADICAL]: prisma generate + app build (176 routes) + api vitest (189 passed) — PASS. - Финальная верификация — повторный прогон CI на этой ветке (heap 4096MB снимает OOM). ## Где могу ошибаться - OOM env-specific: локально не воспроизвёл, доверяю CI-логу + 3 зелёным прецедентам (App/Contracts/vitest с тем же флагом на том же runner). Если CI на ветке всё же красный — fallback: поднять `--memory` runner-контейнера или явный `node --max-old-space-size`. - Старый комментарий утверждал «tsc игнорирует NODE_OPTIONS» — опроверг зелёными job App/Contracts; если окажется, что App просто требует меньше памяти, потребуется прямой `node --max-old-space-size=4096 node_modules/typescript/bin/tsc`.
[CL-CI-API-TSC-OOM] CI(API): поднять heap для tsc (--max-old-space-size=4096) — фикс OOM
Some checks failed
CI / Contracts (pull_request) Successful in 2m8s
CI / Telegram Mini App (pull_request) Successful in 1m21s
CI / Python SDK (pull_request) Successful in 26s
CI / Secrets Scan (pull_request) Successful in 14s
CI / API (pull_request) Failing after 5m15s
PR Janitor / janitor (pull_request) Successful in 8s
CI / Prisma Migrate Gate (pull_request) Successful in 1m31s
CI / App (pull_request) Successful in 15m51s
5ed09034c6
CI/API падал: после `prisma migrate deploy` шаг Typecheck (`npx tsc --noEmit`)
вылетал в JS heap OOM (FATAL: Ineffective mark-compacts near heap limit, ~2024MB
при auto-heap ~2069MB). Рост кодовой базы (merge feature/turkish-whatsapp-b2b)
перерос auto-default heap job-контейнера (~container_mem/2).

Шаг Typecheck в job API был единственным без явного лимита heap; job App и Contracts
Typecheck, а также vitest-степ уже используют NODE_OPTIONS=--max-old-space-size=4096
и зелёные на этом же runner (--memory=4g). Привёл API к тому же виду.

Почему App зелёный, API красный: App tsc уже имел флаг, API — нет.
Локально не воспроизводится (env-specific: на машине с большим RAM auto-heap выше).
Верификация: повторный прогон CI после merge.
[CL-CI-API-TSC-OOM] CI(API): прямой node-вызов tsc с heap — фикс #1 (NODE_OPTIONS) не сработал
Some checks failed
CI / Contracts (pull_request) Successful in 1m59s
CI / Telegram Mini App (pull_request) Successful in 1m23s
CI / Python SDK (pull_request) Successful in 26s
CI / Secrets Scan (pull_request) Successful in 13s
CI / API (pull_request) Failing after 5m6s
PR Janitor / janitor (pull_request) Successful in 8s
CI / Prisma Migrate Gate (pull_request) Successful in 1m28s
CI / App (pull_request) Successful in 14m51s
bca93ba19e
Фикс #1 (NODE_OPTIONS=--max-old-space-size=4096 npx tsc) НЕ помог: OOM повторился
на 5ed0903 (CI task 30005, тот же FATAL Ineffective mark-compacts). Подтверждено:
tsc в CI игнорирует NODE_OPTIONS (как и предупреждала прежняя заметка). Job App/Contracts
проходят с этим флагом лишь потому, что их tsc требует меньше памяти.

Рабочая форма — прямой node-вызов с флагом heap:
  node --max-old-space-size=4096 node_modules/typescript/bin/tsc --noEmit
(локально подтверждено: эта форма поднимает heap до ~4144MB и tsc запускается, Version 6.0.3).
[CL-CI-API-TSC-OOM] re-trigger CI on 6g runner (verify OOM fix)
Some checks failed
CI / App (pull_request) Has started running
CI / API (pull_request) Failing after 5m19s
PR Janitor / janitor (pull_request) Successful in 8s
CI / Prisma Migrate Gate (pull_request) Has been cancelled
CI / Contracts (pull_request) Has been cancelled
CI / Telegram Mini App (pull_request) Has been cancelled
CI / Python SDK (pull_request) Has been cancelled
CI / Secrets Scan (pull_request) Has been cancelled
4b71b5a13d
[CL-CI-API-TSC-OOM] CI(API): heap 4096 и для Lint (eslint) — настоящий упавший степ
All checks were successful
CI / Contracts (pull_request) Successful in 2m4s
CI / Telegram Mini App (pull_request) Successful in 1m25s
CI / API (pull_request) Successful in 14m32s
CI / Python SDK (pull_request) Successful in 46s
CI / Secrets Scan (pull_request) Successful in 16s
PR Janitor / janitor (pull_request) Successful in 9s
CI / App (pull_request) Successful in 14m30s
CI / Prisma Migrate Gate (pull_request) Successful in 1m46s
71d7b5d8c0
Расследование (forgejo-db action_task_step) показало: реально падал НЕ Typecheck,
а step Lint (eslint OOM). fix#1 (NODE_OPTIONS на Typecheck) починил Typecheck
(task 30005: Typecheck PASS), но OOM переехал на Lint — я ошибочно принял его за
«tsc всё ещё падает».

Корень общий: рост кодовой базы (turkish-b2b) поднял пик памяти tsc И eslint выше
auto-heap контейнера (cgroup ~container/2 ≈ 2064MB при --memory=4g). Явный
--max-old-space-size перебивает cgroup-clamp (docker node22: 4g+флаг → 4144MB).

Фикс: NODE_OPTIONS=--max-old-space-size=4096 и на Typecheck (консистентно с App/Contracts),
и на Lint. Откатил прежний direct-node вариант + поправил неверный комментарий
(NODE_OPTIONS не игнорируется — он работает, что подтверждено task 30005).
andrei merged commit 20a95d0030 into master 2026-06-26 19:30:04 +00:00
andrei deleted branch fix/claude-ci-api-tsc-oom 2026-06-26 19:30:04 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
europa-tech-srl/europatech!916
No description provided.