設定 UWP 應用程式的自動化組建
您可以使用 Azure Pipelines 來建立 UWP 專案的自動化組建。 在此文章中,我們會探討執行此操作的不同方式。 我們也會說明如何透過使用命令列來執行這些工作,這樣您就可以與任何其他建置系統整合。
先從註冊 Azure Pipelines 開始 (如果尚未這樣做)。
接下來,建立一條您可以用來建立原始程式碼的管線。 如需建置管線以建置 GitHub 存放庫的教學課程,請參閱建立您的第一條管線。 Azure Pipelines 支援這篇文章中列出的存放庫類型。
我們將從 Azure Dev Ops 中可用的預設 UWP 組建定義開始,然後向您示範如何設定管線。
在組建定義範本清單中,選擇 [通用 Windows 平台] 範本。
此範本包括用於建置 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 檔案中指定的憑證來簽署套件。 如果您想要在建置期間簽署套件,您必須具有私密金鑰的存取權。 否則,您可以透過將參數 /p:AppxPackageSigningEnabled=false
新增至 YAML 檔案中的 msbuildArgs
區段來停用簽署。
您應該儘可能避免將憑證提交至存放庫,而且 git 依預設則會忽略。 為了管理敏感檔案 (例如憑證) 的安全處理,Azure DevOps 支援安全檔案功能。
若要上傳憑證進行自動化建置:
在 Azure Pipelines 中,展開瀏覽窗格中的 [管線],然後按一下 [程式庫]。
按一下 [安全檔案] 索引標籤,然後按一下 [+ 安全檔案]。
瀏覽至憑證檔案,然後按一下 [確定]。
在您上傳憑證之後,請選取其來檢視其屬性。 在 [管線權限] 下,啟用 [授權在所有管線中使用] 的切換。
如果憑證中的私密金鑰有密碼,建議您將密碼儲存在 Azure Key Vault,然後將密碼連結到變數群組。 您可以使用變數來存取管線中的密碼。 請注意,只有私密金鑰才支援密碼;目前不支援使用本身受到密碼保護的憑證檔案。
注意
從 Visual Studio 2019 開始,UWP 專案中不會再產生暫時憑證。 若要建立或匯出憑證,請使用這篇文章所述的 PowerShell Cmdlet。
這個工作會將任何工作資料夾中的解決方案編譯為二進位檔,並產生輸出應用程式套件檔案。 這個工作會使用 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 | 密碼 | 憑證中私密金鑰的密碼。 建議您將密碼儲存在 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
。
使用 $()
語法定義的參數為組建定義中定義的變數,且在其他的建置系統中將會變更。
若要檢視所有預先定義的變數,請參閱預先定義的建置變數。
預設 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)'
您可以在建置結果頁面的 [成品] 選項中查看產生的成品。
因為我們已將 UapAppxPackageBuildMode
引數設定為 StoreUpload
,成品資料夾包含提交至 Microsoft Store 的套件 (.msixupload/.appxupload)。 請注意,您也可以提交一般應用程式套件 (.msix/.appx) 或應用程式套件組合 (.msixbundle/.appxbundle/) 至 Microsoft Store。 根據此文章的用途,我們將使用 .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>
元素的結尾處新增下列屬性。
計畫 | 屬性 |
---|---|
App | <AppxBundle>Always</AppxBundle> |
UnitTests | <AppxBundle>Never</AppxBundle> |
然後,從建置步驟中移除 AppxBundle
MSBuild 引數。