Menyiapkan build otomatis untuk aplikasi UWP Anda

Anda dapat menggunakan Azure Pipelines untuk membuat build otomatis untuk proyek UWP. Dalam artikel ini, kita akan melihat berbagai cara untuk melakukan ini. Kami juga akan menunjukkan kepada Anda cara melakukan tugas-tugas ini dengan menggunakan baris perintah sehingga Anda dapat berintegrasi dengan sistem build lainnya.

Membuat Alur Azure baru

Mulailah dengan mendaftar untuk Azure Pipelines jika Anda belum melakukannya.

Selanjutnya, buat alur yang dapat Anda gunakan untuk membangun kode sumber Anda. Untuk tutorial tentang membangun alur untuk membangun repositori GitHub, lihat Membuat alur pertama Anda. Azure Pipelines mendukung jenis repositori yang tercantum dalam artikel ini.

Menyiapkan build otomatis

Kita akan mulai dengan definisi build UWP default yang tersedia di Azure Dev Ops lalu menunjukkan kepada Anda cara mengonfigurasi alur.

Dalam daftar templat definisi build, pilih templat Platform Windows Universal.

Select the UWP template

Templat ini mencakup konfigurasi dasar untuk membangun proyek UWP Anda:

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'

Templat default mencoba menandatangani paket dengan sertifikat yang ditentukan dalam file .csproj. Jika Anda ingin menandatangani paket selama build, Anda harus memiliki akses ke kunci privat. Jika tidak, Anda dapat menonaktifkan penandatanganan dengan menambahkan parameter /p:AppxPackageSigningEnabled=false ke bagian msbuildArgs dalam file YAML.

Menambahkan sertifikat proyek Anda ke pustaka File aman

Anda harus menghindari pengiriman sertifikat ke repositori Anda jika memungkinkan, dan git mengabaikannya secara default. Untuk mengelola penanganan aman file sensitif seperti sertifikat, Azure DevOps mendukung fitur file aman.

Untuk mengunggah sertifikat untuk build otomatis Anda:

  1. Di Azure Pipelines, perluas Alur di panel navigasi dan klik Pustaka.

  2. Klik tab Amankan file lalu klik + File aman.

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

  3. Telusuri ke file sertifikat dan klik OK.

  4. Setelah Anda mengunggah sertifikat, pilih sertifikat untuk menampilkan propertinya. Di bawah Izin alur, aktifkan tombol Otorisasi untuk digunakan di semua alur .

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

  5. Jika kunci privat dalam sertifikat memiliki kata sandi, kami sarankan Anda menyimpan kata sandi di Azure Key Vault lalu menautkan kata sandi ke grup variabel. Anda dapat menggunakan variabel untuk mengakses kata sandi dari alur. Perhatikan bahwa kata sandi hanya didukung untuk kunci privat; menggunakan file sertifikat yang dilindungi kata sandi saat ini tidak didukung.

Catatan

Mulai visual Studio 2019, sertifikat sementara tidak lagi dihasilkan dalam proyek UWP. Untuk membuat atau mengekspor sertifikat, gunakan cmdlet PowerShell yang dijelaskan dalam artikel ini.

Mengonfigurasi tugas build solusi Build

Tugas ini mengkompilasi solusi apa pun yang ada di folder kerja ke biner dan menghasilkan file paket aplikasi output. Tugas ini menggunakan argumen MSBuild. Anda harus menentukan nilai argumen tersebut. Gunakan tabel berikut sebagai panduan.

