GrapeCity.devlog

グレープシティ株式会社のDeveloper Tools〈開発支援ツール〉の、製品のTIPSや発売などに関する最新情報をお届けします。

GrapeCity

GitHub ActionsでWPFアプリをビルドしてみる(前編)

普段のお仕事に役立つ普遍的なプログラミングTIPSや、業界で注目度が高い最新情報をお届けする「編集部ピックアップ」。今回はGitHub Actionsを使ったWPFアプリのビルド方法についてお届けします。


.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なので、x86x64を追加しておくとエラーにならずに済みます。また、証明書のファイル名は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アプリのプロジェクトファイルにRuntimeIdentifierswin-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の設定)を加える必要がありそうなことが分かっています。こちらは調査が完了次第「後編」として後ほど公開したいと思います。


  • グレープシティ株式会社のDeveloper Tools〈開発支援ツール〉の製品・技術資料をご覧ください。
  • グレープシティ株式会社のDeveloper Tools〈開発支援ツール〉の製品のデモアプリケーションをお試しください。