Compartir a través de


Configurar compilaciones automatizadas para la aplicación para UWP

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

Creación de una nueva canalización de Azure

Comienza por registrarte en Azure Pipelines si todavía no lo has hecho.

Posteriormente, crea una canalización que puedas usar para compilar el código fuente. Para ver un tutorial sobre la creación de una canalización para compilar un repositorio de GitHub, consulta Crea tu primera canalización. Azure Pipelines admite los tipos de repositorios que aparecen en este artículo.

Configurar una compilación automatizada

Comenzaremos con la definición de compilación predeterminada de UWP, 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, elige la plantilla Plataforma universal de Windows.

Seleccionar la plantilla de 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 quieres firmar el paquete durante la compilación, debes tener acceso a la clave privada. De lo contrario, puedes agregar el parámetro /p:AppxPackageSigningEnabled=false a la sección msbuildArgs del archivo YAML para deshabilitar la firma.

Agregar el certificado de proyecto a la biblioteca de archivos seguros

Si es posible, debes evitar el envío de certificados al repositorio, ya que Git los ignorará de forma predeterminada. Para administrar el control seguro de archivos confidenciales como los certificados, Azure DevOps admite la característica de archivos seguros.

Para cargar un certificado para la compilación automatizada:

  1. En Azure Pipelines, expande Canalizaciones en el panel de navegación y haz clic en Biblioteca.

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

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

  3. Busca el archivo de certificado y haz clic en Aceptar.

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

    Captura de pantalla de la sección Permisos de canalizaciones 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 que almacenes la contraseña en Azure Key Vault y, posteriormente, vincules la contraseña a un grupo de variables. Puedes usar las variables para acceder a la contraseña desde la canalización. Ten 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 por contraseña.

Nota

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

Configurar la tarea de compilación de compilación de soluciones

Esta tarea compila cualquier solución que se encuentre en la carpeta de trabajo en archivos binarios y produce el archivo del paquete de la aplicación. Esta tarea utiliza argumentos de MSBuild. Tendrá que especificar el valor de los argumentos. Usa la siguiente tabla como 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 o .appxupload y la carpeta _Test para la instalación de prueba.
UapAppxPackageBuildMode CI Genera el archivo .msixupload o .appxupload únicamente.
UapAppxPackageBuildMode SideloadOnly Genera la carpeta _Test solo para la instalación de prueba.
AppxPackageSigningEnabled true Habilita la firma del paquete.
PackageCertificateThumbprint Huella digital del certificado Este valor debe coincidir con la huella digital del certificado de firma o ser una cadena vacía.
PackageCertificateKeyFile Ruta La ruta de acceso al certificado que se utilizará. Se recupera de los metadatos del archivo seguro.
PackageCertificatePassword 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.

Configurar la compilación

Si quieres compilar tu solución usando la línea de comandos o cualquier otro sistema de compilación, ejecuta 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 un 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, actualiza la tarea de MSBuild 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.

Configuración de la tarea para publicar 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)'

Puedes ver los artefactos generados en la opción Artefactos de la página de resultados de la compilación.

artefactos

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

Errores de agrupación de direcciones

Si agregas más de un proyecto de UWP a tu solución y, después, vuelves a intentar crear una agrupación, es posible que recibas un error como el siguiente.

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 la solución, no está claro qué aplicación debería aparecer en el lote. Para resolver este problema, abre cada archivo de proyecto y agrega las siguientes propiedades al final del primer elemento <PropertyGroup>.

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

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