Skip to content

feat: electron-updater 自動アップデート機能の完成 #95

Description

@dashi296

概要

electron-updater によるデスクトップアプリの自動アップデート機能を完成させる。

バックエンドの実装(updater.ts)とPreload APIは既に完成しているが、以下の2点が未実装のため実際に動作しない状態。


現状

実装済み

  • electron-updater インストール(package.json
  • アップデート戦略ロジック(Major/Minor/Patch の使い分け)(src/main/updater.ts
  • IPC ハンドラ(check / download / install)(src/main/index.ts
  • Preload API の公開(src/preload/index.ts
  • GitHub Releases への publish 設定(package.json, .github/workflows/release.yml

未実装

  1. macOS コード署名・公証(Notarization) — Gatekeeper によって自動更新がブロックされる
  2. レンダラー UI の通知コンポーネントupdate-available / update-downloaded イベントをユーザーに表示するコンポーネントが存在しない

タスク

1. macOS コード署名・公証の設定

GitHub Actions の release.yml に以下の Secrets / env vars を追加する。

必要な GitHub Secrets:

Secret 名 内容
CSC_LINK Developer ID Application 証明書(.p12 を base64 エンコード)
CSC_KEY_PASSWORD .p12 のパスワード
APPLE_ID Apple ID(公証用)
APPLE_APP_SPECIFIC_PASSWORD App-specific password
APPLE_TEAM_ID Apple Developer Team ID

release.yml への追記:

- name: Build and publish Electron app
  working-directory: packages/desktop
  env:
    GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    CSC_LINK: ${{ secrets.CSC_LINK }}
    CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
    APPLE_ID: ${{ secrets.APPLE_ID }}
    APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
    APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
    DIST_ARGS: ${{ matrix.dist_args }}
  run: pnpm dist $DIST_ARGS --publish always

package.json の electron-builder 設定に追記:

"mac": {
  "notarize": true
}

2. レンダラー UI の通知コンポーネント実装

src/renderer/components/UpdateNotification.tsx を新規作成し、App.tsx に組み込む。

表示すべき状態:

イベント 表示内容 アクション
update-available(Minor/Patch) バックグラウンドでダウンロード中 なし(自動)
update-available(Major) v{version} が利用可能 ダウンロードボタン
update-downloaded(Minor/Patch) 次回起動時に自動更新 なし
update-downloaded(Major) 今すぐ再起動して更新を適用 今すぐ再起動ボタン

Preload API(実装済み):

window.electron.checkForUpdate()
window.electron.downloadUpdate()
window.electron.installUpdate()
window.electron.onUpdateAvailable(cb)   // { version: string, isMajor: boolean }
window.electron.onUpdateDownloaded(cb)  // { version: string, isMajor: boolean }
window.electron.onUpdateError(cb)       // { message: string }

動作確認手順

  1. packages/desktop/dev-app-update.yml を配置してローカルテスト
provider: github
owner: dashi296
repo: remocoder
  1. pnpm dist:mac でパッケージ化してアプリを起動
  2. タグを切って GitHub Releases にパブリッシュし、旧バージョンからの更新を確認

参考

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions