Azure DevOpsとBlob StorageでClickOnceアプリケーションのCI/CDできるか「雑に」試してみた
はじめに
れがしぃなWindowsFormsなプロジェクトをAzure DevOps(ADO)でCI/CDできるか「雑に」試してみました。
exeをどこかに吐き出すだけでは面白くないので
Azure Blob Storage上にClickOnceアプリケーションをデリバリして
Web Apps上のリンクからそのアプリケーションを使用する。
みたいな形で構成していこうと思います。
「できるかな?」程度なので、超雑な構成になっています。
証明書周りやCORS周りなんかは、もうちょっと検証が必要と思います。。。
最終的に↓な感じで動きます。
Windows Formsプロジェクト
まずはWindowsFormsプロジェクトの作成です。
といっても、アプリケーション自体はそこまで重要ではないので
WindowsFormsの画面を表示させるだけの機能のものです。
アプリケーションの発行する際にClickeOnceの署名等も行うよう設定しておきます。証明書はVisualStudioで作成されるテスト証明書をそのまま使用します。
ADO CI/CDパイプライン
VisualStudioBuildタスク
ADOパイプラインのVisualStudioBuildタスクはデフォルトで、publishしてくれないので、タスクの内容を少しいじります
MSBuild:Arguments
に /target:publish
を指定するだけです。
PowerShellタスク
WinFormsのClickOnceで証明書を使用しているため、Buildを行う際にはマシンの証明書ストアに証明書がインストールされている必要があります。
PowerShellタスクを使用して、ビルドマシンに証明書をインストールしてあげます。
証明書ファイルはめっちゃ雑ですが
ソリューションに加えられたpfxファイルをADOにあげちゃってます
$pfxpath = 'pfxファイル' $password = '証明書パスワード' Add-Type -AssemblyName System.Security $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $cert.Import($pfxpath, $password, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"PersistKeySet") $store = new-object system.security.cryptography.X509Certificates.X509Store -argumentlist "MY", CurrentUser $store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]"ReadWrite") $store.Add($cert) $store.Close()
Azure File Copyタスク
ClickOnceアプリケーションは bin
の中に生成されるので
binディレクトリの中のファイルをFile CopyタスクでBlobストレージにアップロードします。
基本的にAzureのBlob Storageとリンクされます。なので迷わず設定できます。
結果
指定したコンテナに.application
他生成されたファイルがコピーされました。
Blob Storage他の雑な設定変更
ここからかなり雑です。
アセンブリの設定変更
オレオレ以前な証明書を使用しているので、*.application
にアクセスしてもファイルの起動が行なえません。
Let'sやらOpenSSLを使用してあげれば回避できるとは思うのですが
今回は、コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\Security\TrustManager\PromptingLevel
の設定をすべてenabled
に変更して回避しました。
BlobStorageのアクセスポリシー変更
当初、SASトークン付きのURLでapplication
ファイルにアクセスしていたのですが
アプリケーションのインストールを行う際、当然 .manifest
などの他のファイルもBlobStorage経由で取得しようとします。
しかし、アプリケーションのインストール時は、インストーラでSASトークン付きのURLに対してアクセスしてくれないため、404が発生し、インストール時にエラーとなってしまいます。
BlobStorageでCORSを設定してみたのですが、そもそもローカルにインストールされたインストーラからのアクセスなので、CORSも効かない…
ので、アクセスポリシーをユッルユルに設定しアクセスできるようにしました。
雑に設定した結果
.application
へのLinkを貼っただけのHtmlをアップし動作させてみました。
結果は記事の冒頭に貼った通りの結果でClickOnceのおなじみの動きとなっています。
おわりに
BlobStorageにアップしたClickOnceアプリケーションは使用できそうです。
ただ、さすがにAnonymousで制限なくアクセス可能。という状態を避けたい場合はもうすこし考慮が必要かもしれません。
アプリケーションへのエントリがWebからのみ。ということであれば
Web画面のCI/CDパイプラインでアプリケーションを混入した状態で、WebAppsにデプロイしちゃったほうが良いかもしれないですね。