Impostare compilazioni automatizzate per un'app UWP

È possibile usare Azure Pipelines per creare build automatiche per i progetti UWP. In questo articolo, verranno analizzati alcuni metodi per raggiungere questo scopo. Mostreremo anche come eseguire queste attività usando la riga di comando, in modo da poter integrare la soluzione con qualsiasi altro sistema di compilazione.

Creare una nuova pipeline di Azure

Per iniziare, iscriviti ad Azure Pipelines se non lo hai ancora fatto.

Crea quindi una pipeline per poter compilare il tuo codice sorgente. Per un'esercitazione sulla creazione di una pipeline per creare un repository GitHub, vedi Creare la prima pipeline. Azure Pipelines supporta i tipi di repository elencati in questo articolo.

Configurare una build automatizzata

Iniziamo con la definizione di build di piattaforma UWP (Universal Windows Platform) predefinita disponibile in Azure Dev Ops, quindi vedremo come configurare la pipeline.

Nell'elenco di modelli di definizione di build, scegliere il modello Universal Windows Platform.

Seleziona il modello UWP

Questo modello include la configurazione di base per creare il progetto 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'

Il modello predefinito tenta di firmare il pacchetto con il certificato specificato nel file con estensione .csproj. Se desideri firmare il pacchetto durante la compilazione, devi avere accesso alla chiave privata. In caso contrario, puoi disabilitare la firma aggiungendo il parametro /p:AppxPackageSigningEnabled=false alla sezione msbuildArgs nel file YAML.

Aggiungere il certificato del progetto alla libreria File protetti

È consigliabile evitare di inviare certificati al repository, se possibile. Git li ignora per impostazione predefinita. Per la gestione sicura dei file riservati, ad esempio i certificati, Azure DevOps supporta la funzionalità File protetti.

Per caricare un certificato per la build automatizzata:

  1. In Azure Pipelines espandi Pipeline nel riquadro di spostamento e fai clic su Libreria.

  2. Fai clic sulla scheda File protetti e quindi su + File protetto.

    Screenshot di Azure con l'opzione Libreria evidenziata che mostra la pagina File protetti.

  3. Seleziona il file di certificato e fai clic su OK.

  4. Dopo aver caricato il certificato, selezionalo per visualizzarne le proprietà. In Autorizzazioni pipeline abilita l'interruttore Autorizza per l'uso in tutte le pipeline.

    Screenshot della sezione Autorizzazioni pipeline con l'opzione Autorizza per l'uso in tutte le pipeline selezionata.

  5. Se la chiave privata del certificato ha una password, consigliamo di archiviare tale password in Azure Key Vault e quindi collegarla a un gruppo di variabili. Puoi usare la variabile per accedere alla password dalla pipeline. Si noti che una password è supportata solo per la chiave privata. L'uso di un file di certificato protetto da password non è attualmente supportato.

Nota

A partire da Visual Studio 2019, nei progetti UWP non viene più generato un certificato temporaneo. Per creare o esportare certificati, usa i cmdlet di PowerShell descritti in questo articolo.

Configurare il task di compilazione della soluzione della build

Questa attività compila qualsiasi soluzione che si trova nella cartella di lavoro per i file binari e produce il file di pacchetto dell'app di output. Questa attività usa argomenti di MSBuild. Sarà necessario specificare il valore di tali argomenti. Utilizzare la tabella seguente come riferimento.

Argomento di MSBuild Valore Descrizione
AppxPackageDir $(Build.ArtifactStagingDirectory)\AppxPackages Definisce la cartella in cui archiviare gli artefatti generati.
AppxBundlePlatforms $(Build.BuildPlatform) Ti consente di definire le piattaforme da includere nel bundle.
AppxBundle Sempre Crea un file con estensione msixbundle o appxbundle con i file con estensione msix o appx per la piattaforma specificata.
UapAppxPackageBuildMode StoreUpload Genera il file con estensione msixupload o appxupload e la cartella _Test per il trasferimento locale.
UapAppxPackageBuildMode CI Genera solo il file con estensione msixupload o appxupload.
UapAppxPackageBuildMode SideloadOnly Genera solo la cartella _Test per il trasferimento locale.
AppxPackageSigningEnabled vero Abilita la firma del pacchetto.
PackageCertificateThumbprint Identificazione personale del certificato Questo valore deve corrispondere all'identificazione personale nel certificato di firma oppure la stringa deve essere vuota.
PackageCertificateKeyFile Path Percorso del certificato da usare. Viene recuperato dai metadati del file protetto.
PackageCertificatePassword Password Password per la chiave privata del certificato. Consigliamo di archiviare la password in Azure Key Vault e collegarla a un gruppo di variabili. Puoi passare la variabile a questo argomento.

Configurare la build

Se vuoi compilare la soluzione usando la riga di comando o un altro sistema di compilazione, esegui MSBuild con questi argomenti.

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

Configurare la firma del pacchetto

Per firmare il pacchetto MSIX (o .appx), la pipeline deve recuperare il certificato di firma. A tale scopo, aggiungi un'attività DownloadSecureFile prima dell'attività VSBuild. In questo modo, potrai accedere al certificato di firma tramite signingCert.

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

Aggiorna quindi l'attività VSBuild in modo da fare riferimento al certificato di firma:

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

Nota

Come precauzione, l'argomento PackageCertificateThumbprint viene intenzionalmente lasciato vuoto. Se l'identificazione personale è impostata nel progetto ma non corrisponde al certificato di firma, la build non verrà eseguita e verrà visualizzato l'errore: Certificate does not match supplied signing thumbprint.

Verificare i parametri

I parametri definiti con la sintassi $() sono variabili specificate nella definizione della build e saranno diversi in altri sistemi di compilazione.

variabili predefinite

Per visualizzare tutte le variabili predefinite, vedi Variabili di compilazione predefinite.

Configurare l'attività Pubblica artefatti di compilazione

La pipeline UWP predefinita non salva gli artefatti generati. Per aggiungere le funzionalità di pubblicazione alla definizione YAML, aggiungi le attività seguenti.

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

Puoi visualizzare gli artefatti generati nell'opzione Artefatti della pagina relativa ai risultati della compilazione.

artifacts

Poiché abbiamo impostato l'UapAppxPackageBuildModeargomento su StoreUpload, la cartella degli artefatti include il pacchetto per l'invio allo Store (.msixupload/.appxupload). Nota che è anche possibile inviare allo Store un pacchetto di app normale (.msix/.appx) o un bundle di app (.msixbundle/.appxbundle/). Ai fini di questo articolo, verrà usato il file con estensione .appxupload.

Errori del bundle di indirizzi

Se aggiungi più di un progetto UWP alla tua soluzione e quindi provi a creare un bundle, potresti ricevere un errore come questo:

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

Questo errore viene visualizzato perché a livello di soluzione non è chiaro quale app deve essere visualizzata nel bundle. Per risolvere questo problema, apri ogni file di progetto e aggiungi le proprietà seguenti alla fine del primo elemento <PropertyGroup>.

Progetto Proprietà
App <AppxBundle>Always</AppxBundle>
UnitTests <AppxBundle>Never</AppxBundle>

Rimuovi quindi l'argomento di MSBuild AppxBundle dal passaggio di compilazione.