.NETのWPFアプリケーションをGithub Actionsでビルドする
はじめに
結構ハマりどころが多かったので、まとめておきます。
本稿のコードなど一式は下記に公開しています。
ビルド対象のソリューションを作成する
GitHubのリポジトリに、つぎのような構造で .NET6.0のWPFアプリケーションを作成します。
- Source
- DotnetWpfApp
- DotnetWpfApp.sln
- DotnetWpfApp
- DotnetWpfApp.Package
- DotnetWpfApp.Test
- DotnetWpfApp
プロジェクトはそれぞれ、つぎのテンプレートから作成します。
- DotnetWpfApp:WPFアプリケーション
- DotnetWpfApp.Package:Windowsアプリケーション パッケージ プロジェクト
- DotnetWpfApp.Test:xUnitテスト プロジェクト
DotnetWpfApp.Packageを作成したら、DotnetWpfAppへプロジェクト参照を追加してください。
また、テストプロジェクトは、必ずしもxUnitである必要はありません。
WPFアプリケーションにRuntimeIdentifiersを追加する
パッケージを生成する際に、win-x86とwin-x64を対象にビルドされます。そのためRuntimeIdentifiersを .csprojにつぎのように追記してください。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
</PropertyGroup>
</Project>
証明書を作成し、GitHubのSecretsに登録する
パッケージをリリースするためには、証明書を安全に利用できる箇所に登録する必要があります。gitリポジトリに登録してしまうと、証明書の漏洩につながりやすいため、GitHubのSecretsに登録します。
証明書を作成する
- DotnetWpfApp.PackageプロジェクトのPackage.appxmanifestを開く
- 「パッケージ化」タブの「証明書の選択」をクリック
- 「作成 ...」をクリック
- 適当な情報を入力。パスワードは後ほど使うため、忘れないようにしておく
- 「OK」をクリックし、「証明書の選択」画面でも「OK」をクリック
これでDotnetWpfApp.Package_TemporaryKey.pfxが作成されたものと思います。
証明書をBase64化する
Visual Studioの「ツール」>「コマンドライン」>「開発者用PowerShell」を開き、DotnetWpfApp.Packageプロジェクト直下に移動して、つぎのように入力します。
$pfx_cert = Get-Content '.\DotnetWpfApp.Package_TemporaryKey.pfx' -Encoding Byte
[System.Convert]::ToBase64String($pfx_cert) | Out-File 'SigningCertificate_Encoded.txt'
なおこのスクリプトは、後ほど紹介するGitHubs ActionsでWPFをビルドするテンプレートのコメント欄に記載されているものをもとにしています。
GitHubのシークレットに証明書とパスワードを登録する
GitHub >「Settings」タブ >「Secrets」>「Actions」を開き、「New repository secret」をクリックします。
Nameに「Base64_Encoded_Pfx」(これもActionsのテンプレートで指定されている)を指定し、先ほど作成した「SigningCertificate_Encoded.txt」の内容をValueにコピー/ペーストして、「Add secret」をクリックしてください。
同様の手順でパスワードも「Pfx_Key」という名前でsecretに登録してください。
GitHub ActionsにWorkflowを追加する
GitHubを開き、「Actions」>「New workflow」をクリックすると、ベースとなるWorkflowのテンプレートを選択する画面が開きます。
そこで「.NET Desktop」の「Configure」をクリックしましょう。すると「dotnet-desktop.yml」の編集画面が開かれます。
デフォルトのままではビルドが通らないので、下記の点を修正します。
- ソリューションファイルのパスなどenvを適切な値に設定する
- .NET6.0に変更する
- unit test時にプロジェクトを明示的に指定する
envを設定する
前述のフォルダー構成の場合、つぎのように更新します。
env:
Solution_Name: Source\DotnetWpfApp\DotnetWpfApp.sln
Test_Project_Path: Source\DotnetWpfApp\DotnetWpfApp.Test\DotnetWpfApp.Test.csproj
Wap_Project_Directory: Source\DotnetWpfApp\DotnetWpfApp.Package
Wap_Project_Path: Source\DotnetWpfApp\DotnetWpfApp.Package\DotnetWpfApp.Package.wapproj
.NET6.0に変更する
.NETのインストール箇所を6.0に変更する
# Install the .NET Core workload
- name: Install .NET Core
uses: actions/setup-dotnet@v2
with:
dotnet-version: 6.0.x
unit test時にプロジェクトを明示的に指定する
デフォルトの設定では、テストプロジェクトが指定されていません。ソリューションがリポジトリ直下にあれば不要なのでしょうか?
すくなくとも今回の場合、明示的に指定する必要があるので、つぎのように$env:Test_Project_Pathを追加します。
# Execute all unit tests in the solution
- name: Execute unit tests
run: dotnet test $env:Test_Project_Path
これで設定は完了です。
「Start commit」をクリックし、「dotnet-desktop.yml」をリポジトリに登録すると自動的にWorkflowが実行されます。
Discussion