はまったりひらめいたり…とか…

Angularや.NETやAzureやその他色々。

Azure DevOpsとBlob StorageでClickOnceアプリケーションのCI/CDできるか「雑に」試してみた

はじめに

れがしぃなWindowsFormsなプロジェクトをAzure DevOps(ADO)でCI/CDできるか「雑に」試してみました。

exeをどこかに吐き出すだけでは面白くないので

Azure Blob Storage上にClickOnceアプリケーションをデリバリして

Web Apps上のリンクからそのアプリケーションを使用する。

みたいな形で構成していこうと思います。

「できるかな?」程度なので、超雑な構成になっています。

証明書周りやCORS周りなんかは、もうちょっと検証が必要と思います。。。

最終的に↓な感じで動きます。

f:id:TakasDev:20181118193605g:plain

Windows Formsプロジェクト

まずはWindowsFormsプロジェクトの作成です。

といっても、アプリケーション自体はそこまで重要ではないので

WindowsFormsの画面を表示させるだけの機能のものです。

アプリケーションの発行する際にClickeOnceの署名等も行うよう設定しておきます。証明書はVisualStudioで作成されるテスト証明書をそのまま使用します。

f:id:TakasDev:20181118182610p:plain

ADO CI/CDパイプライン

VisualStudioBuildタスク

ADOパイプラインのVisualStudioBuildタスクはデフォルトで、publishしてくれないので、タスクの内容を少しいじります

MSBuild:Arguments/target:publish を指定するだけです。

f:id:TakasDev:20181118182713p:plain

PowerShellタスク

WinFormsのClickOnceで証明書を使用しているため、Buildを行う際にはマシンの証明書ストアに証明書がインストールされている必要があります。

PowerShellタスクを使用して、ビルドマシンに証明書をインストールしてあげます。

証明書ファイルはめっちゃ雑ですが

ソリューションに加えられたpfxファイルをADOにあげちゃってます

f:id:TakasDev:20181118182837p:plain

$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()

f:id:TakasDev:20181118182943p:plain

Azure File Copyタスク

ClickOnceアプリケーションは bin の中に生成されるので

binディレクトリの中のファイルをFile CopyタスクでBlobストレージにアップロードします。

f:id:TakasDev:20181118191122p:plain

基本的にAzureのBlob Storageとリンクされます。なので迷わず設定できます。

結果

f:id:TakasDev:20181118191451p:plain

指定したコンテナに.application他生成されたファイルがコピーされました。

Blob Storage他の雑な設定変更

ここからかなり雑です。

アセンブリの設定変更

オレオレ以前な証明書を使用しているので、*.application にアクセスしてもファイルの起動が行なえません。

f:id:TakasDev:20181118192258p:plain

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も効かない…

ので、アクセスポリシーをユッルユルに設定しアクセスできるようにしました。

f:id:TakasDev:20181118192830p:plain

雑に設定した結果

.application へのLinkを貼っただけのHtmlをアップし動作させてみました。

結果は記事の冒頭に貼った通りの結果でClickOnceのおなじみの動きとなっています。

おわりに

BlobStorageにアップしたClickOnceアプリケーションは使用できそうです。

ただ、さすがにAnonymousで制限なくアクセス可能。という状態を避けたい場合はもうすこし考慮が必要かもしれません。

アプリケーションへのエントリがWebからのみ。ということであれば

Web画面のCI/CDパイプラインでアプリケーションを混入した状態で、WebAppsにデプロイしちゃったほうが良いかもしれないですね。