Argumen MSBuild Nilai Deskripsi
AppxPackageDir $(Build.ArtifactStagingDirectory)\AppxPackages Menentukan folder untuk menyimpan artefak yang dihasilkan.
AppxBundlePlatforms $(Build.BuildPlatform) Memungkinkan Anda menentukan platform yang akan disertakan dalam bundel.
AppxBundle Selalu Membuat .msixbundle/.appxbundle dengan file .msix/.appx untuk platform yang ditentukan.
UapAppxPackageBuildMode StoreUpload Menghasilkan file .msixupload/.appxupload dan folder _Test untuk sideloading.
UapAppxPackageBuildMode CI Menghasilkan file .msixupload/.appxupload saja.
UapAppxPackageBuildMode SideloadOnly Menghasilkan folder _Test untuk memuat samping saja.
AppxPackageSigningEnabled benar Mengaktifkan penandatanganan paket.
PackageCertificateThumbprint Thumbprint sertifikat Nilai ini harus cocok dengan thumbprint dalam sertifikat penandatanganan, atau menjadi string kosong.
PackageCertificateKeyFile Jalur Jalur ke sertifikat yang akan digunakan. Ini diambil dari metadata file aman.
PackageCertificatePassword Kata sandi Kata sandi untuk kunci privat dalam sertifikat. Kami menyarankan agar Anda menyimpan kata sandi di Azure Key Vault dan menautkan kata sandi ke grup variabel. Anda dapat meneruskan variabel ke argumen ini.

Mengonfigurasi build

Jika Anda ingin membangun solusi dengan menggunakan baris perintah, atau dengan menggunakan sistem build lainnya, jalankan MSBuild dengan argumen ini.

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

Mengonfigurasi penandatanganan paket

Untuk menandatangani paket MSIX (atau .appx), alur perlu mengambil sertifikat penandatanganan. Untuk melakukan ini, tambahkan tugas DownloadSecureFile sebelum tugas VSBuild. Ini akan memberi Anda akses ke sertifikat penandatanganan melalui signingCert.

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

Selanjutnya, perbarui tugas VSBuild untuk mereferensikan sertifikat penandatanganan:

- 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)"'

Catatan

Argumen PackageCertificateThumbprint sengaja diatur ke string kosong sebagai tindakan pencegahan. Jika thumbprint diatur dalam proyek tetapi tidak cocok dengan sertifikat penandatanganan, build akan gagal dengan kesalahan: Certificate does not match supplied signing thumbprint.

Meninjau parameter

Parameter yang ditentukan dengan $() sintaksis adalah variabel yang ditentukan dalam definisi build, dan akan berubah dalam sistem build lainnya.

default variables

Untuk melihat semua variabel yang telah ditentukan sebelumnya, lihat Variabel build yang telah ditentukan sebelumnya.

Mengonfigurasi tugas Terbitkan Artefak Build

Alur UWP default tidak menyimpan artefak yang dihasilkan. Untuk menambahkan kemampuan penerbitan ke definisi YAML Anda, tambahkan tugas berikut.

- 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)'

Anda dapat melihat artefak yang dihasilkan di opsi Artefak dari halaman hasil build.

artifacts

Karena kami telah mengatur UapAppxPackageBuildMode argumen ke StoreUpload, folder artefak menyertakan paket untuk pengiriman ke Store (.msixupload/.appxupload). Perhatikan bahwa Anda juga dapat mengirimkan paket aplikasi reguler (.msix/.appx) atau app bundle (.msixbundle/.appxbundle/) ke Store. Untuk tujuan artikel ini, kita akan menggunakan file .appxupload.

Mengatasi kesalahan bundel

Jika Anda menambahkan lebih dari satu proyek UWP ke solusi Anda lalu mencoba membuat bundel, Anda mungkin menerima kesalahan seperti ini.

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

Kesalahan ini muncul karena pada tingkat solusi, tidak jelas aplikasi mana yang akan muncul di bundel. Untuk mengatasi masalah ini, buka setiap file proyek dan tambahkan properti berikut di akhir elemen pertama <PropertyGroup> .

Project Properti
App <AppxBundle>Always</AppxBundle>
UnitTests <AppxBundle>Never</AppxBundle>

Kemudian, hapus AppxBundle argumen MSBuild dari langkah build.