# Tauri 앱 게시하기

이 가이드는 Tauri 2 앱을 아무것도 없는 상태에서 시작해, 설치된 앱이 업데이트하는 게시 릴리스까지 안내합니다.

## 1. 켜고 앱 설정하기

1. 워크스페이스의 **Products**에서 **Desktop releases**를 켭니다. 릴리스 페이지를 쓰려면 **Help center**도 켭니다.
2. 프로젝트를 열고 **Desktop releases**로 이동해 **Set up a desktop app**을 선택합니다. 플랫폼이 Desktop인 기존 앱을 고르거나 새 앱의 이름을 입력합니다.
3. 업데이터 키 쌍을 한 번 만들고 개인 키를 안전하게 보관합니다. 이 키가 없으면 설치된 앱에 업데이트를 전달할 수 없습니다.

   ```sh
   npm run tauri signer generate -- -w ~/.tauri/myapp.key
   ```

   `.pub` 파일의 내용을 **Updater public key**에 붙여 넣습니다. 지금 넣어도 되고 나중에 **Setup**에서 넣어도 됩니다. 키가 있기 전까지 Mocco는 업데이트 번들을 받지 않습니다.

![데스크톱 앱 설정하기](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/568fd723-921d-4e4f-b691-03205bd67635/desktop-set-up.png)

## 2. 업데이터가 Mocco를 가리키게 하기

앱에 업데이터 플러그인(`tauri-plugin-updater`)을 추가합니다. 버전은 정확히 고정하고 `updater:default` 권한을 함께 설정합니다. 그런 다음 **Setup**에 표시된 블록을 `tauri.conf.json`에 복사합니다.

```json
{
  "bundle": { "createUpdaterArtifacts": true },
  "plugins": {
    "updater": {
      "pubkey": "<your .pub content>",
      "endpoints": [
        "https://www.mocco.club/api/ext/v1/desktop/apps/<app id>/updates/{{target}}/{{arch}}/{{current_version}}?channel=stable"
      ]
    }
  }
}
```

엔드포인트는 모든 빌드에 컴파일되어 들어가므로 **Setup**에 표시된 값을 그대로 사용하세요. 앱을 시작할 때(또는 메뉴 항목에서) 업데이트를 확인하고, `download_and_install` 전에 사용자에게 묻고, 설치 후 다시 시작하세요. 확인은 Rust에서 실행되므로 웹뷰의 콘텐츠 보안 정책을 바꿀 필요가 없습니다.

## 3. CI에 키 주기

**API keys**에서 `desktop:write` 스코프의 **secret** API 키를 만들고, 저장소 시크릿 `MOCCO_API_KEY`로 저장합니다. Tauri 서명 키와 비밀번호도 CI 시크릿(`TAURI_SIGNING_PRIVATE_KEY`, `TAURI_SIGNING_PRIVATE_KEY_PASSWORD`)으로 저장해야 빌드가 업데이트 번들에 서명할 수 있습니다.

## 4. 릴리스 단계 추가하기

빌드가 설치 파일과 업데이트 번들을 패키징하고 서명한 뒤에 다음을 추가합니다.

```yaml
- name: Publish to Mocco
  uses: fi-workers/mocco/actions/desktop-publish@<commit sha>
  with:
    app-id: <app id>
    version: ${{ steps.version.outputs.version }}
    notes-file: RELEASE_NOTES.md
    artifacts: |
      darwin-aarch64 installer release/App_${{ steps.version.outputs.version }}_aarch64.dmg
      darwin-aarch64 updater   release/App_${{ steps.version.outputs.version }}_aarch64.app.tar.gz
    channel: stable
  env:
    MOCCO_API_KEY: ${{ secrets.MOCCO_API_KEY }}
```

파일마다 한 줄씩 적습니다. 플랫폼, `installer` 또는 `updater`, 경로 순서입니다. 업데이트 번들의 `.sig` 파일(Tauri가 생성합니다)이 번들 옆에 있어야 합니다. Action은 커밋으로 고정하세요. Action은 같은 커밋에서 Mocco CLI를 빌드하므로 npm에서 설치하는 것이 없습니다. `channel`을 생략하면 초안 상태에서 멈추고, 콘솔에서 게시할 수 있습니다. GitHub Actions를 쓰지 않나요? [curl로 게시하기](https://www.mocco.club/docs/ko/articles/by2fx3-publish-with-curl)를 참고하세요.

## 5. 릴리스하기

버전을 올리는 변경을 머지합니다. 작업이 파일을 올리고, Mocco가 검증을 마칠 때까지 기다린 뒤, `stable`에 게시하고 다운로드 링크를 출력합니다. 콘솔에서 릴리스는 **Verifying**, **Draft**, **Published** 순으로 표시됩니다.

![앱의 릴리스 목록: 각 릴리스를 제공하는 채널과 공개 링크](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/f4bdcd69-eb00-4230-ac74-cdd9e704b302/desktop-releases.png)

파일이 검증에 실패하면 릴리스는 **Failed**가 되고, 파일과 이유(잘못된 SHA-256, 다른 키로 만든 서명 등)가 표시됩니다. 빌드를 고치고 같은 버전으로 작업을 다시 실행하세요. 새로 올린 파일이 실패한 파일을 대체합니다.

게시했거나 회수한 버전은 바꿀 수 없습니다. 대신 버전을 올리세요.

## 6. 공유하기

- **릴리스 페이지**는 프로젝트의 공개 사이트 `/releases`에 있습니다. 플랫폼별 다운로드 버튼과 모든 버전의 노트가 사이트의 언어로 표시됩니다. 각 버전의 페이지는 `/releases/<version>`입니다.
- 플랫폼별 **다운로드 링크**(`…/latest/<platform>`, **Public links** 아래에 표시)는 항상 최신 설치 파일로 연결됩니다. 웹사이트에 넣어 두세요.

![공개 릴리스 페이지](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/6e1d995f-5256-401a-af41-cfe32b720fdc/desktop-releases-page.png)

설치된 앱은 다음 확인 때 새 버전을 발견하고, 사용자에게 물은 뒤 설치합니다.

## 문제가 있는 릴리스 회수하기

릴리스를 열고 사유를 입력한 뒤 **Yank**를 선택합니다. 다운로드가 즉시 중단되고("gone"으로 응답), 채널은 이전에 제공하던 버전으로 돌아갑니다. 이미 설치한 앱은 그 버전을 유지하므로, 수정한 새 버전을 게시해야 합니다. Yank는 되돌릴 수 없습니다.

## 스토리지 관리하기

기본값은 모든 빌드를 보관하는 것입니다. **Setup → Retention**에서 소유자와 관리자는 마지막 변경 후 일정 기간이 지난 실패한 업로드와 초안을 삭제하도록 설정할 수 있습니다. 게시된 버전과 회수된 버전은 건드리지 않습니다. 이 설정 화면에는 앱의 빌드가 현재 차지하는 용량도 표시됩니다.

![데스크톱 앱의 Setup: 업데이터 블록, 워크플로 단계, 키, 보관 기간](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/39814b01-1d1e-4b56-9b42-7f29449b2198/desktop-setup.png)
