fix: 프로필 프론트 빌드 heap을 분리
운영 runtime의 공용 Node heap은 유지하면서 profile vue-tsc와 Vite build에만 별도 NODE_OPTIONS를 적용한다.\n\nsam.hided.net HWE에서 확인한 1536 MiB heap OOM을 2048 MiB build override로 처리할 수 있도록 회귀 테스트와 운영 문서를 추가한다.
This commit is contained in:
@@ -512,13 +512,15 @@ const sanitizeArtifactName = (value: string): string => value.replace(/[^0-9A-Za
|
|||||||
const buildProfileFrontendOutDir = (workspaceRoot: string, profileName: string): string =>
|
const buildProfileFrontendOutDir = (workspaceRoot: string, profileName: string): string =>
|
||||||
path.join(workspaceRoot, '.release-dist', sanitizeArtifactName(profileName), 'game-frontend');
|
path.join(workspaceRoot, '.release-dist', sanitizeArtifactName(profileName), 'game-frontend');
|
||||||
|
|
||||||
const buildProfileFrontendCommands = (
|
export const buildProfileFrontendCommands = (
|
||||||
workspaceRoot: string,
|
workspaceRoot: string,
|
||||||
profile: Pick<GatewayProfileRecord, 'profileName' | 'profile' | 'apiPort'>,
|
profile: Pick<GatewayProfileRecord, 'profileName' | 'profile' | 'apiPort'>,
|
||||||
env?: Record<string, string>
|
env?: Record<string, string>
|
||||||
): BuildCommand[] => {
|
): BuildCommand[] => {
|
||||||
|
const profileFrontendBuildNodeOptions = env?.PROFILE_FRONTEND_BUILD_NODE_OPTIONS?.trim();
|
||||||
const buildEnv = {
|
const buildEnv = {
|
||||||
...(env ?? {}),
|
...(env ?? {}),
|
||||||
|
...(profileFrontendBuildNodeOptions ? { NODE_OPTIONS: profileFrontendBuildNodeOptions } : {}),
|
||||||
VITE_APP_BASE_PATH: `/${profile.profile}`,
|
VITE_APP_BASE_PATH: `/${profile.profile}`,
|
||||||
VITE_GAME_API_URL: `/${profile.profile}/api/trpc`,
|
VITE_GAME_API_URL: `/${profile.profile}/api/trpc`,
|
||||||
VITE_GAME_SSE_URL: `/${profile.profile}/api/events`,
|
VITE_GAME_SSE_URL: `/${profile.profile}/api/events`,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { describe, expect, it } from 'vitest';
|
|||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
buildProfileFrontendCommands,
|
||||||
buildProfileMigrationCommand,
|
buildProfileMigrationCommand,
|
||||||
buildProcessDefinitions,
|
buildProcessDefinitions,
|
||||||
buildWorkspaceCommands,
|
buildWorkspaceCommands,
|
||||||
@@ -330,3 +331,30 @@ describe('buildWorkspaceCommands', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('buildProfileFrontendCommands', () => {
|
||||||
|
it('uses a profile frontend build-only Node heap without changing the shared runtime heap', () => {
|
||||||
|
const workspaceRoot = '/srv/sammo/worktrees/0123456789abcdef';
|
||||||
|
const commands = buildProfileFrontendCommands(workspaceRoot, buildProfile(), {
|
||||||
|
NODE_OPTIONS: '--max-old-space-size=1536',
|
||||||
|
PROFILE_FRONTEND_BUILD_NODE_OPTIONS: '--max-old-space-size=2048',
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(commands).toHaveLength(2);
|
||||||
|
expect(commands.every((command) => command.env?.NODE_OPTIONS === '--max-old-space-size=2048')).toBe(true);
|
||||||
|
expect(
|
||||||
|
commands.every(
|
||||||
|
(command) => command.env?.PROFILE_FRONTEND_BUILD_NODE_OPTIONS === '--max-old-space-size=2048'
|
||||||
|
)
|
||||||
|
).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('keeps the shared Node heap when no frontend build override is configured', () => {
|
||||||
|
const workspaceRoot = '/srv/sammo/worktrees/0123456789abcdef';
|
||||||
|
const commands = buildProfileFrontendCommands(workspaceRoot, buildProfile(), {
|
||||||
|
NODE_OPTIONS: '--max-old-space-size=1536',
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(commands.every((command) => command.env?.NODE_OPTIONS === '--max-old-space-size=1536')).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -56,9 +56,12 @@ profile 범위 권한과 별개인 전역 `admin.releases.manage` 권한이 필
|
|||||||
`NODE_OPTIONS`와 `RAYON_NUM_THREADS`는 출력에는 영향을 주지 않는 resource 제한으로
|
`NODE_OPTIONS`와 `RAYON_NUM_THREADS`는 출력에는 영향을 주지 않는 resource 제한으로
|
||||||
build child에 전달됩니다.
|
build child에 전달됩니다.
|
||||||
- `TURN_DAEMON_NODE_OPTIONS`가 설정되어 있으면 Gateway orchestrator는 그 값을
|
- `TURN_DAEMON_NODE_OPTIONS`가 설정되어 있으면 Gateway orchestrator는 그 값을
|
||||||
turn-daemon PM2 process의 `NODE_OPTIONS`로만 덮어씁니다. API·frontend·worker와
|
turn-daemon PM2 process의 `NODE_OPTIONS`로만 덮어씁니다. API·frontend·worker는
|
||||||
build는 공용 `NODE_OPTIONS`를 계속 사용합니다. 전용 heap을 늘릴 때는 runtime
|
공용 `NODE_OPTIONS`를 계속 사용합니다. Profile의 `vue-tsc`와 Vite build만 더 큰
|
||||||
container hard limit과 전체 process RSS를 먼저 확인합니다.
|
heap이 필요하면 `PROFILE_FRONTEND_BUILD_NODE_OPTIONS`를 지정합니다. 이 값은
|
||||||
|
profile frontend build child의 `NODE_OPTIONS`만 덮어쓰며 server package Turbo
|
||||||
|
build와 배포 후 PM2 process의 heap은 바꾸지 않습니다. 전용 heap을 늘릴 때는
|
||||||
|
runtime container hard limit과 전체 process RSS를 먼저 확인합니다.
|
||||||
- migration 이후 이전 애플리케이션으로 돌아갈 때 schema 하위 호환성이
|
- migration 이후 이전 애플리케이션으로 돌아갈 때 schema 하위 호환성이
|
||||||
유지됩니다.
|
유지됩니다.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user