ClassNoteAI 發布流程
概述
本項目使用 GitHub Actions 自動構建,搭配 Tauri Updater 實現應用內自動更新。
關鍵文件
| 文件 | 用途 |
|---|---|
ClassNoteAI/src-tauri/tauri.conf.json | 版本號、Updater 配置 |
ClassNoteAI/package.json | npm 版本號 (需同步更新) |
.github/workflows/release-macos.yml | macOS CI/CD 工作流 |
ClassNoteAI/src/services/updateService.ts | 客戶端更新邏輯 |
最佳實踐:Structured Release Notes
CI 流程已配置為自動根據 Commit 訊息生成分類的 Release Notes。請在提交 Commit 時遵循以下 Prefix 規範:
| 類別 | 對應 Prefix (不分大小寫) | 範例 |
|---|---|---|
| ⚠️ 破壞性更新 (Breaking) | break:, breaking:, !: | feat!: Drop Node 14 support |
| ✨ 新增 (New) | feat:, add:, new: | feat: Add dark mode toggle |
| 🔨 修改 (Modify) | mod:, update:, refactor:, chore: | mod: Update UI colors |
| 🗑️ 刪除 (Delete) | del:, remove:, delete: | del: Remove unused assets |
| 🐛 修正 (Fix) | fix:, bug: | fix: Resolve login crash |
Fallback:任何不符合上述 Prefix 的 commit 都會被歸類為「📦 其他 (Other)」。
發布步驟
1. 更新版本號
[!CAUTION] 必須同時更新以下三處,版本號必須一致!
| 文件 | 位置 | 範例 |
|---|---|---|
ClassNoteAI/src-tauri/tauri.conf.json | L4 | "version": "0.3.0" |
ClassNoteAI/package.json | L4 | "version": "0.3.0" |
ClassNoteAI/src-tauri/Cargo.toml | L3 | version = "0.3.0" |
快速查找命令:
bash
grep -n '"version"' ClassNoteAI/src-tauri/tauri.conf.json ClassNoteAI/package.json grep -n '^version' ClassNoteAI/src-tauri/Cargo.toml
2. 提交並推送
bash
git add -A git commit -m "vX.Y.Z: 版本描述 變更說明..."
3. 創建並推送 Tag
bash
git tag vX.Y.Z git push origin main --tags
4. CI/CD 自動執行
推送 tag 後,GitHub Actions 自動:
- •Checkout 代碼
- •安裝 Node.js + Rust
- •
npm ci安裝依賴 - •
npm run tauri build --target aarch64-apple-darwin - •生成
latest.json(含簽名) - •創建 GitHub Release,上傳:
- •
ClassNoteAI_X.Y.Z_aarch64.dmg - •
ClassNoteAI_X.Y.Z_aarch64.app.tar.gz - •
latest.json
- •
- •自動生成 Release Notes:
- •優先使用 GitHub 自動生成的 PR 摘要 (如果有)。
- •Fallback 機制:如果自動生成為空 (例如無 PR),則使用
git log生成 Commit 列表。
5. 驗證發布
- •檢查 GitHub Actions:
https://github.com/sklonely/ClassNoteAI/actions - •檢查 Release:
https://github.com/sklonely/ClassNoteAI/releases - •確認
latest.json已上傳
Updater 配置
tauri.conf.json
json
{
"plugins": {
"updater": {
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6...",
"endpoints": [
"https://github.com/sklonely/ClassNoteAI/releases/latest/download/latest.json"
]
}
}
}
latest.json 結構
CI/CD 自動生成:
json
{
"version": "X.Y.Z",
"notes": "ClassNoteAI X.Y.Z 更新",
"pub_date": "2026-01-15T00:00:00Z",
"platforms": {
"darwin-aarch64": {
"signature": "...",
"url": "https://github.com/sklonely/ClassNoteAI/releases/download/vX.Y.Z/ClassNoteAI_X.Y.Z_aarch64.app.tar.gz"
}
}
}
用戶更新流程
code
舊版 App 啟動
↓
updateService.checkForUpdates()
↓
請求 latest.json
↓
比較版本號
↓
顯示更新提示
↓
用戶點擊「更新」
↓
downloadAndInstall()
↓
下載 → 驗證簽名 → 安裝 → relaunch
破壞性更新處理
對於包含 Schema 變更的版本:
- •SQLite 遷移:使用
CREATE TABLE IF NOT EXISTS+ALTER TABLE(自動處理) - •localStorage 遷移:在首次啟動時檢測並遷移 (如 chatSessionService)
- •記錄版本號:可選在 Settings 表記錄
db.schema_version
GitHub Secrets 配置
| Secret | 用途 |
|---|---|
TAURI_SIGNING_PRIVATE_KEY | 更新包簽名私鑰 |
TAURI_SIGNING_PRIVATE_KEY_PASSWORD | 私鑰密碼 |
常見問題
Q: CI 構建失敗?
A: 檢查 GitHub Actions logs,常見原因:
- •Rust 編譯錯誤
- •npm 依賴問題
- •簽名密鑰未配置
Q: 用戶無法收到更新?
A: 確認:
- •
latest.json已上傳到 Release - •版本號正確 (新版 > 舊版)
- •
endpointsURL 正確
Q: Windows 版本?
A: 目前禁用 (.github/workflows/release-windows.yml.disabled),需要時改名為 .yml 並啟用