UWP アプリの自動ビルドを設定する

Azure Pipelines を使って、UWP プロジェクトの自動ビルドを作成することができます。 この記事では、これを行うためのさまざまな方法を見ていきます。 他の任意のビルド システムと統合できるように、コマンド ラインを使用してこれらのタスクを実行する方法も示します。

新しい Azure パイプラインを作成する

まだの場合、まず、Azure Pipelines にサインアップします

次に、ソース コードのビルドに使用できるパイプラインを作成します。 パイプラインをビルドして GitHub リポジトリをビルドするチュートリアルについては、「最初のパイプラインを作成」を参照してください。 Azure Pipelines では、こちらの記事に一覧表示されているリポジトリの種類がサポートされています。

自動ビルドを設定する

まず、Azure Dev Ops で利用できる既定の UWP ビルドの定義から始めて、パイプラインの構成方法を示します。

ビルド定義テンプレートの一覧で、 [ユニバーサル Windows プラットフォーム] テンプレートを選択します。

Select the UWP template

このテンプレートには、UWP プロジェクトをビルドするための基本的な構成が含まれています。

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'x86|x64|ARM'
  buildConfiguration: 'Release'
  appxPackageDir: '$(build.artifactStagingDirectory)\AppxPackages\\'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'

- task: VSBuild@1
  inputs:
    platform: 'x86'
    solution: '$(solution)'
    configuration: '$(buildConfiguration)'
    msbuildArgs: '/p:AppxBundlePlatforms="$(buildPlatform)" /p:AppxPackageDir="$(appxPackageDir)" /p:AppxBundle=Always /p:UapAppxPackageBuildMode=StoreUpload'

既定のテンプレートでは、.csproj ファイルに指定されている証明書でのパッケージへの署名が試行されます。 ビルド中にパッケージに署名する場合は、秘密キーにアクセスできる必要があります。 それ以外の場合は、YAML ファイルの msbuildArgs セクションにパラメーター /p:AppxPackageSigningEnabled=false を追加することにより、署名を無効にできます。

セキュア ファイル ライブラリにプロジェクト証明書を追加する

可能な限り、リポジトリに証明書を送信することは避けてください。git では既定でそれらが無視されます。 証明書などの機密性の高いファイルの安全な処理を管理するために、Azure DevOps では、セキュア ファイル機能がサポートされています。

自動ビルドの証明書をアップロードするには、次の手順に従います。

  1. Azure Pipelines のナビゲーション ウィンドウで [パイプライン] を展開し、 [ライブラリ] をクリックします。

  2. [セキュア ファイル] タブをクリックし、 [+ セキュア ファイル] をクリックします。

    Screenshot of Azure with the Library option highlighted showing the Secure files page.

  3. 証明書ファイルを参照し、 [OK] をクリックします。

  4. 証明書をアップロードしたら、それを選択してそのプロパティを表示します。 [パイプラインのアクセス許可] で、 [すべてのパイプラインで使用するために承認します。] を有効に切り替えます。

    Screenshot of the Pipeline permissions section with the Authorize for use in all pipelines option selected.

  5. 証明書の秘密キーにパスワードが含まれている場合は、パスワードを Azure Key Vault に保存し、パスワードを変数グループにリンクすることをお勧めします。 その変数を使用して、パイプラインからパスワードにアクセスできます。 パスワードは秘密キーに対してのみサポートされていることに注意してください。パスワードで保護されている証明書ファイルを使用することは、現在サポートされていません。

注意

Visual Studio 2019 以降では、UWP プロジェクトで一時的な証明書が生成されなくなりました。 証明書を作成またはエクスポートするには、こちらの記事に記載されている PowerShell コマンドレットを使用します。

ソリューションのビルドのビルド タスクを構成する

このタスクでは、作業フォルダーにあるすべてのソリューションをバイナリにコンパイルし、出力アプリ パッケージ ファイルを生成します。 このタスクでは、MSBuild 引数を使用します。 これらの引数の値を指定する必要があります。 次の表をガイドとして使用してください。

MSBuild 引数 説明
AppxPackageDir $(Build.ArtifactStagingDirectory)\AppxPackages 生成された成果物を格納するフォルダーを定義します。
AppxBundlePlatforms $(Build.BuildPlatform) バンドルに含めるプラットフォームを定義できます。
AppxBundle 常に表示する 指定されているプラットフォームの .msix/.appx ファイルを含む .msixbundle/.appxbundle が作成されます。
UapAppxPackageBuildMode StoreUpload サイドローディング用の .msixupload/.appxupload ファイルと _Test フォルダーが生成されます。
UapAppxPackageBuildMode CI .msixupload/.appxupload ファイルのみが生成されます。
UapAppxPackageBuildMode SideloadOnly サイドローディング用の _Test フォルダーのみが生成されます。
AppxPackageSigningEnabled true パッケージの署名を有効にします。
PackageCertificateThumbprint 証明書の拇印 この値は、署名証明書の拇印と一致しているか、空の文字列である必要があります
PackageCertificateKeyFile パス 使用する証明書へのパス。 これは、セキュア ファイルのメタデータから取得されます。
PackageCertificatePassword Password 証明書の秘密キーのパスワード。 パスワードを Azure Key Vault に保存し、パスワードを変数グループにリンクすることをお勧めします。 この引数に変数を渡すことができます。

