Compartir a través de


Configura compilaciones automatizadas para tu aplicación UWP

Puedes usar Azure Pipelines para crear compilaciones automatizadas para proyectos de UWP. En este artículo, veremos diferentes maneras de hacerlo. También le mostraremos cómo realizar estas tareas mediante la línea de comandos para que pueda integrarse con cualquier otro sistema de compilación.

Creación de una nueva canalización de Azure

Comience por registrarse en Azure Pipelines si aún no lo ha hecho.

A continuación, cree una canalización que pueda usar para compilar el código fuente. Para ver un tutorial sobre cómo crear una canalización para compilar un repositorio de GitHub, consulte Creación de la primera canalización. Azure Pipelines admite los tipos de repositorio enumerados en este artículo.

Configuración de una compilación automatizada

Comenzaremos con la definición de compilación de UWP predeterminada que está disponible en Azure Dev Ops y, a continuación, le mostraremos cómo configurar la canalización.

En la lista de plantillas de definición de compilación, elija la plantilla Plataforma Universal de Windows.

Selección de la plantilla para UWP

Esta plantilla incluye la configuración básica para compilar el proyecto de 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'

La plantilla predeterminada intenta firmar el paquete con el certificado especificado en el archivo .csproj. Si desea firmar el paquete durante la compilación, debe tener acceso a la clave privada. De lo contrario, puede deshabilitar la firma agregando el parámetro /p:AppxPackageSigningEnabled=false a la msbuildArgs sección del archivo YAML.

Adición del certificado del proyecto a la biblioteca de archivos seguros

Debe evitar enviar certificados al repositorio si es posible y Git los omite de forma predeterminada. Para administrar el control seguro de archivos confidenciales, como certificados, Azure DevOps admite la característica de archivos seguros .

Para cargar un certificado para la compilación automatizada:

  1. En Azure Pipelines, expanda la sección de Pipelines en el panel de navegación y haga clic en Biblioteca.

  2. Haga clic en la pestaña Archivos seguros y, a continuación, haga clic en + Archivo seguro.

    Captura de pantalla de Azure con la opción Biblioteca resaltada en la que se muestra la página Archivos seguros.

  3. Navega hasta el archivo de certificado y haz clic en Aceptar.

  4. Después de cargar el certificado, selecciónelo para ver sus propiedades. En permisos de canalización, habilite la opción Autorizar para su uso en todas las canalizaciones.

    Captura de pantalla de la sección Permisos de canalización con la opción Autorizar para su uso en todas las canalizaciones seleccionada.

  5. Si la clave privada del certificado tiene una contraseña, se recomienda almacenar la contraseña en Azure Key Vault y, a continuación, vincular la contraseña a un grupo de variables. Puede usar la variable para acceder a la contraseña desde la canalización. Tenga en cuenta que una contraseña solo se admite para la clave privada; Actualmente no se admite el uso de un archivo de certificado protegido con contraseña.

Nota:

A partir de Visual Studio 2019, ya no se genera un certificado temporal en proyectos de UWP. Para crear o exportar certificados, use los cmdlets de PowerShell descritos en este artículo.

Configuración de la tarea de compilación de la solución

Esta tarea compila cualquier solución que se encuentra en la carpeta de trabajo en archivos binarios y genera el archivo de paquete de la aplicación de salida. Esta tarea usa argumentos de MSBuild. Tendrá que especificar el valor de esos argumentos. Utilice la siguiente tabla a modo de guía.

Argumento de MSBuild Valor Descripción
AppxPackageDir $(Build.ArtifactStagingDirectory)\AppxPackages Define la carpeta en la que almacenar los artefactos generados.
AppxBundlePlatforms $(Build.BuildPlatform) Te permite definir las plataformas que se incluirán en el lote.
AppxBundle Siempre Crea un archivo .msixbundle o .appxbundle con los archivos .msix o .appx para la plataforma especificada.
UapAppxPackageBuildMode StoreUpload Genera el archivo .msixupload/.appxupload y la carpeta _Test para la carga lateral.
UapAppxPackageBuildMode Cédula de Identidad Genera el archivo .msixupload o .appxupload únicamente.
UapAppxPackageBuildMode SideloadOnly Genera la carpeta _Test solo para la instalación de prueba.
AppxPackageSigningEnabled (Firma de Paquete Appx Habilitada) cierto Habilita la firma del paquete.
HuellaDigitalDelCertificadoDelPaquete Huella digital del certificado Este valor debe coincidir con la huella digital del certificado de firma o ser una cadena vacía.
PackageCertificateKeyFile (ArchivoClaveDeCertificadoDePaquete) Ruta La ruta de acceso al certificado que se utilizará. Esto se recupera de los metadatos de archivos seguros.
ContraseñaDelCertificadoDePaquete Contraseña La contraseña para la clave privada del certificado. Se recomienda que almacenes la contraseña en Azure Key Vault y vincules la contraseña a un grupo de variables. Puedes transferir la variable a este argumento.

Configura la compilación

Si desea compilar la solución mediante la línea de comandos o mediante cualquier otro sistema de compilación, ejecute MSBuild con estos argumentos.

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

Configuración de la firma de paquetes

Para firmar el paquete MSIX (o .appx), la canalización debe recuperar el certificado de firma. Para ello, agrega una tarea DownloadSecureFile antes de la tarea VSBuild. Esto te proporcionará acceso al certificado de firma a través de signingCert.

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

A continuación, actualice la tarea VSBuild para hacer referencia al certificado de 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:

El argumento PackageCertificateThumbprint se establece intencionadamente en una cadena vacía como precaución. Si la huella digital está establecida en el proyecto, pero no coincide con el certificado de firma, se producirá un error en la compilación: Certificate does not match supplied signing thumbprint.

Revisión de parámetros

Los parámetros definidos con la sintaxis $() son variables definidas en la definición de compilación y cambiarán en otros sistemas de compilación.

variables predeterminadas

Para ver todas las variables predefinidas, consulta Variables de compilación predefinidas.

Configura la tarea de publicación de artefactos de compilación

La canalización de UWP predeterminada no guarda los artefactos generados. Para agregar las capacidades de publicación a la definición de YAML, agrega las siguientes tareas.

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

Puede ver los artefactos generados en la opción Artefactos de la página de resultados del build.

artefactos

Dado que hemos establecido el UapAppxPackageBuildMode argumento en StoreUpload, la carpeta de artifacts incluye el paquete para su envío a la Store (.msixupload/.appxupload). Ten en cuenta que también puedes enviar un paquete de aplicación normal (.msix/.appx) o un paquete de aplicaciones (.msixbundle/.appxbundle/) a la Tienda. Para los fines de este artículo, usaremos el archivo .appxupload.

Solucionar errores de agrupación

Si agregas más de un proyecto de UWP a tu solución y, a continuación, intentas crear una agrupación, podrías recibir un error similar al de este.

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

Este error aparece porque en el nivel de solución, no está claro qué aplicación debería aparecer en la agrupación. Para resolver este problema, abra cada archivo de proyecto y agregue las siguientes propiedades al final del primer <PropertyGroup> elemento.

Proyecto Propiedades
Aplicación <AppxBundle>Always</AppxBundle>
UnitTests <AppxBundle>Never</AppxBundle>

A continuación, quite el AppxBundle argumento de MSBuild del paso de compilación.