跳到內容

桌面 App:發布、簽章與自動更新

涵蓋開發者憑證相關的工作(TODO §D4)。發布流程定義在 .github/workflows/desktop-release.yml, 推送 desktop-v* tag 即可觸發。

1. Updater 簽章金鑰(一次性設定)

Section titled “1. Updater 簽章金鑰(一次性設定)”
終端機視窗
cargo tauri signer generate -w ~/.tauri/duduclaw.key
  • 把公開金鑰(public key)填入 src-tauri/tauri.conf.json > plugins.updater.pubkey。
  • 把私密金鑰(private key)與密碼存進 repo secrets TAURI_SIGNING_PRIVATE_KEY / TAURI_SIGNING_PRIVATE_KEY_PASSWORD。

更新端點是 GitHub 上的 latest.json(已經設定好)。每次發布時 tauri-action 都會產生一份簽過章的 latest.json;客戶端安裝前會驗證簽章, 簽章不符就拒絕安裝(§D4.4)。

2. macOS:Developer ID 與公證(notarization)

Section titled “2. macOS:Developer ID 與公證(notarization)”

所需 secrets:

Secret 內容
APPLE_CERTIFICATE Developer ID Application 的 .p12 憑證,base64 編碼
APPLE_CERTIFICATE_PASSWORD 該憑證的密碼
APPLE_SIGNING_IDENTITY Developer ID Application: <Name> (<TEAMID>)
APPLE_ID / APPLE_PASSWORD Apple 帳號 + app 專用密碼
APPLE_TEAM_ID 10 碼的 team id

只要這些 secrets 都存在,tauri-action 就會簽章(hardened runtime,使用 src-tauri/entitlements.plist)並送公證。若要手動處理某個 artifact,用 scripts/desktop/sign-notarize-macos.sh。

**驗收標準(§D4.1):**在一台從未接觸過該憑證的機器上下載 .dmg,應該可以 直接開啟,不會跳出 Gatekeeper 的「無法識別開發者」警告。

所需 secrets 為 WINDOWS_CERT_PFX_BASE64 / WINDOWS_CERT_PASSWORD。workflow 會透過 scripts/desktop/sign-windows.ps1 簽署 .msi。**驗收標準(§D4.2):**SmartScreen 不會擋下(EV 憑證=立即信 任)。

.AppImage 與 .deb 都是未簽章建置(已宣告 WebKitGTK 執行期相依)。不會 擋住發布(§D4.3)。

一般走法就是核心發布儀式:scripts/release.sh <bump> 會連同其他所有 manifest 一起把 src-tauri/tauri.conf.json 版本號往上調,並在該 bump commit 上同時打 v<X.Y.Z> 與 desktop-v<X.Y.Z> 兩個 tag;接著 git push --tags 就會連同核心流程一起觸發這條 pipeline。(桌面版曾經卡 在 1.33.0 長達 11 次發布,就是因為這些步驟被拆成手動流程分開做,千萬別 走回頭路手動打 tag。)

若只想針對既有版本重新建置桌面版:

終端機視窗
git tag desktop-v1.44.0 <bump-commit>
git push origin desktop-v1.44.0

這個 workflow 會建置 4 個目標平台的矩陣,完成簽章/公證,並直接發布 (不經過 draft)附上安裝檔與 latest.json。最後一個 job 會把 latest.json 複製到固定 tag desktop-updater 的 release 上,這個固定 URL 就是更新端點,因為 releases/latest/... 會指向更新頻繁得多的核心版 本發布,反而會 404。

5a. 連到外部 gateway 時的更新(未發布)

Section titled “5a. 連到外部 gateway 時的更新(未發布)”

App 仍在背景下載新版本。App 自己帶 gateway sidecar 時行為不變:通知、系統匣「重啟並更新」、退出時安裝。連到不是自己啟動的 gateway 時,App 和 gateway 是兩套安裝、兩條更新通道,App 不會自行安裝:通知與系統匣項目改成指向儀表板的「系統更新」頁,退出時也不安裝已下載的版本。那一頁先更新 gateway,App 只更新到 gateway 的版本。頁面透過 desktop_update_info 指令讀取兩者關係(bundled 或 external)。

  • 憑證/金鑰絕不進 commit,只能放在 GitHub secrets。
  • 人事異動時要輪替 Apple app 專用密碼與 updater 金鑰。
  • 讓 tauri.conf.json 的版本號與核心 Cargo.toml workspace 版本保持一致, 避免 updater 出貨 shell 與核心版本不對應的組合(§D4.4/§D4.5)。