# Desktop releases 개요

Desktop releases는 CI에서 데스크톱 앱을 배포하는 기능입니다. 릴리스 워크플로가 서명된 빌드를 올리면, Mocco가 빌드를 검사하고 채널에 게시한 뒤 사용자와 앱에 필요한 것을 모두 제공합니다.

- 프로젝트 사이트의 **릴리스 페이지**: 플랫폼별 다운로드 버튼과 모든 버전의 노트가 있습니다 (`/releases`, 각 버전은 `/releases/<version>`).
- **플랫폼별 다운로드 링크**: 바뀌지 않으며 항상 최신 설치 파일로 연결됩니다 (`…/latest/darwin-aarch64`). 웹사이트에 넣어 두세요.
- **Tauri 업데이터 엔드포인트**: 설치된 앱이 새 버전을 스스로 찾아 설치합니다.
- 릴리스 목록 JSON: 직접 만든 다운로드 버튼에 사용합니다.

Tauri 2 앱을 먼저 지원합니다. Electron과 Sparkle 피드는 이후에 지원합니다.

![콘솔의 데스크톱 릴리스: 파일, 서명 키, Publish와 Yank](https://fi-workers-mocco-storage.s3.ap-northeast-2.amazonaws.com/pub/w/93e11fe8-0494-4e3d-b1cb-fe4dffd3ee7e/p/d64785b8-9a23-4fa1-a81d-550af30e203a/helpcenter/6941fe39-bdb2-4448-943e-4d3c2d4d57db/desktop-release.png)

## 동작 방식

**릴리스**는 버전(`0.2.0` 같은 SemVer)과 그 파일의 묶음입니다. 각 플랫폼(`darwin-aarch64`, `darwin-x86_64`, `windows-x86_64`, `linux-x86_64`)에는 두 종류의 파일이 있습니다. 사용자가 내려받는 **설치 파일**(macOS에서는 `.dmg`)과, 앱이 스스로 설치하는 **업데이트 번들**(`.app.tar.gz`)입니다. 업데이트 번들 옆에는 Tauri가 쓴 서명 파일이 함께 있습니다.

1. **업로드.** CI가 버전과 파일을 선언하고, 각 파일을 스토리지에 바로 올린 뒤 마무리(finalize)합니다. 같은 버전으로 작업을 다시 실행하면 이어서 진행하며, 이미 검증된 파일은 다시 올리지 않습니다.
2. **검증.** Mocco가 각 파일의 크기와 SHA-256을 확인하고, 업데이트 번들의 서명을 앱의 업데이터 공개 키로 확인합니다. 모든 파일이 통과해야 릴리스를 게시할 수 있습니다. 실패하면 어느 파일이 왜 실패했는지 릴리스에 표시됩니다.
3. **게시.** 검증된 릴리스를 CI나 콘솔에서 **채널**(`stable`)에 게시합니다. 채널은 플랫폼마다 한 버전을 제공하며, Tauri가 더 새로운 버전만 설치하므로 더 새로운 버전만 기존 버전을 대체할 수 있습니다.
4. **회수.** **Yank**는 문제가 있는 버전을 즉시 멈춥니다. 다운로드가 중단되고, 채널은 이전에 제공하던 버전으로 돌아갑니다. 이미 설치한 앱은 그 버전을 유지하므로, 해결하려면 더 새로운 릴리스를 내야 합니다.

## Mocco가 보관하는 것과 절대 보관하지 않는 것

- Mocco는 빌드를 비공개로 보관하고, 게시한 뒤에만 제공합니다. 초안은 워크스페이스 멤버에게만 보입니다.
- Mocco는 앱의 업데이터 **공개 키**와 CI가 만든 서명을 보관합니다. **개인 키는 절대 보관하지 않으며** 아무것도 서명하지 않습니다. 설치된 앱은 앱에 내장된 키로 모든 업데이트를 검증하므로, Mocco가 서명하지 않은 빌드를 설치하게 만들 수 없습니다.
- 코드 서명과 공증(macOS의 Developer ID)은 직접 해야 합니다. 업로드 전에 CI에서 처리하세요.
- 기본값은 모든 빌드를 보관하는 것입니다. 실패한 업로드와 초안을 며칠 뒤 삭제하도록 설정할 수 있습니다 (**Setup → Retention**). 게시된 버전은 삭제하지 않습니다.

## 다음 단계

- [Tauri 앱 게시하기](https://www.mocco.club/docs/ko/articles/2pegvw-publish-tauri): 앱, 업데이터, 릴리스 워크플로를 설정합니다.
- [curl로 게시하기](https://www.mocco.club/docs/ko/articles/by2fx3-publish-with-curl): Action 없이 어떤 CI에서든 같은 단계를 실행합니다.
