[bug][ci] e2e-server в Develop виснет до лимита 6ч — jest не завершается (открытые хендлы AppModule) #252
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Симптом
Job
e2e-serverв workflow Develop (.github/workflows/develop.yml) не завершается: вместо нескольких минут он крутится до максимума GitHub Actions в 6 часов, после чего отменяется. Из-за этого:failure— он либо часамиin_progress, либоcancelled(в т.ч. из-заconcurrency: cancel-in-progress);failure, не дляcancelled), поэтому падения тестов остаются незамеченными по почте.Пример: run #28331123496 — job
testупал за 3 мин,e2e-mcpпрошёл за 5 мин, аe2e-serverвисел >2.5 ч (в истории были прогоны ровно по6h0m).Причина
pnpm --filter ./apps/server test:e2e→jest --config test/jest-e2e.json. Единственный спекapps/server/test/app.e2e-spec.tsподнимает полныйAppModule(NestFastifyApplication).Граф
AppModuleдержит долгоживущие ресурсы, которые после теста остаются открытыми:notification.processor,attachment.processor,collaboration/processors/history.processor;@nestjs/schedule:temporary-note-cleanup.service,trash-cleanup.service;app.close()вafterEachне гасит все эти хендлы, поэтому после прохождения единственного теста jest не может завершить процесс по событийному циклу и зависает. Так как у job не былоtimeout-minutes, он докручивался до дефолтного лимита 6ч.Косвенное подтверждение: дефолтный per-test timeout jest (5с) сработал бы, если бы виснул сам
app.init()вbeforeEach— значит зависание происходит после завершения теста, на этапе выхода процесса (классический «open handles»).Уже сделано (митигация)
Добавлены
timeout-minutesв CI-джобы (.github/workflows/develop.yml,.github/workflows/test.yml):e2e-server: 15,e2e-mcp: 20,build: 30,test: 20. Теперь зависание обрывается за минуты и даётfailure(→ письмо), а не 6ч. Это не чинит причину — только ограничивает ущерб.Что надо сделать (правильный фикс)
jest --config test/jest-e2e.json --detectOpenHandles --runInBandпротив реального Postgres (pgvector) + Redis (например, черезservices:прямо в CI) и зафиксировать конкретные открытые хендлы.afterAll/onModuleDestroyBullMQ-о��ереди и воркеры, ioredis-клиентов, таймеры планировщика, collab-сервер. Либо прагматичный стопгап —--forceExit(+--runInBand) дляtest:e2e.AppModuleдля smoke-тестаGET /, или достаточно урезанного тест-модуля.Ссылки
.github/workflows/develop.yml(jobe2e-server)apps/server/test/app.e2e-spec.tsapps/server/test/jest-e2e.jsonapps/server/package.json(test:e2e)