Skip to content

feat(installer): embed AlphaServer inside AlphaClient.app for one-click .dmg#6

Open
imhyunho99 wants to merge 1 commit into
mainfrom
feat/embed-server-in-app
Open

feat(installer): embed AlphaServer inside AlphaClient.app for one-click .dmg#6
imhyunho99 wants to merge 1 commit into
mainfrom
feat/embed-server-in-app

Conversation

@imhyunho99

Copy link
Copy Markdown
Owner

Summary

  • DMG에서 AlphaClient.app만 Applications으로 드래그하면 서버까지 자동 기동되도록 AlphaServer를 .app 번들 안에 임베드.
  • AlphaClient.spec onefile→onedir 전환 (PyInstaller v7 호환 + 런타임 압축해제 비용 제거).
  • DMG 빌더 hdiutil unmount 경합 재시도 로직 추가 + SKIP_BUILD 옵션 추가.

Why

v3.1.2의 "GUI 시작 시 AlphaServer 자동 기동"은 사용자가 AlphaServer 폴더를 별도로 `/Applications/AlphaServer/` 등에 복사해야만 동작하던 절반의 자동화였다. PR 본문에 "자동"이라고 적혀있었지만, 실제 사용자 시나리오에서는 "AlphaServer 바이너리를 찾지 못했습니다" 다이얼로그가 떴다. 이제 사용자는 .dmg 더블클릭 → AlphaClient.app 드래그 → 더블클릭만 하면 끝.

변경 파일

파일 내용
`AlphaClient.spec` `dist/AlphaServer/`를 datas로 임베드, onedir + COLLECT + BUNDLE 패턴
`alpha/server_launcher.py` macOS .app 임베드 경로(Frameworks, Resources) 우선 탐색
`scripts/build_macos_installer.sh` 별도 AlphaServer 폴더 제거, hdiutil 재시도, SKIP_BUILD 옵션
`.github/workflows/release.yml` Windows zip 스테이징도 별도 서버 복사 제거
`tests/test_unit.py` 임베드 경로 우선순위 단위 테스트 추가
`CLAUDE.md`, `.claude/settings.json`, `.gitignore` Claude Code 프로젝트 컨텍스트 + 권한 allowlist

Test plan

  • `pytest tests/test_unit.py` 19/19 통과
  • `VERSION=3.1.3-dev ./scripts/build_macos_installer.sh` → `dist/Alpha-3.1.3-dev-macOS.dmg` (123MB) 생성
  • DMG 마운트 후 `AlphaClient.app/Contents/Frameworks/AlphaServer/AlphaServer` (27M, +x) 임베드 확인
  • 사용자 E2E: DMG 더블클릭 → AlphaClient.app을 Applications으로 드래그 → Launchpad에서 AlphaClient 실행 → 첫 admin 비밀번호 설정 → GUI 정상 표시 → `lsof -i :8000`로 임베드 서버 동작 확인
  • CI green
  • 머지 후 `v3.1.3` 태그로 release.yml 트리거 (Windows .exe + macOS .dmg 자동 빌드/첨부)

🤖 Generated with Claude Code

…ck .dmg

DMG에서 AlphaClient.app 만 끌어다 놓으면 끝나도록 서버 바이너리를
.app 번들 안(Contents/Frameworks/AlphaServer/)에 같이 넣는다. 이전엔
사용자가 AlphaServer 폴더를 별도로 /Applications/AlphaServer/ 등에
복사해야 자동 기동이 동작하던 절반의 자동화 상태였다.

핵심 변경:
- AlphaClient.spec: dist/AlphaServer/를 datas로 임베드. 빌드 순서가
  깨지면(서버 안 빌드된 채 client만 빌드) SystemExit으로 빠르게 실패.
  onefile→onedir 전환 — onefile + .app 번들은 PyInstaller v7에서 에러가
  되고, 200MB+ 서버를 매 실행마다 _MEIPASS로 풀어내는 비용도 사라진다.
- alpha/server_launcher.py: macOS .app 임베드 경로(Contents/Frameworks,
  Contents/Resources) 우선 탐색. 기존 형제 디렉터리/시스템 경로 폴백 유지.
- scripts/build_macos_installer.sh:
  · DMG 안에 별도 AlphaServer 폴더 더 이상 두지 않음 (.app만 노출)
  · README.txt 안내를 "더블클릭하면 끝"으로 단순화
  · hdiutil unmount가 .DS_Store 경합으로 종종 실패하므로 detach 후
    최대 3회 재시도. SKIP_BUILD=1 환경변수로 패키징 단계만 반복 가능.
- .github/workflows/release.yml: Windows zip 스테이징도 별도 AlphaServer
  복사 제거 (스펙이 임베드하므로 자동으로 포함됨).
- tests/test_unit.py: PyInstaller .app 레이아웃 흉내내서 임베드 경로가
  시스템 경로보다 먼저 발견되는지 검증 (19/19 통과).

Harness 정리:
- CLAUDE.md 추가 — 프로젝트 컨텍스트(빌드 순서, 명령, 매매 안전장치
  invariant)를 모든 Claude Code 세션이 자동으로 받도록.
- .claude/settings.json 추가 — pytest/pyinstaller/gh/git 같은 일상
  명령을 allowlist에 넣어 권한 프롬프트를 줄임. force push, 공개 release
  삭제 등은 deny에 명시.

로컬 검증:
- pytest tests/test_unit.py: 19/19 통과
- VERSION=3.1.3-dev ./scripts/build_macos_installer.sh
- dist/Alpha-3.1.3-dev-macOS.dmg (123MB) 생성 + 마운트 후 Frameworks/
  AlphaServer/AlphaServer 임베드 + 실행 권한 확인 완료.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant