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)
This commit is contained in:
Yun Chan 2026-07-21 15:33:30 +09:00
parent 3beba99668
commit c6fd8c9a9a
4 changed files with 37 additions and 44 deletions

View file

@ -20,12 +20,14 @@ variables:
- node_modules/ - node_modules/
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
# Docker 기반 검증 잡 — 사내 GitLab에 Docker runner가 없으므로 전부 manual. # Docker 기반 검증 잡 — TW-BUILD01(build-linux-x64) Docker runner에서 실행.
# 필요 시 UI에서 수동 트리거. Docker runner 붙이면 rules를 auto로 복원. # 현재 manual 유지 (모노레포 docker 빌드 미검증). 안정화되면 auto로 복원.
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
lint: lint:
stage: check stage: check
image: node:${NODE_VERSION} image: node:${NODE_VERSION}
tags:
- build-linux-x64
<<: *node-cache <<: *node-cache
before_script: before_script:
- npm ci --ignore-scripts - npm ci --ignore-scripts
@ -42,6 +44,8 @@ lint:
typecheck: typecheck:
stage: check stage: check
image: node:${NODE_VERSION} image: node:${NODE_VERSION}
tags:
- build-linux-x64
<<: *node-cache <<: *node-cache
before_script: before_script:
- npm ci --ignore-scripts - npm ci --ignore-scripts
@ -58,6 +62,8 @@ typecheck:
unit-test: unit-test:
stage: test stage: test
image: node:${NODE_VERSION} image: node:${NODE_VERSION}
tags:
- build-linux-x64
<<: *node-cache <<: *node-cache
before_script: before_script:
- npm ci --ignore-scripts - npm ci --ignore-scripts
@ -79,8 +85,7 @@ unit-test:
package-windows: package-windows:
stage: package stage: package
tags: tags:
- windows - build-win-x64
- shell
before_script: before_script:
- node --version - node --version
- python --version - python --version
@ -124,9 +129,12 @@ package-windows:
package-macos: package-macos:
stage: package stage: package
tags: tags:
- macos - build-mac-arm64
- arm64
before_script: 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에 인증서가 있어도 집어쓰지 않게 차단 # 무서명(ad-hoc) 빌드 강제 — runner에 인증서가 있어도 집어쓰지 않게 차단
# (agent-switchboard의 dist:mac:unsigned 검증된 조합) # (agent-switchboard의 dist:mac:unsigned 검증된 조합)
- export CSC_IDENTITY_AUTO_DISCOVERY=false - export CSC_IDENTITY_AUTO_DISCOVERY=false
@ -174,9 +182,9 @@ package-macos:
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
release-create: release-create:
stage: release stage: release
image: node:22-bookworm
tags: tags:
- windows - build-linux-x64
- shell
needs: needs:
- job: package-windows - job: package-windows
artifacts: true artifacts: true

View file

@ -20,12 +20,12 @@ files:
# latest.yml / latest-mac.yml (update info)를 생성한다. # latest.yml / latest-mac.yml (update info)를 생성한다.
# generic provider는 파일 생성만 트리거하고 직접 업로드는 하지 않음 # generic provider는 파일 생성만 트리거하고 직접 업로드는 하지 않음
# (업로드는 scripts/ci/publish-gitlab-release.mjs 담당). # (업로드는 scripts/ci/publish-gitlab-release.mjs 담당).
# 첫 릴리스 후 projects/0을 실제 프로젝트 ID로 교체할 것 # d3r0/voice 프로젝트 ID = 1172
# src/main/update-feed.ts의 UPDATE_FEED_URL과 반드시 동일 값 유지. # src/main/update-feed.ts의 UPDATE_FEED_URL과 반드시 동일 값 유지.
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
publish: publish:
provider: generic 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 외부에 배치 # native 모듈은 asar 외부에 배치
asarUnpack: asarUnpack:

View file

@ -5,11 +5,10 @@
// `d3ro-voice/latest` 패키지에 latest.yml + 설치파일을 게시하며, // `d3ro-voice/latest` 패키지에 latest.yml + 설치파일을 게시하며,
// electron-updater가 이 URL에서 latest.yml을 읽어 업데이트를 감지한다. // electron-updater가 이 URL에서 latest.yml을 읽어 업데이트를 감지한다.
// //
// 첫 릴리스 후 GitLab 프로젝트 ID를 확인해 기입할 것:
// https://gitlab.twentyoz.kr:8443/api/v4/projects/<PROJECT_ID>/packages/generic/d3ro-voice/latest
//
// 전제: 프로젝트 설정에서 "Allow anyone to pull from Package Registry" 활성화 // 전제: 프로젝트 설정에서 "Allow anyone to pull from Package Registry" 활성화
// (비활성 시 무인증 다운로드가 401 — 앱은 조용히 업데이트 체크를 건너뜀). // (비활성 시 무인증 다운로드가 401 — 앱은 조용히 업데이트 체크를 건너뜀).
// //
// 빈 문자열이면 UpdateService가 비활성 상태로 동작한다. // 빈 문자열이면 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'

