Mengonfigurasi alur CI/CD dengan file YAML

Tabel di bawah ini mencantumkan argumen MSBuild yang berbeda yang dapat Anda tentukan untuk menyiapkan alur build Anda.

Argumen MSBuild Nilai Deskripsi
AppxPackageDir $(Build.ArtifactStagingDirectory)\AppxPackages Menentukan folder untuk menyimpan artefak yang dihasilkan.
AppxBundlePlatforms $(Build.BuildPlatform) Memungkinkan Anda menentukan platform untuk 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.

Sebelum membangun proyek pengemasan dengan cara yang sama seperti wizard di Visual Studio menggunakan baris perintah MSBuild, proses build dapat membuat versi paket MSIX yang sedang diproduksi dengan mengedit atribut Versi elemen Paket dalam file Package.appxmanifest. Di Azure Pipelines, ini dapat dicapai dengan menggunakan ekspresi untuk mengatur variabel penghitung yang bertambah untuk setiap build, dan skrip PowerShell yang menggunakan System.Xml. Kelas Linq.XDocument di .NET untuk mengubah nilai atribut.

Contoh File YAML yang menentukan Alur Build MSIX

pool: 
  vmImage: windows-2019
  
variables:
  buildPlatform: 'x86'
  buildConfiguration: 'release'
  major: 1
  minor: 0
  build: 0
  revision: $[counter('rev', 0)]
  
steps:
- powershell: |
     # Update appxmanifest. This must be done before the build.
     [xml]$manifest= get-content ".\Msix\Package.appxmanifest"
     $manifest.Package.Identity.Version = "$(major).$(minor).$(build).$(revision)"    
     $manifest.save("Msix/Package.appxmanifest")
  displayName: 'Version Package Manifest'
  
- task: MSBuild@1
  inputs:
    solution: Msix/Msix.wapproj
    platform: $(buildPlatform)
    configuration: $(buildConfiguration)
    msbuildArguments: '/p:OutputPath=NonPackagedApp
     /p:UapAppxPackageBuildMode=SideLoadOnly  /p:AppxBundle=Never /p:AppxPackageOutput=$(Build.ArtifactStagingDirectory)\MsixDesktopApp.msix /p:AppxPackageSigningEnabled=false'
  displayName: 'Package the App'
  
- task: DownloadSecureFile@1
  inputs:
    secureFile: 'certificate.pfx'
  displayName: 'Download Secure PFX File'
  
- script: '"C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86\signtool"
    sign /fd SHA256 /f $(Agent.TempDirectory)/certificate.pfx /p secret $(
    Build.ArtifactStagingDirectory)/MsixDesktopApp.msix'
  displayName: 'Sign MSIX Package'
  
- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: drop'

Di bawah ini adalah perincian berbagai tugas Build yang ditentukan dalam file YAMl:

Mengonfigurasi properti pembuatan paket

Definisi di bawah ini menetapkan direktori komponen Build, platform, dan menentukan apakah akan membuat bundel atau tidak.

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

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 MSBuild untuk mereferensikan sertifikat penandatanganan:

- task: MSBuild@1
  inputs:
    platform: 'x86'
    solution: '$(solution)'
    configuration: '$(buildConfiguration)'
    msbuildArgs: '/p:AppxBundlePlatforms="$(buildPlatform)" 
                  /p:AppxPackageDir="$(appxPackageDir)" 
                  /p:AppxBundle=Never 
                  p:UapAppxPackageBuildMode=SideLoadOnly 
                  /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.

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

Mengonfigurasi tugas Terbitkan Artefak Build

Alur MSIX default tidak menyimpan artefak yang dihasilkan. Untuk menambahkan kapabilitas 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.

File AppInstaller untuk distribusi non-penyimpanan

Jika Anda mendistribusikan aplikasi di luar Store, Anda dapat memanfaatkan file AppInstaller untuk penginstalan dan pembaruan paket Anda

File .appinstaller yang Akan Mencari File yang Diperbarui di \server\foo

<?xml version="1.0" encoding="utf-8"?>
<AppInstaller xmlns="http://schemas.microsoft.com/appx/appinstaller/2018"
              Version="1.0.0.0"
              Uri="\\server\foo\MsixDesktopApp.appinstaller">
  <MainPackage Name="MyCompany.MySampleApp"
               Publisher="CN=MyCompany, O=MyCompany, L=Stockholm, S=N/A, C=Sweden"
               Version="1.0.0.0"
               Uri="\\server\foo\MsixDesktopApp.msix"
               ProcessorArchitecture="x86"/>
  <UpdateSettings>
    <OnLaunch HoursBetweenUpdateChecks="0" />
  </UpdateSettings>
</AppInstaller>

Elemen UpdateSettings digunakan untuk memberi tahu sistem kapan harus memeriksa pembaruan dan apakah akan memaksa pengguna untuk memperbarui. Referensi skema lengkap, termasuk namespace yang didukung untuk setiap versi Windows 10, dapat ditemukan di dokumen di bit.ly/2TGWnCR.

Jika Anda menambahkan file .appinstaller ke proyek pengemasan dan mengatur properti Tindakan Paketnya ke Konten dan properti Salin ke Direktori Output ke Salin jika lebih baru, Anda kemudian dapat menambahkan tugas PowerShell lain ke file YAML yang memperbarui atribut Versi elemen root dan MainPackage dan menyimpan file yang diperbarui ke direktori penahapan:

