Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sie können Azure Pipelines verwenden, um automatisierte Builds für UWP-Projekte zu erstellen. In diesem Artikel befassen wir uns mit verschiedenen Möglichkeiten, dies zu tun. Außerdem zeigen wir Ihnen, wie Sie diese Aufgaben mithilfe der Befehlszeile ausführen, damit Sie in jedes andere Buildsystem integriert werden können.
Erstellen einer neuen Azure-Pipeline
Beginnen Sie mit der Anmeldung für die Azure Pipelines, wenn Sie dies noch nicht getan haben.
Erstellen Sie als Nächstes eine Pipeline, die Sie zum Erstellen ihres Quellcodes verwenden können. Weitere Informationen über den Aufbau einer Pipeline zum Erstellen eines GitHub-Repositorys finden Sie im Tutorial unter Erstellen Ihrer 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 Ihnen dann, wie Sie die Pipeline konfigurieren.
Wählen Sie in der Liste der Builddefinitionsvorlagen die Vorlage Universelle Windows-Plattform aus.
Diese Vorlage enthält die grundlegende Konfiguration zum Erstellen Ihres 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 in der CSPROJ-Datei angegebenen Zertifikat zu signieren. Wenn Sie ihr Paket während des Builds signieren möchten, müssen Sie Zugriff auf den privaten Schlüssel haben. Andernfalls können Sie die Signierung deaktivieren, indem Sie den Parameter /p:AppxPackageSigningEnabled=false
zum msbuildArgs
Abschnitt in der YAML-Datei hinzufügen.
Hinzufügen ihres Projektzertifikats zur Bibliothek für sichere Dateien
Sie sollten die Übermittlung von Zertifikaten an Ihr Repository vermeiden, wenn möglich, und Git ignoriert sie standardmäßig. Um die sichere Behandlung vertraulicher Dateien wie Zertifikate zu verwalten, unterstützt Azure DevOps die sicheren Dateien Feature.
So laden Sie ein Zertifikat für Ihren automatisierten Build hoch:
Erweitern Sie in Azure Pipelines Pipelines im Navigationsbereich, und klicken Sie auf Bibliothek.
Klicken Sie auf die Registerkarte " Sichere Dateien ", und klicken Sie dann auf "+Datei sichern".
Navigieren Sie zur Zertifikatdatei, und klicken Sie auf "OK".
Nachdem Sie das Zertifikat hochgeladen haben, wählen Sie es aus, um dessen Eigenschaften anzuzeigen. Aktivieren Sie unter Pipelineberechtigungenden Umschalter Autorisieren für die Verwendung in allen Pipelines.
Wenn der private Schlüssel im Zertifikat über ein Kennwort verfügt, empfehlen wir, Ihr Kennwort in Azure Key Vault zu speichern und dann das Kennwort mit einer Variablengruppe zu verknüpfen. Sie können die Variable verwenden, um über die Pipeline auf das Kennwort zuzugreifen. Beachten Sie, dass ein Kennwort nur für den privaten Schlüssel unterstützt wird. Die Verwendung einer Zertifikatdatei, 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. Zum Erstellen oder Exportieren von Zertifikaten verwenden Sie die PowerShell-Cmdlets, die in diesem Artikelbeschrieben sind.
Konfigurieren der Build-Aufgabe "Lösung erstellen"
Diese Aufgabe kompiliert alle Lösungen, die sich im Arbeitsordner befinden, in Binärdateien und erzeugt die Ausgabe-App-Paketdatei. Diese Aufgabe verwendet MSBuild-Argumente. Sie müssen den Wert dieser Argumente angeben. Verwenden Sie die folgende Tabelle als Anleitung.
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, das die .msix/.appx-Dateien für die angegebene Plattform enthält. |
UapAppxPackageBuildMode | StoreUpload | Generiert die DATEI ".msixupload/.appxupload" und den ordner "_Test " zum Querladen. |
UapAppxPackageBuildMode | Corporate Identity | Generiert nur die .msixupload-/.appxupload-Datei. |
UapAppxPackageBuildMode | QuerladenOnly | Generiert den _Test Ordner nur für das Querladen. |
AppxPackageSigningEnabled | Wahr | Aktiviert das Signieren von Paketen. |
Paketzertifikat-Fingerabdruck | Zertifikat Daumenabdruck | Dieser Wert muss mit dem Fingerabdruck im Signaturzertifikat übereinstimmen oder eine leere Zeichenfolge sein. |
DateiMitZertifikatsschlüsselFürPaket | Pfad | Der Pfad zu dem zu verwendenden Zertifikat. Dieser wird aus den sicheren Dateimetadaten abgerufen. |
Paketzertifikat-Passwort | Passwort | Das Kennwort für den privaten Schlüssel im Zertifikat. Es wird empfohlen, Ihr Kennwort in Azure Key Vault zu speichern und das Kennwort mit variablen Gruppen zu verknüpfen. Du kannst die Variable an dieses Argument übergeben. |
Konfigurieren des Builds
Wenn Sie Ihre Lösung mithilfe der Befehlszeile oder eines anderen Buildsystems erstellen möchten, führen Sie MSBuild mit diesen Argumenten aus.
/p:AppxPackageDir="$(Build.ArtifactStagingDirectory)\AppxPackages\\"
/p:UapAppxPackageBuildMode=StoreUpload
/p:AppxBundlePlatforms="$(Build.BuildPlatform)"
/p:AppxBundle=Always
Konfigurieren der Paketsignierung
Um das MSIX-Paket (oder .appx) zu signieren, muss die Pipeline das Signaturzertifikat abrufen. Füge dazu vor dem VSBuild-Task einen DownloadSecureFile-Task hinzu.
Dadurch erhalten Sie Zugriff auf das Signaturzertifikat über signingCert
.
- task: DownloadSecureFile@1
name: signingCert
displayName: 'Download CA certificate'
inputs:
secureFile: '[Your_Pfx].pfx'
Aktualisieren Sie als Nächstes die VSBuild-Aufgabe, 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 Argument PackageCertificateThumbprint wird absichtlich auf eine leere Zeichenfolge als Vorsichtsmaßnahme 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
.
Parameter überprüfen
Die mit der $()
-Syntax definierten Parameter sind Variablen, die in der Builddefinition definiert sind und sich in anderen Buildsystemen unterscheiden.
Informationen zum Anzeigen aller vordefinierten Variablen finden Sie unter Vordefinierte Buildvariablen.
Konfigurieren der Aufgabe "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)'
Sie können die generierten Artefakte in der Artefaktoption der Seite mit den Buildergebnissen sehen.
Da wir das Argument UapAppxPackageBuildMode
auf StoreUpload
festgelegt haben, enthält der Artifact-Ordner das Paket für die Einreichung im Store (.msixupload/.appxupload). Beachten Sie, dass Sie auch ein reguläres App-Paket (MSIX/.appx) oder ein App-Bündel (.msixbundle/.appxbundle/) an den Store übermitteln können. Für die Zwecke dieses Artikels verwenden wir die APPXUPLOAD-Datei.
Beheben von Paketfehlern
Wenn Sie Ihrer Lösung mehrere UWP-Projekte hinzufügen und dann versuchen, ein Bündel zu erstellen, wird möglicherweise ein Fehler wie dieser angezeigt.
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 wird angezeigt, da auf Lösungsebene nicht klar ist, welche App im Bundle angezeigt werden soll. Um dieses Problem zu beheben, öffnen Sie jede Projektdatei, und fügen Sie am Ende des ersten <PropertyGroup>
Elements die folgenden Eigenschaften hinzu.
Projekt | Eigenschaften |
---|---|
Anwendung | <AppxBundle>Always</AppxBundle> |
UnitTests | <AppxBundle>Never</AppxBundle> |
Entfernen Sie dann das AppxBundle
MSBuild-Argument aus dem Buildschritt.