📌

.NETのWPFアプリケーションをGithub Actionsでビルドする

2022/07/04に公開

はじめに

結構ハマりどころが多かったので、まとめておきます。

本稿のコードなど一式は下記に公開しています。

ビルド対象のソリューションを作成する

GitHubのリポジトリに、つぎのような構造で .NET6.0のWPFアプリケーションを作成します。

  • Source
    • DotnetWpfApp
      • DotnetWpfApp.sln
      • DotnetWpfApp
      • DotnetWpfApp.Package
      • DotnetWpfApp.Test

プロジェクトはそれぞれ、つぎのテンプレートから作成します。

  • 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に登録します。

証明書を作成する

  1. DotnetWpfApp.PackageプロジェクトのPackage.appxmanifestを開く
  2. 「パッケージ化」タブの「証明書の選択」をクリック
  3. 「作成 ...」をクリック
  4. 適当な情報を入力。パスワードは後ほど使うため、忘れないようにしておく
  5. 「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」の編集画面が開かれます。

デフォルトのままではビルドが通らないので、下記の点を修正します。

  1. ソリューションファイルのパスなどenvを適切な値に設定する
  2. .NET6.0に変更する
  3. 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