- powershell: |
  [Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq")
  $doc = [System.Xml.Linq.XDocument]::Load(
    "$(Build.SourcesDirectory)/Msix/Package.appinstaller")
  $version = "$(major).$(minor).$(build).$(revision)"
  $doc.Root.Attribute("Version").Value = $version;
  $xName =
    [System.Xml.Linq.XName]
      "{http://schemas.microsoft.com/appx/appinstaller/2018}MainPackage"
  $doc.Root.Element($xName).Attribute("Version").Value = $version;
  $doc.Save("$(Build.ArtifactStagingDirectory)/MsixDesktopApp.appinstaller")
displayName: 'Version App Installer File'

Anda kemudian akan mendistribusikan file .appinstaller ke pengguna akhir Anda dan membiarkan mereka mengklik dua kali pada file ini alih-alih file .msix untuk menginstal aplikasi yang dipaketkan.

Penerapan Berkelanjutan

File alat penginstal aplikasi itu sendiri adalah file XML yang tidak dikommpilasikan yang dapat diedit setelah build, jika diperlukan. Ini memudahkan penggunaan saat Anda menyebarkan perangkat lunak ke beberapa lingkungan dan ketika Anda ingin memisahkan alur build dari proses rilis.

Jika Anda membuat alur rilis di Portal Microsoft Azure menggunakan templat "Pekerjaan kosong" dan menggunakan alur build yang baru disiapkan sebagai sumber artefak yang akan disebarkan, Anda kemudian dapat menambahkan tugas PowerShell ke tahap rilis untuk mengubah nilai dua atribut Uri secara dinamis dalam file .appinstaller untuk mencerminkan lokasi tempat aplikasi diterbitkan.

Tugas Alur Rilis yang Memodifikasi Uri di File .appinstaller

- powershell: |
  [Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq")
  $fileShare = "\\filesharestorageccount.file.core.windows.net\myfileshare\"
  $localFilePath =
    "$(System.DefaultWorkingDirectory)\_MsixDesktopApp\drop\MsixDesktopApp.appinstaller"
  $doc = [System.Xml.Linq.XDocument]::Load("$localFilePath")
  $doc.Root.Attribute("Uri").Value = [string]::Format('{0}{1}', $fileShare,
    'MsixDesktopApp.appinstaller')
  $xName =
    [System.Xml.Linq.XName]"{http://schemas.microsoft.com/appx/appinstaller/2018}MainPackage"
  $doc.Root.Element($xName).Attribute("Uri").Value = [string]::Format('{0}{1}',
    $fileShare, 'MsixDesktopApp.appx')
  $doc.Save("$localFilePath")
displayName: 'Modify URIs in App Installer File'

Dalam tugas di atas, URI diatur ke jalur UNC dari berbagi file Azure. Karena di sinilah OS akan mencari paket MSIX saat Anda menginstal dan memperbarui aplikasi, saya juga telah menambahkan skrip baris perintah lain ke alur rilis yang pertama kali memetakan berbagi file di cloud ke Z lokal:\ drive pada agen build sebelum menggunakan perintah xcopy untuk menyalin file .appinstaller dan .msix di sana:

- script: |
  net use Z: \\filesharestorageccount.file.core.windows.net\myfileshare
    /u:AZURE\filesharestorageccount
    3PTYC+ociHIwNgCnyg7zsWoKBxRmkEc4Aew4FMzbpUl/
    dydo/3HVnl71XPe0uWxQcLddEUuq0fN8Ltcpc0LYeg==
  xcopy $(System.DefaultWorkingDirectory)\_MsixDesktopApp\drop Z:\ /Y
  displayName: 'Publish App Installer File and MSIX package'

Jika Anda menghosting Azure DevOps Server lokal Anda sendiri, Anda mungkin tentu saja menerbitkan file ke berbagi jaringan internal Anda sendiri.

Jika Anda memilih untuk menerbitkan ke server Web, Anda dapat memberi tahu MSBuild untuk membuat file .appinstaller versi dan halaman HTML yang berisi tautan unduhan dan beberapa informasi tentang aplikasi paket dengan menyediakan beberapa argumen tambahan dalam file YAML:

- task: MSBuild@1
  inputs:
    solution: Msix/Msix.wapproj
    platform: $(buildPlatform)
    configuration: $(buildConfiguration)
    msbuildArguments: '/p:OutputPath=NonPackagedApp /p:UapAppxPackageBuildMode=SideLoadOnly  /p:AppxBundle=Never /p:GenerateAppInstallerFile=True
/p:AppInstallerUri=http://yourwebsite.com/packages/ /p:AppInstallerCheckForUpdateFrequency=OnApplicationRun /p:AppInstallerUpdateFrequency=1 /p:AppxPackageDir=$(Build.ArtifactStagingDirectory)/'
  displayName: 'Package the App'

File HTML yang dihasilkan menyertakan hyperlink yang diawali dengan skema aktivasi protokol ms-appinstaller browser-agnostik:

<a href="ms-appinstaller:?source=
  http://yourwebsite.com/packages/Msix_x86.appinstaller ">Install App</a>

Jika Anda menyiapkan alur rilis yang menerbitkan konten folder drop ke intranet Anda atau situs Web lainnya, dan server Web mendukung permintaan rentang byte dan dikonfigurasi dengan benar, pengguna akhir Anda dapat menggunakan tautan ini untuk langsung menginstal aplikasi tanpa mengunduh paket MSIX terlebih dahulu.