diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ebb96ed..f9627fd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,12 +20,14 @@ variables: - node_modules/ # ──────────────────────────────────────────────────────────────────── -# Docker 기반 검증 잡 — 사내 GitLab에 Docker runner가 없으므로 전부 manual. -# 필요 시 UI에서 수동 트리거. Docker runner 붙이면 rules를 auto로 복원. +# Docker 기반 검증 잡 — TW-BUILD01(build-linux-x64) Docker runner에서 실행. +# 현재 manual 유지 (모노레포 docker 빌드 미검증). 안정화되면 auto로 복원. # ──────────────────────────────────────────────────────────────────── lint: stage: check image: node:${NODE_VERSION} + tags: + - build-linux-x64 <<: *node-cache before_script: - npm ci --ignore-scripts @@ -42,6 +44,8 @@ lint: typecheck: stage: check image: node:${NODE_VERSION} + tags: + - build-linux-x64 <<: *node-cache before_script: - npm ci --ignore-scripts @@ -58,6 +62,8 @@ typecheck: unit-test: stage: test image: node:${NODE_VERSION} + tags: + - build-linux-x64 <<: *node-cache before_script: - npm ci --ignore-scripts @@ -79,8 +85,7 @@ unit-test: package-windows: stage: package tags: - - windows - - shell + - build-win-x64 before_script: - node --version - python --version @@ -124,9 +129,12 @@ package-windows: package-macos: stage: package tags: - - macos - - arm64 + - build-mac-arm64 before_script: + # runner에 node가 PATH에 없을 수 있음 — volta 있으면 부트스트랩 (switchboard 패턴) + - export VOLTA_HOME="${VOLTA_HOME:-$HOME/.volta}" + - export PATH="$VOLTA_HOME/bin:$PATH" + - command -v volta >/dev/null 2>&1 && volta install node@22 || true # 무서명(ad-hoc) 빌드 강제 — runner에 인증서가 있어도 집어쓰지 않게 차단 # (agent-switchboard의 dist:mac:unsigned 검증된 조합) - export CSC_IDENTITY_AUTO_DISCOVERY=false @@ -174,9 +182,9 @@ package-macos: # ──────────────────────────────────────────────────────────────────── release-create: stage: release + image: node:22-bookworm tags: - - windows - - shell + - build-linux-x64 needs: - job: package-windows artifacts: true diff --git a/apps/desktop/electron-builder.yml b/apps/desktop/electron-builder.yml index 2efb1fb..03fadbc 100644 --- a/apps/desktop/electron-builder.yml +++ b/apps/desktop/electron-builder.yml @@ -20,12 +20,12 @@ files: # latest.yml / latest-mac.yml (update info)를 생성한다. # generic provider는 파일 생성만 트리거하고 직접 업로드는 하지 않음 # (업로드는 scripts/ci/publish-gitlab-release.mjs 담당). -# 첫 릴리스 후 projects/0을 실제 프로젝트 ID로 교체할 것 — +# d3r0/voice 프로젝트 ID = 1172 — # src/main/update-feed.ts의 UPDATE_FEED_URL과 반드시 동일 값 유지. # ──────────────────────────────────────────────────────────────────── publish: provider: generic - url: "https://gitlab.twentyoz.kr:8443/api/v4/projects/0/packages/generic/d3ro-voice/latest" + url: "https://gitlab.twentyoz.kr:8443/api/v4/projects/1172/packages/generic/d3ro-voice/latest" # native 모듈은 asar 외부에 배치 asarUnpack: diff --git a/apps/desktop/src/main/update-feed.ts b/apps/desktop/src/main/update-feed.ts index b1f03a1..9f4689c 100644 --- a/apps/desktop/src/main/update-feed.ts +++ b/apps/desktop/src/main/update-feed.ts @@ -5,11 +5,10 @@ // `d3ro-voice/latest` 패키지에 latest.yml + 설치파일을 게시하며, // electron-updater가 이 URL에서 latest.yml을 읽어 업데이트를 감지한다. // -// 첫 릴리스 후 GitLab 프로젝트 ID를 확인해 기입할 것: -// https://gitlab.twentyoz.kr:8443/api/v4/projects//packages/generic/d3ro-voice/latest -// // 전제: 프로젝트 설정에서 "Allow anyone to pull from Package Registry" 활성화 // (비활성 시 무인증 다운로드가 401 — 앱은 조용히 업데이트 체크를 건너뜀). // // 빈 문자열이면 UpdateService가 비활성 상태로 동작한다. -export const UPDATE_FEED_URL = '' +// d3r0/voice 프로젝트 ID = 1172. electron-builder.yml publish.url과 동일 값 유지. +export const UPDATE_FEED_URL = + 'https://gitlab.twentyoz.kr:8443/api/v4/projects/1172/packages/generic/d3ro-voice/latest' diff --git a/docs/deployment/release-guide.md b/docs/deployment/release-guide.md index 8ad8574..892f497 100644 --- a/docs/deployment/release-guide.md +++ b/docs/deployment/release-guide.md @@ -6,9 +6,9 @@ agent-switchboard-client의 릴리스 체계를 이식한 멀티플랫폼 배포 ``` git tag vX.Y.Z → push - ├─ package-windows (runner: windows+shell) → NSIS exe + latest.yml - ├─ package-macos (runner: macos+arm64) → dmg + zip + latest-mac.yml [D3RO_MAC_RUNNER="true"일 때만] - └─ release-create (runner: windows+shell) + ├─ 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// (버전별 보관) │ └─ d3ro-voice/latest/ (electron-updater feed — 매 릴리스 갱신) @@ -29,43 +29,29 @@ git push origin v0.2.0 ## 사용자가 1회 설정해야 하는 것 -### 1. macOS runner 등록 (Mac 빌드 활성화) +### 1. macOS runner (2026-07-21 기준 완료됨) -MacBook에서: +사내 공용 runner `TW-BUILD-MAC-ARM64`(tags: `build-mac-arm64`)가 온라인이며, +CI 변수 `D3RO_MAC_RUNNER="true"`도 설정 완료. 별도 등록 불필요. -```bash -brew install gitlab-runner -gitlab-runner register \ - --url https://gitlab.twentyoz.kr:8443 \ - --executor shell \ - --tag-list "macos,arm64" -# 등록 토큰: GitLab → d3r0/voice → Settings → CI/CD → Runners -brew services start gitlab-runner -``` - -Mac 환경 전제조건: -- Xcode Command Line Tools (`xcode-select --install`) -- Node 22+ (시스템 PATH) -- Python 3.11+ (`python3`) +Mac runner 환경 전제조건 (미충족 시 package-macos 잡 실패 — allow_failure라 릴리스는 진행): +- Xcode Command Line Tools, Node 22+(또는 volta), Python 3.11+ - `brew install sox` — install-sox.sh가 이 바이너리를 번들함 -등록 후 **GitLab → Settings → CI/CD → Variables**에 `D3RO_MAC_RUNNER` = `"true"` 추가. -(이 변수가 없으면 package-macos 잡이 생성되지 않아 릴리스가 Windows 단독으로 진행) +### 2. 자동 업데이트 활성화 (Windows) — 2026-07-21 기준 완료됨 -### 2. 자동 업데이트 활성화 (Windows) - -1. GitLab → d3r0/voice → 프로젝트 홈에서 **Project ID** 확인 +1. 프로젝트 ID = **1172** (기입 완료) 2. **두 곳**에 같은 feed URL 기입 (어긋나면 안 됨): - - `apps/desktop/src/main/update-feed.ts`의 `UPDATE_FEED_URL` - - `apps/desktop/electron-builder.yml`의 `publish.url` (`projects/0` → 실제 ID) + - `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//packages/generic/d3ro-voice/latest + 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. GitLab → Settings → General → Visibility에서 **"Allow anyone to pull from Package Registry"** 활성화 - (미설정 시 앱의 무인증 다운로드가 401 — UpdateService는 조용히 건너뜀) -4. 다음 태그부터 배포된 앱이 4시간 주기로 업데이트를 체크한다 +3. `package_registry_access_level=public` 설정 완료 ✅ (2026-07-21, API로 적용) — + 앱의 무인증 다운로드/랜딩 페이지 다운로드 링크의 전제. 비공개로 되돌리면 자동 업데이트가 401로 조용히 중단됨. +4. v0.1.1-alpha부터 배포된 앱이 4시간 주기로 업데이트를 체크한다 ### 산출물 파일명 규칙