feat(release): make the signing-free install work with nothing but Windows
Some checks failed
deploy-site / deploy (push) Failing after 3m26s

The manual install path still needed 7-Zip, which the target machine does not
have, so "installable without a certificate" was not yet true.

The channel now also publishes the app as byte-split zip parts, and the install
script joins them and extracts with the built-in Windows Expand-Archive after
verifying every part and the joined archive. Version 1.3.1 republishes the
channel from a single build, because a version's artifacts can only match one
build and published volumes are never overwritten.
This commit is contained in:
Yun Chan 2026-09-18 12:03:18 +09:00
parent c35c6f3e95
commit 0411f389d9
30 changed files with 234 additions and 118 deletions

View file

@ -46,8 +46,10 @@
### 3-1. 서명 없이 지금 배포되는 것 (portable 채널)
- 산출물: 95MiB 단위 **7z 분할 볼륨**(`D3RO-Voice-<v>x64-portable.7z.001/.002`) — LZMA2로
688MB → 162MiB까지 줄어 각 볼륨이 Cloudflare 한도 안에 들어간다.
- 산출물 두 가지(같은 버라도 목적이 다름):
- **7z 분할 볼륨** `D3RO-Voice-<v>-x64-portable.7z.001/.002` — LZMA2로 688MB → 162MiB. Scoop 전용.
- **zip 분할 부품** `...zip.001/.002/.003` — 243MiB. 수동 설치 스크립트용. Windows 내장
`Expand-Archive`만으로 풀 수 있어 사용자가 7-Zip을 설치할 필요가 없다.
- 게시 위치: `.../generic/d3ro-voice/portable-<version>/``.../portable-latest/`
(**자동 업데이트 피드 `latest.yml`과 완전히 분리**).
- 설치 방법 두 가지:
@ -58,8 +60,9 @@
scoop install d3ro/d3ro-voice
```
2. **수동 설치 스크립트**`scripts/install/install-d3ro-voice.ps1` (피드에도 게시됨).
볼륨을 내려받아 SHA-256 검증 → 결합 → 7-Zip으로 해제 → `%LOCALAPPDATA%\Programs\D3RO Voice`
에 설치 + 시작 메뉴 바로가기. 관리자 권한 불필요, 7-Zip 필요.
zip 부품을 내려받아 부품별 SHA-256 검증 → 결합 → 결합본 SHA-256 재검증 →
`Expand-Archive`로 해제 → `%LOCALAPPDATA%\Programs\D3RO Voice`에 설치 + 시작 메뉴 바로가기.
관리자 권한 불필요, 추가 도구 불필요(Windows 10/11 기본).
```powershell
irm https://git.chanpaca.net/api/packages/yunchan/generic/d3ro-voice/portable-latest/install-d3ro-voice.ps1 | iex
```
@ -69,6 +72,10 @@
**안전 규칙(구현에 반영)**:
- 볼륨은 불변 — 같은 버전 경로에 다른 바이트가 있으면 게시 중단.
- 메타데이터(`portable.json`, 설치 스크립트)만 갱신 허용.
- 같은 버전을 다시 빌드하면 7z/zip 바이트가 달라져(내부 타임스탬프) 게시가 중단된다.
**한 버전의 portable 산출물은 한 번의 빌드에서만 나온다**. 태그 파이프라인(CI)이 최초
게시자가 되도록 하고, 로컬 재게시로 채널을 덮어쓰지 않는다. 이미 게시된 세트를 갱신해야 하면
버전을 올린다(이 문서 작성 시 `1.3.0` 부분 게시분을 `1.3.1`로 대체).
- 파일명에 `-portable`을 넣어 서명된 릴리스 자산과 혼동되지 않게 한다.
- `latest.yml`/`update-policy.json`은 절대 건드리지 않는다(자동 업데이트는 서명 릴리스 전용).
@ -95,11 +102,21 @@
---
## 5. 검증 기록 (2026-09-18)
## 5. 현재 상태 (2026-09-18)
- 게시된 채널: `portable-1.3.1` + `portable-latest` (7z 볼륨 2개, zip 부품 3개, 인덱스, 설치 스크립트).
- `portable-1.3.0`에는 7z 볼륨 2개만 있다(부분 게시, zip 부품 없음) — `1.3.1`이 대체한다.
- updater feed(`latest.yml`)는 여전히 `1.1.0`이며 **이 채널은 그것을 건드리지 않는다**.
## 6. 검증 기록 (2026-09-18)
- 7z 볼륨 게시 후 **무인증 공개 GET**으로 인덱스/볼륨/스크립트 제공 확인.
- 설치 스크립트 end-to-end 실행: 볼륨 2개 다운로드 → SHA-256 검증 → 결합(162.1MiB) →
7-Zip 해제 → 설치 디렉토리에 `D3RO Voice.exe`, `resources/sidecar/sidecar.exe`,
`resources/sidecar/_internal/faster_whisper/assets/silero_vad_v6.onnx`, `resources/sox/sox.exe`
존재 확인 → 시작 메뉴 바로가기 생성. (검증 후 테스트 설치/바로가기는 제거)
- 재게시 시도 시 동일 볼륨은 "이미 동일한 파일" 로 건너뛰는 것 확인(불변 가드 동작).
- 재게시 시도 시 동일 볼륨은 "이미 동일한 파일" 로 건너뛰는 것 확인(불변 가드 동작).
- 1.3.1 수동 설치 스크립트를 **7-Zip 없이** end-to-end 실행: zip 부품 3개 다운로드 →
부품별 SHA-256 → 결합(242.9MiB) → 결합본 SHA-256 → Expand-Archive → 설치 디렉토리에
`D3RO Voice.exe`, `resources/sidecar/sidecar.exe`, VAD `silero_vad_v6.onnx`, `resources/sox/sox.exe`
확인 → 시작 메뉴 바로가기 생성. (검증 후 테스트 설치/바로가기 제거)