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:
parent
3beba99668
commit
c6fd8c9a9a
4 changed files with 37 additions and 44 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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'
|
||||||
|
|
|
||||||
|
|
@ -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시간 주기로 업데이트를 체크한다
|
||||||
|
|
||||||
### 산출물 파일명 규칙
|
### 산출물 파일명 규칙
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue