Einrichten automatisierter Builds für UWP-Apps
Du kannst Azure-Pipelines verwenden, um automatisierte Builds für UWP-Projekte zu erstellen. In diesem Artikel werden verschiedene Möglichkeiten erläutert, dies zu realisieren. Außerdem wird erläutert, wie diese Aufgaben über die Befehlszeile ausgeführt werden, um die Integration in beliebige andere Buildsysteme zu ermöglichen.
Erstellen einer neuen Azure-Pipeline
Beginne damit, dich für Azure-Pipelines anzumelden, falls dies noch nicht geschehen ist.
Als nächstes erstellst du eine Pipeline, die du zum Erstellen deines Quellcodes verwenden kannst. Ein Tutorial über das Erstellen einer Pipeline zur Erstellung eines GitHub-Repositorys findest du unter Erstellen einer ersten Pipeline. Azure Pipelines unterstützt die in diesem Artikel aufgeführten Repositorytypen.
Einrichten eines automatisierten Builds
Wir beginnen mit der standardmäßigen UWP-Builddefinition, die in Azure Dev Ops verfügbar ist, und zeigen dir, wie du die Pipeline konfigurierst.
Wählen Sie in der Liste der Builddefinitionsvorlagen die Vorlage Universelle Windows-Plattform aus.
Diese Vorlage enthält die grundlegende Konfiguration zum Erstellen des UWP-Projekts:
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'
Die Standardvorlage versucht, das Paket mit dem Zertifikat zu signieren, das in der CSPROJ-Datei angegeben ist. Wenn du das Paket während des Builds signieren möchtest, musst du Zugriff auf den privaten Schlüssel haben. Andernfalls kannst du die Signierung deaktivieren, indem du den Parameter /p:AppxPackageSigningEnabled=false
dem Abschnitt msbuildArgs
in der YAML-Datei hinzufügst.
Hinzufügen eines Projektzertifikats zur Bibliothek für sichere Dateien
Du solltest die Übermittlung von Zertifikaten an dein Repository möglichst vermeiden und von Git werden sie standardmäßig ignoriert. Um die sichere Handhabung vertraulicher Dateien wie Zertifikate zu verwalten, unterstützt Azure DevOps das Feature Sichere Dateien.
So lädst du ein Zertifikat für deinen automatisierten Build hoch
Erweitere in Azure Pipelines die Option Pipelines im Navigationsbereich und klicke auf Bibliothek.
Klicke auf die Registerkarte Sichere Dateien und dann auf + Sichere Datei.
Navigiere zu der Zertifikatsdatei und klicke auf OK.
Nachdem du das Zertifikat hochgeladen hast, wähle es aus, um seine Eigenschaften anzuzeigen. Aktiviere unter Pipelineberechtigungen den Schalter Zur Verwendung in allen Pipelines autorisieren.
Wenn der private Schlüssel im Zertifikat ein Kennwort aufweist, wird empfohlen, das Kennwort in Azure Key Vault zu speichern und das Kennwort dann mit einer Variablengruppe zu verknüpfen. Mithilfe der Variablen kannst du auf das Kennwort von der Pipeline zugreifen. Hierbei ist zu beachten, dass ein Kennwort nur für den privaten Schlüssel unterstützt wird. Die Verwendung einer Zertifikatsdatei, die selbst kennwortgeschützt ist, wird derzeit nicht unterstützt.
Hinweis
Ab Visual Studio 2019 wird in UWP-Projekten kein temporäres Zertifikat mehr generiert. Verwende zum Erstellen oder Exportieren von Zertifikaten die in diesem Artikel beschriebenen PowerShell-Cmdlets.
Konfigurieren der Buildaufgabe „Projektmappe erstellen“
Mit dieser Aufgabe wird eine im Arbeitsordner enthaltene Projektmappe in Binärdateien kompiliert, und die App-Paketdatei wird erstellt. In dieser Aufgabe werden MSBuild-Argumente verwendet. Sie müssen den Wert dieser Argumente angeben. Orientieren Sie sich an der folgenden Tabelle.
MSBuild-Argument | Wert | Beschreibung |
---|---|---|
AppxPackageDir | $(Build.ArtifactStagingDirectory)\AppxPackages | Definiert den Ordner, in dem die generierten Artefakte gespeichert werden. |
AppxBundlePlatforms | $(Build.BuildPlatform) | Ermöglicht es dir, die Plattformen zu definieren, die in das Bundle aufgenommen werden sollen. |
AppxBundle | Immer | Erstellt ein .msixbundle/.appxbundle mit den MSIX-/APPX-Dateien für die angegebene Plattform. |
UapAppxPackageBuildMode | StoreUpload | Generiert die .msixupload-/.appxupload-Datei und den Ordner _Test für das Querladen. |
UapAppxPackageBuildMode | CI | Generiert nur die .msixupload-/.appxupload-Datei. |
UapAppxPackageBuildMode | SideloadOnly | Generiert den Ordner _Test nur für das Querladen. |
AppxPackageSigningEnabled | wahr | Aktiviert das Signieren von Paketen. |
PackageCertificateThumbprint | Zertifikatfingerabdruck | Dieser Wert muss mit dem Fingerabdruck im Signaturzertifikat übereinstimmen oder eine leere Zeichenfolge sein. |
PackageCertificateKeyFile | Pfad | Der Pfad zu dem zu verwendenden Zertifikat. Dieser wird aus den sicheren Dateimetadaten abgerufen. |
PackageCertificatePassword | Kennwort | Das Kennwort für den privaten Schlüssel im Zertifikat. Es wird empfohlen, das Kennwort in Azure Key Vault zu speichern und es mit der Variablengruppe zu verknüpfen. Du kannst die Variable an dieses Argument übergeben. |
Konfigurieren des Builds
Wenn du deine Projektmappe über die Befehlszeile oder mit einem anderen Buildsystem erstellen möchtest, führe MSBuild mit diesen Argumenten aus.
/p:AppxPackageDir="$(Build.ArtifactStagingDirectory)\AppxPackages\\"
/p:UapAppxPackageBuildMode=StoreUpload
/p:AppxBundlePlatforms="$(Build.BuildPlatform)"
/p:AppxBundle=Always
Konfigurieren der Paketsignierung
Die Pipeline muss zum Signieren des MSIX-Pakets (oder APPX-Pakets) das Signaturzertifikat abrufen. Füge dazu vor dem VSBuild-Task einen DownloadSecureFile-Task hinzu.
Damit erhältst du über signingCert
Zugriff auf das Signaturzertifikat.
- task: DownloadSecureFile@1
name: signingCert
displayName: 'Download CA certificate'
inputs:
secureFile: '[Your_Pfx].pfx'
Aktualisiere als nächstes den VSBuild-Task, um auf das Signaturzertifikat zu verweisen:
- 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)"'
Hinweis
Das PackageCertificateThumbprint-Argument wird vorsichtshalber absichtlich auf eine leere Zeichenfolge festgelegt. Wenn der Fingerabdruck im Projekt festgelegt ist, aber nicht mit dem Signaturzertifikat übereinstimmt, tritt der folgende Fehler beim Build auf: Certificate does not match supplied signing thumbprint
.
Überprüfen der Parameter
Die mit der $()
-Syntax definierten Parameter sind Variablen, die in der Builddefinition definiert sind und sich in anderen Buildsystemen unterscheiden.
Unter Vordefinierte Buildvariablen sind alle vordefinierten Variablen aufgeführt.
Konfigurieren des Tasks „Buildartefakte veröffentlichen“
Die UWP-Standardpipeline speichert die generierten Artefakte nicht. Um deiner YAML-Definition die Veröffentlichungsfunktionen hinzuzufügen, füge die folgenden Tasks hinzu.
- 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)'
Du kannst die generierten Artefakte in der Option Artefakte der Seite der Buildergebnisse sehen.
Da wir das UapAppxPackageBuildMode
-Argument auf StoreUpload
festlegen, enthält der Artefaktordner das Paket, das für die Übermittlung an den Store empfohlen wird (.msixupload/.appxupload). Beachte, dass du auch ein normales App-Paket (.msix/.appx) oder ein App-Bündel (.msixbundle/.appxbundle) an den Store übermitteln kannst. Für die Zwecke dieses Artikels verwenden wir die APPXUPLOAD-Datei.
Behandeln von Bündelfehlern
Wenn du deiner Projektmappe mehrere UWP-Projekte hinzufügst und dann versuchst, ein Bündel zu erstellen, erhältst du möglicherweise eine mit der folgenden Fehlermeldung vergleichbare Meldung.
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
Dieser Fehler tritt auf, da auf Projektmappenebene nicht eindeutig ist, welche App im Bündel enthalten sein soll. Um dieses Problem zu beheben, öffne jede Projektdatei und füge am Ende des ersten <PropertyGroup>
-Elements die folgenden Eigenschaften hinzu.
Projekt | Eigenschaften |
---|---|
App | <AppxBundle>Always</AppxBundle> |
UnitTests | <AppxBundle>Never</AppxBundle> |
Entferne dann das MSBuild-Argument AppxBundle
aus dem Buildschritt.