View file

@ -6,9 +6,9 @@ agent-switchboard-client의 릴리스 체계를 이식한 멀티플랫폼 배포
``` ```
git tag vX.Y.Z → push git tag vX.Y.Z → push
├─ package-windows (runner: windows+shell) → NSIS exe + latest.yml ├─ package-windows (runner: build-win-x64, TW-VIVEN-BUILD) → NSIS exe + latest.yml
├─ package-macos (runner: macos+arm64) → dmg + zip + latest-mac.yml [D3RO_MAC_RUNNER="true"일 때만] ├─ package-macos (runner: build-mac-arm64, TW-BUILD-MAC-ARM64) → dmg + zip + latest-mac.yml [D3RO_MAC_RUNNER="true"일 때만]
└─ release-create (runner: windows+shell) └─ release-create (runner: build-linux-x64 Docker, TW-BUILD01)
├─ Generic Package Registry 업로드 ├─ Generic Package Registry 업로드
│ ├─ d3ro-voice/<version>/ (버전별 보관) │ ├─ d3ro-voice/<version>/ (버전별 보관)
│ └─ d3ro-voice/latest/ (electron-updater feed — 매 릴리스 갱신) │ └─ d3ro-voice/latest/ (electron-updater feed — 매 릴리스 갱신)
@ -29,43 +29,29 @@ git push origin v0.2.0
## 사용자가 1회 설정해야 하는 것 ## 사용자가 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 Mac runner 환경 전제조건 (미충족 시 package-macos 잡 실패 — allow_failure라 릴리스는 진행):
brew install gitlab-runner - Xcode Command Line Tools, Node 22+(또는 volta), Python 3.11+
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`)
- `brew install sox` — install-sox.sh가 이 바이너리를 번들함 - `brew install sox` — install-sox.sh가 이 바이너리를 번들함
등록 후 **GitLab → Settings → CI/CD → Variables**에 `D3RO_MAC_RUNNER` = `"true"` 추가. ### 2. 자동 업데이트 활성화 (Windows) — 2026-07-21 기준 완료됨
(이 변수가 없으면 package-macos 잡이 생성되지 않아 릴리스가 Windows 단독으로 진행)
### 2. 자동 업데이트 활성화 (Windows) 1. 프로젝트 ID = **1172** (기입 완료)
1. GitLab → d3r0/voice → 프로젝트 홈에서 **Project ID** 확인
2. **두 곳**에 같은 feed URL 기입 (어긋나면 안 됨): 2. **두 곳**에 같은 feed URL 기입 (어긋나면 안 됨):
- `apps/desktop/src/main/update-feed.ts``UPDATE_FEED_URL` - `apps/desktop/src/main/update-feed.ts``UPDATE_FEED_URL`
- `apps/desktop/electron-builder.yml``publish.url` (`projects/0` → 실제 ID) - `apps/desktop/electron-builder.yml``publish.url`
``` ```
https://gitlab.twentyoz.kr:8443/api/v4/projects/<PROJECT_ID>/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 **생성**을 트리거하는 필수 설정이다 `publish` 섹션은 latest.yml/latest-mac.yml **생성**을 트리거하는 필수 설정이다
(없으면 electron-builder가 update info 파일을 아예 만들지 않음). (없으면 electron-builder가 update info 파일을 아예 만들지 않음).
3. GitLab → Settings → General → Visibility에서 **"Allow anyone to pull from Package Registry"** 활성화 3. `package_registry_access_level=public` 설정 완료 ✅ (2026-07-21, API로 적용) —
(미설정 시 앱의 무인증 다운로드가 401 — UpdateService는 조용히 건너뜀) 앱의 무인증 다운로드/랜딩 페이지 다운로드 링크의 전제. 비공개로 되돌리면 자동 업데이트가 401로 조용히 중단됨.
4. 다음 태그부터 배포된 앱이 4시간 주기로 업데이트를 체크한다 4. v0.1.1-alpha부터 배포된 앱이 4시간 주기로 업데이트를 체크한다
### 산출물 파일명 규칙 ### 산출물 파일명 규칙