1台の端末にも触れることなく、全支店をアップデートした方法
Electronを使用して社内用デスクトップツールを構築しました。これは多くの支店の端末で稼働しています。各支店はネットワーク環境も異なり、ITスキルのレベルも様々です。
先週、すべての端末に修正プログラムを即座に配信する必要がありました。私はどの支店にも足を運びませんでした。セットアップファイルをメールで送ることも、誰かに「インストールをクリックして」と頼むこともありませんでした。
ターミナルで2つのコマンドを実行して、あとは放置しました。翌朝までには、すべての端末がアップデートされていました。
これが可能だったのは、数ヶ月前に electron-updater を使って自動アップデートシステムを構築していたからです。
リモート拠点にソフトウェアを配信する場合、次のような問題に直面します。
- ユーザーにインストーラーを実行してもらうことを期待できない。
- ITサポートが現地にいるとは限らない。
- リモートアクセスでは拡張性がない。
- 手動での配布が最大のボトルネックになる。
解決策は、プロセスからインストーラーを排除することです。
私のシステムは汎用的な HTTP プロバイダーを使用しています。SFTP を介してプライベートな Web サーバーにアップデートをホストしています。これにより、社内ソフトウェアを GitHub のような公開リポジトリに置かずに済みます。
プロセスには4つのレイヤーがあります。
- ビルドと公開:アプリをコンパイルし、ファイルをサーバーにアップロードする。
- メインプロセス:新しいバージョンを確認し、バックグラウンドでサイレントにダウンロードする。
- プリロードブリッジ:アップデートイベントを安全に UI へ転送する。
- レンダラー UI:ユーザーに中断させないようにしつつ、進捗を表示する。
アップデートの流れは以下の通りです。
- 公開スクリプトを実行します。アプリをビルドし、ファイルをアップロードします。
- アプリは
latest.ymlファイルを使用してアップデートを確認します。このファイルにはバージョンとセキュリティハッシュが含まれています。 - 起動時に、アプリがサーバーを確認します。
- 新しいバージョンが存在する場合、自動的にダウンロードします。
- ダウンロードが完了すると、アプリが終了し、アップデートをインストールします。
私は autoDownload: true を使用しています。これにより、ユーザーは何もクリックする必要がありません。また、UI に進捗バーを表示しています。これにより、ユーザーに判断を委ねることなく、状況を可視化できます。
社内用デスクトップソフトウェアを構築する際の教訓:
- 完全な制御を行うために、汎用的な HTTP プロバイダーを使用する。
- アップロード時は常にメタデータファイルを上書きする。
- 接続が不安定な場合に備え、アップロードスクリプトにレジューム(再開)ロジックを組み込む。
- サイレントダウンロードを使用しつつ、進捗バーは表示する。
- アップデートは常に SHA-512 ハッシュで検証する。
このパイプラインを早い段階で構築しておいたことで、数日分の手作業を節約できました。
