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.
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:
In Azure Pipelines espandi Pipeline nel riquadro di spostamento e fai clic su Libreria.
Fai clic sulla scheda File protetti e quindi su + File protetto.
Seleziona il file di certificato e fai clic su OK.
Dopo aver caricato il certificato, selezionalo per visualizzarne le proprietà. In Autorizzazioni pipeline abilita l'interruttore Autorizza per l'uso in tutte le pipeline.
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.
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.
Poiché abbiamo impostato l'UapAppxPackageBuildMode
argomento 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.