# 發行 Oleafly

從版本標籤建置完整的草稿、檢查每個平台的產出檔，再透過有防護的發行工作流程發布。

Oleafly 的發行分成兩個刻意區隔的階段。版本標籤會建置並驗證一份草稿。維護者再用另一次工作流程執行來發布同一份草稿。

推送到 `main` 會執行 CI，但不會建立發行版本。

## 建置草稿

請從最新的 `main` 分支開始，並確認 CI 為綠燈。

```sh
git switch main
git pull --ff-only
./scripts/bump-version.sh 0.3.6
git commit -am "chore: release v0.3.6"
git push origin main
git tag v0.3.6
git push origin v0.3.6
```

這個標籤會啟動 `.github/workflows/release.yml`，它會建置下列目標：

| 目標 | 安裝程式 |
|---|---|
| macOS Apple Silicon | `.dmg` |
| Windows x64 | `.msi` 和 `-setup.exe` |
| Linux x64 | `.AppImage` 和 `.deb` |
| Linux ARM64 | `.AppImage` 和 `.deb` |

每個目標都會取得並驗證它鎖定版本的編譯器 sidecar。接著工作流程會把四份更新程式片段合併成一份 `latest.json`。只有在所有必要的安裝程式和更新項目都齊全時，才算草稿準備完成。

## 檢查草稿

在 [GitHub Releases 頁面](https://github.com/Oleafly/Oleafly/releases) 開啟草稿。檢查版本資訊、安裝程式名稱、檢查碼、簽章和 `latest.json`。不要發布不完整的草稿。

## 發布

開啟 **Actions → Release → Run workflow**。輸入同一個標籤，並選取 **Publish the release**。

發布的執行會重複建置與產出檔檢查。它也會使用候選發行版本，對 Anthropic 和 Google 執行即時的契約測試。最後一個工作會在每個支援的平台和完整的更新摘要來源（feed）未全部到位時拒絕發布。

發布會讓已安裝的應用程式看見 `latest.json`。請把它視為無法復原的正式環境操作。如果發布的執行失敗，請讓發行版本維持草稿狀態，修正原因，然後再執行一次。

## 版本號碼

Oleafly 遵循語意化版本：

- **修補版（Patch）**，例如 `0.3.5` 到 `0.3.6`，用於相容的修正。
- **次要版（Minor）**，例如 `0.3.5` 到 `0.4.0`，用於相容的新功能。
- **主要版（Major）**，例如 `0.3.5` 到 `1.0.0`，用於不相容的變更或第一個穩定版本。

## 重要的檢查

- 標籤必須與 `package.json`、`src-tauri/tauri.conf.json`、`src-tauri/Cargo.toml` 和 `src-tauri/Cargo.lock` 一致。請使用 `scripts/bump-version.sh`，不要分別編輯它們。
- 版本資訊取自 `CHANGELOG.md` 中對應版本的章節。
- 不要重複使用已發布的標籤。草稿失敗時，請修正分支並建立新版本，除非有明確的理由要取代尚未發布的標籤。
- macOS 的簽署與公證使用 Apple 發行機密。Windows 的 Authenticode 在設定好機密後會使用 Azure Artifact Signing。更新程式的簽章則使用另外的 Tauri 簽署金鑰。

更新程式的簽署與回復行為，請參閱 [自動更新](/docs/engineering/updates/)。使用者的安裝說明在 [下載與安裝](/docs/install/)。
