d3ro-voice/docs/deployment/release-guide.md
Yun Chan c6fd8c9a9a ci: runner 인프라 정렬 + 자동 업데이트 feed 활성화 (프로젝트 1172)
- CI 태그를 실제 사내 runner에 맞게 교체: build-win-x64(TW-VIVEN-BUILD) /
  build-mac-arm64(TW-BUILD-MAC-ARM64) / build-linux-x64(TW-BUILD01, release+검증 잡)
- package-macos: volta 부트스트랩 폴백 추가
- update-feed.ts + electron-builder.yml publish.url에 프로젝트 ID 1172 기입
- release-guide: 완료된 설정 반영 (D3RO_MAC_RUNNER, registry public pull)
2026-07-21 15:33:30 +09:00

81 lines
4.4 KiB
Markdown

# D3RO Voice 릴리스 가이드
agent-switchboard-client의 릴리스 체계를 이식한 멀티플랫폼 배포 파이프라인.
## 파이프라인 개요
```
git tag vX.Y.Z → push
├─ package-windows (runner: build-win-x64, TW-VIVEN-BUILD) → NSIS exe + latest.yml
├─ package-macos (runner: build-mac-arm64, TW-BUILD-MAC-ARM64) → dmg + zip + latest-mac.yml [D3RO_MAC_RUNNER="true"일 때만]
└─ release-create (runner: build-linux-x64 Docker, TW-BUILD01)
├─ Generic Package Registry 업로드
│ ├─ d3ro-voice/<version>/ (버전별 보관)
│ └─ d3ro-voice/latest/ (electron-updater feed — 매 릴리스 갱신)
└─ GitLab Release 생성 + asset 링크
```
- 버전은 태그에서 자동 동기화된다 (`scripts/ci/sync-version.mjs``v0.2.0` → package.json `0.2.0`).
- macOS artifacts가 없으면 Windows 단독으로 릴리스가 생성된다 (경고 로그만).
## 릴리스 절차
```bash
git tag v0.2.0
git push origin v0.2.0
```
끝. 파이프라인이 패키징 → 레지스트리 업로드 → Release 생성까지 자동 수행한다.
## 사용자가 1회 설정해야 하는 것
### 1. macOS runner (2026-07-21 기준 완료됨)
사내 공용 runner `TW-BUILD-MAC-ARM64`(tags: `build-mac-arm64`)가 온라인이며,
CI 변수 `D3RO_MAC_RUNNER="true"`도 설정 완료. 별도 등록 불필요.
Mac runner 환경 전제조건 (미충족 시 package-macos 잡 실패 — allow_failure라 릴리스는 진행):
- Xcode Command Line Tools, Node 22+(또는 volta), Python 3.11+
- `brew install sox` — install-sox.sh가 이 바이너리를 번들함
### 2. 자동 업데이트 활성화 (Windows) — 2026-07-21 기준 완료됨
1. 프로젝트 ID = **1172** (기입 완료)
2. **두 곳**에 같은 feed URL 기입 (어긋나면 안 됨):
- `apps/desktop/src/main/update-feed.ts``UPDATE_FEED_URL`
- `apps/desktop/electron-builder.yml``publish.url`
```
https://gitlab.twentyoz.kr:8443/api/v4/projects/1172/packages/generic/d3ro-voice/latest
```
`publish` 섹션은 latest.yml/latest-mac.yml **생성**을 트리거하는 필수 설정이다
(없으면 electron-builder가 update info 파일을 아예 만들지 않음).
3. `package_registry_access_level=public` 설정 완료 ✅ (2026-07-21, API로 적용) —
앱의 무인증 다운로드/랜딩 페이지 다운로드 링크의 전제. 비공개로 되돌리면 자동 업데이트가 401로 조용히 중단됨.
4. v0.1.1-alpha부터 배포된 앱이 4시간 주기로 업데이트를 체크한다
### 산출물 파일명 규칙
파일명에 공백 금지 — GitLab Generic Package Registry가 공백을 불허해
latest.yml의 url과 레지스트리 파일명이 어긋나면 업데이트 다운로드가 404 난다.
- Windows: `D3RO-Voice-Setup-<version>-x64.exe`
- macOS: `D3RO-Voice-<version>-arm64.dmg` / `.zip`
## 알려진 제약 / 후속 단계
| 항목 | 현재 상태 | 후속 |
|---|---|---|
| macOS 서명/공증 | ❌ ad-hoc 서명 (`identity=-`, switchboard 검증 조합) — Gatekeeper가 차단하면 우클릭→열기 또는 `xattr -dr com.apple.quarantine "/Applications/D3RO Voice.app"` | Apple Developer 계정($99/년) 확보 시 switchboard의 prepare/cleanup-macos-keychain.mjs + 공증 패턴 이식. 주의: D3RO는 asarUnpack native 모듈 + ollama/sox 바이너리 다중 서명 필요 |
| macOS 자동 업데이트 | ❌ 미지원 (Squirrel.Mac이 서명 요구) | 서명 도입 후 latest-mac.yml feed 연결 |
| 업데이트 무결성 서명 | latest.yml SHA-512 (electron-builder 기본) | switchboard의 Ed25519 update-policy 매니페스트 체계 이식 검토 |
| CHANGELOG | 없음 — Release 노트는 기본 안내문 | `CHANGELOG.md` 작성 시 publish 스크립트가 해당 버전 섹션을 자동 추출 |
| mac x64 (Intel) | 빌드 안 함 (사이드카가 arm64 전용) | 수요 발생 시 Intel Mac runner 추가 |
## 참고 파일
- `.gitlab-ci.yml` — 파이프라인 정의
- `scripts/ci/sync-version.mjs` — 태그 → package.json 버전 동기화
- `scripts/ci/publish-gitlab-release.mjs` — 레지스트리 업로드 + Release 생성
- `apps/desktop/src/main/services/UpdateService.ts` — 자동 업데이트 (electron-updater)
- `apps/desktop/src/main/update-feed.ts` — feed URL SSOT
- 원본 패턴: `D:\workspace\agent-switchboard-client` (.gitlab-ci.yml, scripts/publish-gitlab-release.mjs)