Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
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:
En Azure Pipelines, expanda la sección de Pipelines en el panel de navegación y haga clic en Biblioteca.
Haga clic en la pestaña Archivos seguros y, a continuación, haga clic en + Archivo seguro.
Navega hasta el archivo de certificado y haz clic en Aceptar.
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.
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.
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.
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.