Skip to content

후속(배포): Electron 패키징 파이프라인 (builder/forge·autoUpdater·코드서명) #74

Description

@pdw96

배경 / 문제

Fleet 은 Electron 데스크톱 앱이지만 배포 산출물(설치 파일)을 만드는 파이프라인이 전혀 없다. 현재 빌드 체인은 electron-viteout/ 디렉터리에 번들만 만들 뿐, 설치 가능한 바이너리(.exe/.dmg/.AppImage)·자동 업데이트·코드 서명이 없다.

검증한 현재 상태:

  • package.json:12-23scriptsdev/build/preview/typecheck/lint/test/brain 만 존재 — package/make/dist/release 류 스크립트 없음.
  • package.json:24-46devDependencieselectron-builder·@electron-forge/* 없음. 빌드 도구는 electron-vite ^2.3.0 (package.json:35) 뿐.
  • electron.vite.config.ts:5-29 는 main/preload/renderer 번들 입력만 정의 — 패키징/배포 설정 일절 없음.
  • 별도 electron-builder.{json,yml} / forge.config.{js,ts} 파일 없음(글롭 검색 0건).
  • src/ 전체에 electron-builder·electron-forge·autoUpdater·app-update 사용 0건(grep 검증).
  • .github/workflows/ci.yml:38-39build 잡은 npm run build(= electron-vite build)를 "기동 가능성 smoke" 로만 돌릴 뿐, 릴리스/아티팩트 업로드/퍼블리시 단계가 없다. 릴리스 전용 워크플로도 부재.
  • DESIGN.md:212npm run build 를 "산출물 생성 = 기동 가능성 smoke" 로 규정 — 즉 현재 "build" 의 의미는 설치 패키지가 아니라 번들 smoke 이다.
  • package.json:3-4: version: 0.1.0, private: true. git 태그/릴리스 0건.

결론: 코드 변경분이 실제 사용자에게 전달될 경로가 없다. 특히 Electron 메이저 업그레이드(electron ^33.0.0, package.json:34)의 EOL/CVE 수정 페이로드가 사용자에게 닿으려면 이 파이프라인이 선행 조건이다.

범위

  • 패키징 도구 선택·도입(electron-builder 또는 @electron-forge/*). electron-vite 통합 호환성 우선 검토(context7 로 현행 버전 가이드 확인).
  • 플랫폼별 타깃 산출물 정의: Windows(NSIS .exe), macOS(.dmg), Linux(.AppImage) — 최소 1개 플랫폼부터.
  • package.json:12-23package/dist(또는 make) 스크립트 추가, electron-vite build 산출물(out/)을 패키징 입력으로 연결.
  • 패키징 설정 파일(electron-builder.yml 또는 forge.config.ts) 추가 — appId·productName·아이콘·파일 포함 규칙.
  • autoUpdater 도입(GitHub Releases 또는 별도 피드 채널) + 업데이트 확인/적용 main 프로세스 배선.
  • 코드 서명: macOS(Apple Developer ID + notarization), Windows(Authenticode) — 유료 인증서 종속이므로 인증서 미보유 시 unsigned 빌드도 산출 가능하게 분기.
  • 릴리스 전용 CI 워크플로(.github/workflows/release.yml) 추가 — 태그 푸시 시 멀티 플랫폼 빌드·서명·릴리스 업로드. 인증서/토큰은 GitHub Secrets.
  • 시크릿(서명 인증서·퍼블리시 토큰)은 CI Secrets 로만 주입, 리포지토리 미커밋 보장.
  • README.md/DESIGN.md 에 배포 절차·릴리스 프로세스 문서화(현행 DESIGN.md:193-213 MVP 범위/품질 게이트 갱신).

근거

점수(7차 재랭킹): 가치 2 / 노력 4 / 위험 3, 🟡 Later(6차 확정).

  • 가치 2 — 다운그레이드/부분 반증. 로드맵 노트의 "키스톤 블로커" 표현은 사실이나, 코드 대조 결과 보호할 사용자 베이스가 없다: git 태그·릴리스 0건, private: true, v0.1.0(package.json:3-4), 설치 유저 0명. 즉 "배포 채널 부재" 는 실재하지만 그로 인한 현 시점 피해는 이론에 그친다. 6차 재랭킹에서 Later 로 확정된 근거가 코드로도 재확인됨.
  • 노력 4 — 높음. 도구 선택·플랫폼별 타깃·autoUpdater 배선·CI 릴리스 워크플로·문서화까지 표면이 넓다.
  • 위험 3. 유료 코드서명 인증서(Apple Developer ID / Authenticode) 종속, 멀티 플랫폼 CI flakiness, 서명/notarization 실패 가능성.
  • 의도된 제외. DESIGN.md:193-204 MVP 범위는 "빌드·기동되는 Electron 앱(smoke 통과)" 까지만 정의하고 패키징/배포를 의도적으로 제외했다. 본 이슈는 MVP 이후 출하(ship) 단계 작업이다.
  • 하류 종속 시퀀싱. electron 메이저 업그레이드(^33 EOL)의 CVE 수정이 사용자에게 전달되려면 본 파이프라인이 prereq. 따라서 "electron-major 업그레이드 → 출하" 순서에서 본 이슈가 출하 측 선행 조건이다.

의존성

없음(블로킹 이슈/PR 없음). 단, electron-major 업그레이드 작업의 출하(ship) prereq — 메이저 범프의 보안 페이로드가 사용자에게 닿으려면 본 파이프라인이 먼저 존재해야 한다(역방향 시퀀싱).

완료 조건

  • npm run package(또는 동등 스크립트)가 최소 1개 플랫폼의 설치 가능한 산출물을 생성한다.
  • 생성된 산출물이 클린 환경에서 설치·기동된다(스모크).
  • autoUpdater 가 릴리스 피드를 확인하고 업데이트를 적용할 수 있다(또는 인증서 미보유 시 unsigned 경로로 graceful degrade).
  • 태그 푸시 → 릴리스 워크플로 → 산출물 업로드 경로가 동작한다.
  • 서명 인증서·토큰이 리포지토리에 커밋되지 않고 CI Secrets 로만 주입된다.
  • npm run typecheck/lint/test/build 전부 통과(DESIGN.md:207-213).
  • 배포 절차가 문서화된다.

참조

  • 코드: package.json:12-23(scripts), package.json:24-46(devDependencies — 패키징 도구 부재), package.json:3-4(version/private), package.json:34(electron ^33.0.0)
  • 코드: electron.vite.config.ts:5-29(번들 설정 — 패키징 무관)
  • CI: .github/workflows/ci.yml:38-39(build = smoke, 릴리스 단계 없음)
  • 설계: DESIGN.md:193-204(MVP 범위 — 패키징 의도 제외), DESIGN.md:207-213(품질 게이트 — build = smoke)
  • 로드맵: 메타: 백로그 우선순위 / 로드맵 (코드 검증 기반) #27 백로그(7차 재랭킹, electron-packaging-pipeline 2/4/3, 6차 Later 확정)
  • 외부 문서: electron-builder / @electron-forge / electron autoUpdater 공식 문서(도입 시 context7 로 현행 버전 확인)

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:electronElectron 메인/데스크톱 셸/패키징enhancementNew feature or requesttier:later보류 (강등·블록·저가치)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions