貧しい人々のためのAWSを介したWindows Auto Service Update

ある日、ある男がHelikaのEdison Softwareにやってきました。 法案を見た彼は、目を細めて叫んだ。 私は貧しい!」 これは、キャッチフレーズであり、プロジェクトのクラス全体のラベルになっています。 そのため、次の条件を遵守しながら、Windowsサービスの自動更新を実装する必要がありました。









パッケージを保存するサービスを選択する



Amazon Web Services(AWS)は、サービスパックを保存するサービスとして選択されました。 彼が選んだ主な理由は次のとおりです。



メカニズムの選択



自動更新用の次のライブラリが考慮されました。



しかし、それらはすべて私たちのニーズを満たしていませんでした。

AutoUpdate.Netでは、アップグレード中にユーザーの参加が必要でした。 また、ライブラリ自体は長い間サポートされていません。

Squirrel.Windowsは必要な機能をすべて備えていましたが、Win7 x64のシステムレベルでアプリケーションをインストールできなかったため、バグが見つかりました。

ClickOnceは、システムレベルでアプリケーションをインストールできません。 サービスをインストールする必要があるため、このソリューションも拒否する必要がありました。



更新メカニズム







  1. ソフトウェアのインストール中、インストーラーはWindowsスケジューラーで自動更新プログラムのスケジュールされた起動を登録します。
  2. スケジューラによって自動更新プログラムを実行します。
  3. AWSで新しいインストールパッケージを確認する
  4. 新しいインストールパッケージを取得します。
  5. サービス停止。
  6. サイレントモードで新しいパッケージを起動し、更新プログラムプロセスを完了します。


新しいインストールパッケージは、次のアクションを実行します。

  1. システムから以前のバージョンのソフトウェアを削除(アンインストール)。
  2. 新しいソフトウェアバージョンのインストール(インストール)。 ソフトウェアの新しいバージョンに加えて、アップデータも更新されます。
  3. 更新されたサービスを開始します。


MSIインストールパッケージは、 WIX (または別のユーティリティ)を使用して作成され、簡単です。 ただし、更新プロセスの単純さには欠点もあります。



これらの欠点は重要ではありません。 通常の操作では、インストールは常にエラーなしで行われます。 更新が行われなかった場合、ユーザーはいつでも手動でソフトウェアを再インストールできます。 インストールパッケージのサイズは小さく、更新も頻繁に行われないため、Windowsの一時ディレクトリにファイルが存在しても問題は発生しません。



AWSからパッケージをダウンロードする



インストールパッケージは、このフォームでAWSに保存されます。



string BucketKeyName = "general/{0}/Setup.msi"; //  {0} –   
      
      





AWSサービスに保存されている最新のバージョン番号を取得するには、次の関数を実装します(サービスへの登録後、アカウントでAwsKeyId、AwsSecretKeyおよびAwsRegionが利用可能になります)。



 private static Version GetLatestVersion() { using (var client = new AmazonS3Client(AwsKeyId, AwsSecretKey, AwsRegion)) { var listRequest = new ListObjectsRequest() { BucketName = BucketName, Prefix = "global/", Delimiter = "/", }; var response = client.ListObjects(listRequest); var versions = response.CommonPrefixes.Select(prefix => { try { var versionString = prefix.Replace(listRequest.Prefix, "").Replace("/", ""); return new Version(versionString); } catch { return new Version(); } }); return versions.Max(); } }
      
      





次の関数は、インストールパッケージのダウンロードに使用されます。



 private static FileInfo DownloadInstallerFor(Version version) { var request = new GetObjectRequest { BucketName = BucketName, Key = string.Format("general/{0}/Setup.msi", version.ToString()), }; string dest = Path.Combine(Path.GetTempPath(), request.Key); using (var client = new AmazonS3Client(AwsKeyId, AwsSecretKey, AwsRegion)) { using (var response = client.GetObject(request)) { if (!File.Exists(dest)) { response.WriteResponseStreamToFile(dest); } } } return new FileInfo(dest); }
      
      





自動更新プログラムの主な機能。



 static void Main(string[] args) { var currentFolder = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); var serviceFullFileName = Path.Combine(currentFolder, ServiceFileName); Console.WriteLine(serviceFullFileName); // 1.     var serviceFileInfo = FileVersionInfo.GetVersionInfo(serviceFullFileName); var currentVersion = new Version(String.Format("{0}.{1}.{2}", serviceFileInfo.ProductMajorPart, serviceFileInfo.ProductMinorPart, serviceFileInfo.ProductBuildPart) ?? "0.0.0"); Console.WriteLine(currentVersion); // 2.     AWS var latestVersion = GetLatestVersion(); Console.WriteLine(latestVersion); if (latestVersion<=currentVersion) return; // 3.     AWS var fileInfo = DownloadInstallerFor(latestVersion); if (fileInfo.Exists) { // 4.  ,       StopService(); var process = new Process(); process.StartInfo.FileName = fileInfo.FullName; process.StartInfo.Arguments = "/quiet"; process.Start(); } }
      
      





提示された自動更新メカニズムはおそらく唯一のものではありませんが、数か月にわたる優れた操作でうまく機能しています。 同時に、作成コストは最小限でした。







その他のプロジェクト:

5233人時でマイクロトモグラフ用のソフトウェアを作成する方法

FB2形式の電子書籍のサポートを実装するSDK

電子文書へのアクセスを管理します。 DefViewからVivaldiへ

Axxon NextとSureViewの2つのビデオ監視システムを統合します

X線トモグラフィーソフトウェアの開発の詳細

「スコープ」:数十億キロワット時を監視する方法

データベースを操作するためのシンプルなJIRAプラグインの開発

DevOpsを支援する:1008時間でDebian上のネットワークデバイスのファームウェアビルダー

貧しい人々のためのAWSを介したWindows Auto Service Update



All Articles