ビルドを構成する

コマンド ラインを使って、つまり、他のビルド システムを使って、ソリューションをビルドする場合は、これらの引数を指定して MSBuild を実行します。

/p:AppxPackageDir="$(Build.ArtifactStagingDirectory)\AppxPackages\\"
/p:UapAppxPackageBuildMode=StoreUpload
/p:AppxBundlePlatforms="$(Build.BuildPlatform)"
/p:AppxBundle=Always

パッケージ署名の構成

MSIX (または .appx) パッケージに署名するには、パイプラインで署名証明書を取得する必要があります。 これを行うには、VSBuild タスクの前に DownloadSecureFile タスクを追加します。 これにより、signingCert 経由で署名証明書にアクセスできるようになります。

- task: DownloadSecureFile@1
  name: signingCert
  displayName: 'Download CA certificate'
  inputs:
    secureFile: '[Your_Pfx].pfx'

次に、署名証明書を参照するように VSBuild タスクを更新します。

- task: VSBuild@1
  inputs:
    platform: 'x86'
    solution: '$(solution)'
    configuration: '$(buildConfiguration)'
    msbuildArgs: '/p:AppxBundlePlatforms="$(buildPlatform)" 
                  /p:AppxPackageDir="$(appxPackageDir)" 
                  /p:AppxBundle=Always 
                  /p:UapAppxPackageBuildMode=StoreUpload 
                  /p:AppxPackageSigningEnabled=true
                  /p:PackageCertificateThumbprint="" 
                  /p:PackageCertificateKeyFile="$(signingCert.secureFilePath)"'

注意

PackageCertificateThumbprint 引数は、予防措置として、意図的に空の文字列に設定されます。 拇印がプロジェクトで設定されていても、署名証明書と一致しない場合、ビルドは失敗し、次のエラーが表示されます。Certificate does not match supplied signing thumbprint

パラメーターの確認

$() 構文で定義されたパラメーターは、ビルド定義で定義される変数で、他のビルド システムでは変更されます。

default variables

すべての定義済みの変数を表示するには、「定義済みのビルド変数」をご覧ください。

ビルド成果物の発行タスクを構成する

既定の UWP パイプラインでは、生成された成果物は保存されません。 発行機能を YAML 定義に追加するには、次のタスクを追加します。

- task: CopyFiles@2
  displayName: 'Copy Files to: $(build.artifactstagingdirectory)'
  inputs:
    SourceFolder: '$(system.defaultworkingdirectory)'
    Contents: '**\bin\$(BuildConfiguration)\**'
    TargetFolder: '$(build.artifactstagingdirectory)'

- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: drop'
  inputs:
    PathtoPublish: '$(build.artifactstagingdirectory)'

生成された成果物は、ビルド結果ページの [成果物] オプションで確認できます。

artifacts

ここでは、UapAppxPackageBuildMode 引数を StoreUpload に設定しているため、成果物フォルダーには、ストアに提出するためのパッケージ (.msixupload/.appxupload) が含まれます。 通常のアプリ パッケージ (.msix と .appx) やアプリ バンドル (.msixbundle と .appxbundle) もストアに提出できることに注意してください。 この資料の目的上、.appxupload ファイルを使います。

バンドル エラーに対処する

ソリューションに複数の UWP プロジェクトを追加してから、バンドルを作成しようとすると、このようなエラーが表示される場合があります。

MakeAppx(0,0): Error : Error info: error 80080204: The package with file name "AppOne.UnitTests_0.1.2595.0_x86.appx" and package full name "8ef641d1-4557-4e33-957f-6895b122f1e6_0.1.2595.0_x86__scrj5wvaadcy6" is not valid in the bundle because it has a different package family name than other packages in the bundle

このエラーが表示されるのは、ソリューション レベルで、バンドルに含めるアプリが明確ではないためです。 この問題を解決するには、各プロジェクト ファイルを開き、最初の <PropertyGroup> 要素の末尾に以下のプロパティを追加します。

プロジェクト [プロパティ]
アプリ <AppxBundle>Always</AppxBundle>
UnitTests <AppxBundle>Never</AppxBundle>

その後、ビルド ステップから MSBuild の AppxBundle 引数を削除します。