.NET Blogの以下の記事で、GitHub Actionsを使用して.NET Coreデスクトップアプリ(WPFとWindows Forms)をビルドするためのスターターワークフローテンプレートがリリースされたとアナウンスがありました。
早速このテンプレートを試してみたので、ハマったポイントを含め使用する手順を解説したいと思います。
事前準備
いきなりVisual StudioでWPFアプリを作成して、GitHubにプッシュして、GitHub Actionsを設定して~というのはちょっと無謀です。そのままで進めてしまうとエラーでひっかかるポイントがあるので、まずはしっかり準備しましょう。
まずは冒頭に出てきた「スターターワークフローテンプレート」の中身を少し眺めてみます。11~33行目に重要な設定が記載されています。
まず1つ目ですが
# 1. Configure environment variables
# GitHub sets default environment variables for every workflow run.
# Replace the variables relative to your project in the “env” section below.
と記載されているので、環境変数を設定するenv
セクションを見てみます。
env:
Solution_Name: your-solution-name # Replace with your solution name, i.e. MyWpfApp.sln.
Test_Project_Path: your-test-project-path # Replace with the path to your test project, i.e. MyWpfApp.Tests\MyWpfApp.Tests.csproj.
Wap_Project_Directory: your-wap-project-directory-name # Replace with the Wap project directory relative to the solution, i.e. MyWpfApp.Package.
Wap_Project_Path: your-wap-project-path # Replace with the path to your Wap project, i.e. MyWpf.App.Package\MyWpfApp.Package.wapproj.
変数を見てみると、どうやらWPFアプリのプロジェクト以外にテスト用のプロジェクトとパッケージ作成用のプロジェクトも用意しておく必要があることが分かります。この情報を元に、まずはVisual Studioで「WPF App (.NET Core)」のプロジェクトを作成し、それに「NUnit テスト プロジェクト (.NET Core )」、「Windows アプリケーション パッケージ プロジェクト」を追加しておきます。
次に二つ目です。
# 2. Signing
# Generate a signing certificate in the Windows Application
# Packaging Project or add an existing signing certificate to the project.
# Next, use PowerShell to encode the .pfx file using Base64 encoding
# by running the following Powershell script to generate the output string:
#
# $pfx_cert = Get-Content ‘.\SigningCertificate.pfx’ -Encoding Byte
# [System.Convert]::ToBase64String($pfx_cert) | Out-File ‘SigningCertificate_Encoded.txt’
PowerShellを使用してパッケージプロジェクトで作成された証明書(.pfx
ファイル)をBase64エンコードしてSigningCertificate_Encoded.txt
として出力する必要がありそうです。
パッケージの作成方法は以下の記事を参考にしてください。ここで注意が必要なのはWPFアプリのビルド構成のデフォルトがAny CPU
なので、x86
とx64
を追加しておくとエラーにならずに済みます。また、証明書のファイル名はWapProjTemplate1_TemporaryKey.pfx
で作成しておきます。この証明書の作成時に必要なパスワードはのちほど使用するので忘れないようにしてください。
さて、本題に戻ります。Visual Studioで[ツール]-[コマンドライン]-[開発者用 PowerShell]をクリックしてPowerShellを起動します。スターターワークフローテンプレートの23、24行目にあるコマンドを参考にPowerShellでコマンドを実行します。
$pfx_cert = Get-Content '.\SigningCertificate.pfx' -Encoding Byte [System.Convert]::ToBase64String($pfx_cert) | Out-File 'SigningCertificate_Encoded.txt'
.\SigningCertificate.pfx
となっている部分は.\WapProjTemplate1\WapProjTemplate1_TemporaryKey.pfx
に変更します。
実行するとSigningCertificate_Encoded.txt
が作成されます。
続いて三つ目です。
# Open the output file, SigningCertificate_Encoded.txt, and copy the
# string inside. Then, add the string to the repo as a GitHub secret
# and name it “Base64_Encoded_Pfx.”
SigningCertificate_Encoded.txt
の中身をコピーしてGitHubのリポジトリのシークレットな環境変数にBase64_Encoded_Pfx
として追加する必要があるようです。
Visual Studioから作成したGitHubのリポジトリで[Setting]タブをクリックしさらに「Secret」を選択します。[New Secret]をクリックして「Name」にBase64_Encoded_Pfx
、「Value」にSigningCertificate_Encoded.txt
から文字列をコピーします。
[Add secret]をクリックして追加します。
さあ、ようやく最後です。
# Finally, add the signing certificate password to the repo as a secret and name it “Pfx_Key”.
# See “Build the Windows Application Packaging project” below to see how the secret is used.
WapProjTemplate1_TemporaryKey.pfx
を作成する際に使用したパスワードをGitHubのリポジトリのシークレットな環境変数にPfx_Key
として追加する必要があるようです。先程と同じように[New Secret]をクリックして「Name」にPfx_Key
、「Value」にパスワードを設定し、[Add secret]をクリックして追加します。
これで事前準備は完了です。
GitHub Actionsを設定する
GitHubのリポジトリで[Actions]タブをクリックします。一番上にサジェストされている「.NET Core Desktop」が使用するワークフローテンプレートになります。このテンプレートの[Set up this workflow]をクリックします。
すると「スターターワークフローテンプレート」と同じ内容のファイルdotnet-core-desktop.yml
が作成されるのでこちらを編集します。
env
セクション(59~62行目)の各変数は以下のように更新します。
Solution_Name: WpfNetCoreApp1.sln Test_Project_Path: NUnitTestProject1\NUnitTestProject1.csproj Wap_Project_Directory: WapProjTemplate1 Wap_Project_Path: WapProjTemplate1\WapProjTemplate1.wapproj
81~82行目の「Execute unit tests」でdotnet test
コマンドのパラメータが設定されておらすこのまま実行するとエラーになります。ここではパラメータとして$env:Test_Project_Path
を設定します。
run: dotnet test $env:Test_Project_Path
また、107~108行目の「Remove the pfx」で$env:Signing_Certificate
という変数が出てくるのですが、上記のようにそのような変数は設定されておらずこのまま実行するとこの部分でエラーになります。91~95行目の「Decode the pfx」で作成されたファイルGitHubActionsWorkflow.pfx
を設定すればよさそうなのでこちらをenv
セクションの一番下(63行目)に設定します。
Signing_Certificate: GitHubActionsWorkflow.pfx
これでdotnet-core-desktop.yml
の編集は完了です。[Start commit]をクリックしてさらに[Commit new file]をクリックします。
GitHubレポジトリの[Action]タブをクリックしてワークフローの実行状況を確認します。
実はこの状態で実行した場合でも99~105行目の「Create the app package」でエラーになります。
Ensure that restore has run and that you have included ‘netcoreapp3.1’ in the TargetFrameworks for your project. You may also need to include ‘win-x86’ in your project’s RuntimeIdentifiers.
WPFアプリのプロジェクトファイルにRuntimeIdentifiers
でwin-x86
が設定されていないため発生しているエラーのようです。Visual StudioでWpfNetCoreApp1.csproj
に以下を追加して再度GitHubのリポジトリにプッシュします。
<RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
GitHub Actionsのワークフローが自動的に実行されます。今度は成功するハズです。
「Artifacts」にあるリンク「MSIX Package」をクリックするとMSIXパッケージがダウンロードできます。
MSIXパッケージからアプリケーションをインストール方法はこちらの記事を参考にしてください。
まとめ
以上がGitHub Actionsを使用したWPFアプリをビルドする手順になります。
グレープシティのWPF製品を利用したWPFアプリをビルドする手順については、現時点でまだ確定したことは言えないのですが、今回の手順にさらに一手間(Self-hosted runnersの設定)を加える必要がありそうなことが分かっています。こちらは調査が完了次第「後編」として後ほど公開したいと思います。