¡Contemplad #XppGroupies! ¡El día que tanto hemos estado esperando ha llegado! Las Azure hosted builds (me cuesta mucho decir Build hospedada en Azure) ya están en preview pública con el PU35!! Ya podemos dejar de preguntarle a Joris cuando estará disponible, porque ya lo está!! Leed los Docs!!

He podido escribir esto porque he podido probarlo durante la preview privada durante unos meses. Y por supuesto gracias a Joris por haberme invitado a la preview!

Azure hosted builds
Cabalgando los Azure Pipelines por Caza Pelusas

¿Qué significa esto? No necesitamos ya la VM para ejecutar pipelines! Es broma, sí la necesitamos! Si estámos ejecutando tests o sincronizando la DB como parte de nuestro pipeline todavía necesitamos la VM. Pero podemos mover las builds de CI al agente de Azure.

También puedes leer mi guía sobre MSDyn365FO y Azure DevOps ALM.

Recordar que esto esta en preview privada. Si queréis uniros a la preview primero necesitáis ser parte del Insider Program donde podéis uniros al «Dynamics 365 for Finance and Operations Insider Community«. Una vez invitados deberías ver un nuevo proyecto en LCS llamado PEAP Assets, y dentro de la Asset Library en la sección Nuget package encontraréis los nugets.

Agentes de Azure

Con la Azure hosted build obtenemos la capacidad de ejecutar un agente extra y podemos ejecutar múltiples pipelines a la vez. Pero todavía no serán pipelines paralelas porque sólo tenemos un agente sin VM. Esto quiere decir que podemos ejecutar una build con el agente hospedado y otra con el de Azure, pero no podemos ejecutar dos del mismo tipo a la vez. Si queremos eso necesitamos comprar agentes extra.

Con un proyecto privado de Azure DevOps obtenemos 2GB de espacio para Artefactos (los veremos luego) y un agente de Azure con 1800 minutos gratuitos:

08CEA665 618A 4F15 B9EC F86A405FA7D8
Azure hosted build: precio de proyectos de Azure DevOps

Seguiremos manteniendo la VM de build, así que es difícil decirle a un cliente que necesitamos pagar más sin poder deshacernos de su coste. Además que hemos estado haciendo todo con un solo agente y ha ido todo bien, no? Así que nos tomamos esto como capacidad extra, podemos dividir las builds entre ambos agentes y dejar el agente de Azure para builds más cortas para aprovechar los 1800 minutos gratuitos lo máximo posible.

¿Cómo funciona?

No es nada mágico. Nos movemos de un agente que se ejecuta en la VM a uno que se ejecuta en Azure.

Las Azure hosted builds se apoyan en paquetes nuget para compilar nuestro código X++. El contenido de PackagesLocalDirectory, la platforma y el compilador han sido empaquetados en nugets y lo que solemos tener en la VM ahora está en 3 nugets.

Cuando la build se ejecuta, se descarga e instalan los nugets y los usan para compilar nuestro código en la Azure hosted build junto con los paquetes estándar.

¿Qué necesito?

Para configurar la Azure hosted build necesitamos:

  • Los 3 nugets de LCS: compilador, X++ de plataforma y X++ de Aplicación.
  • Un usuario con derechos suficientes a nivel de organización para subir los nugets a Azure DevOps.
  • Algo de paciencia para poner todo en marcha 🙂

Así que el primer paso es ir a LCS, al proyecto de PEAP, Asset Library y descargar los 3 paquetes nuget:

Nugets for the Azure Hosted Build
Nugets para las Azure Hosted Build

Artefactos de Azure DevOps

Esto se puede hacer tanto desde tu PC como desde una VM de desarrollo, pero necesitaremos añadir algunos archivos y un proyecto de VS a tu source control así que necesitaras una máquina de desarrollo seguro.

Ve a tu proyecto de Azure DevOps y ve a la sección de Artifacts. Aquí crearemos un nuevo feed y le daremos un nombre:

Azure DevOps artifact feed
Azure DevOps artifact feed

Con el proyecto gratis tenemos 2GB de espacio, el tamaño de los 3 nugets es de sobre 500MB, no deberías tener problemas a no ser que tengas más artefactos de otra cosa, .NET por ej.

Ahora pulsa «Connect to feed» y selecciona nuget.exe. Ahí verás las instrucciones para continuar ahí, pero lo explicaré igualmente.

Necesitamos descargar el nuget.exe y ponerlo en el PATH de Windows. También puedes dejarlo donde estén los nugets y olvidarte del PATH. Tú mismo. Finalmente instala el credential provider: descarga este script de Powershell y ejecútalo.

Crea un archivo nuevo llamado nuget.config en la misma carpeta donde hayas descargado los nugets. Tiene que tener el contenido que viene en la página «Connect to feed», algo así:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <clear />
    <add key="AASBuild" value="https://pkgs.dev.azure.com/aariste/aariste365FO/_packaging/AASBuild/nuget/v3/index.json" />
  </packageSources>
</configuration>

El contenido del archivo tiene que ser el mismo que venga en la página «Connect to feed».

Y para acabar, publicaremos los nugets en nuestro feed de artefactos. Tenemos que hacer esto para los 3 nugets:

nuget.exe push -Source "AASBuild" -ApiKey az <packagePath>

Os pedirá usuario y contraseña. Recordad que tiene que tener permisos suficientes.

Por supuesto, tienes que cambiar «AASBuild» por el nombre de tu feed. Y ya hemos acabado con los artefactos.

Prepara Azure DevOps

El nuevo agente necesita una solución para compilar tus paquetes. Esto quiere decir que hay que crear una solución vacía en Visual Studio y poner nuestro paquete como el que usa el proyecto. Tal que así:

2020 04 24 14 20 58
Solución Visual Studio

Si tienes más de un paquete o modelo, necesitarás crear un proyecto para cada uno dentro de la solución.

Tenemos que crear otro archivo llamado packages.config con el siguiente contenido:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.Dynamics.AX.Platform.DevALM.BuildXpp" version="7.0.5644.16778" targetFramework="net40" />
  <package id="Microsoft.Dynamics.AX.Application.DevALM.BuildXpp" version="10.0.464.13" targetFramework="net40" />
  <package id="Microsoft.Dynamics.AX.Platform.CompilerPackage" version="7.0.5644.16778" targetFramework="net40" />
</packages>

El tag de versión dependerá de cuando leas esto, pero el de arriba es el correcto para el PU35. Tendremos que actualizar este archivo cuando salgan versiones nuevas de los nugets.

Si estás configurando la pipeline para la versión 10.0.18 o superior, lee esto.

Y para terminar esta parte necesitamos añadir la solución, el nuget.config y el packages.config a nuestro source control. Esto es lo que he hecho yo:

2020 04 24 14 29 01
Azure DevOps

Podéis ver que he creado una carpeta Build en la raíz de mi proyecto de DevOps. Eso sólo es una preferencia mía, pero prefiero tener sólo código en mis ramas, incluso los proyectos están fuera de la rama, sólo código para branchear y mergear. Ponemos los archivo sy la solución dentro (o dónde quieras) y listo.

Configurar pipeline

Ahora tenemos que crear un pipeline nuevo, podemos simplemente importar este template del recién creado proyecto X++ (Dynamics 365) Samples and Tools de Github. Despues de importarlo lo modificaremos un poco, pero inicialmente será así:

2020 04 24 14 35 07 1
Azure hosted build: pipeline recién importada

Como podéis ver el pipeline tiene todos los pasos necesarios para generar el DP, pero algunos de ellos, los relacionados con las tasks de Dynamics 365, no cargan bien después de importar. Tenéis que añadir esos pasos a mano una vez importado el pipeline y configurarlos a mano.

Pipeline root

2020 04 24 14 38 27

Tienes que seleccionar para el Agent Pool: Hosted Azure Pipelines, y vs2017-win2016 como Agent Specification.

Get sources

DevOps mappings
Azure hosted build: Our mappings

He mapeado dos cosas aquí: nuestro código en el primer mapeo y la carpeta Build que hemos creado antes con la solución y los archivos config. Si has puesto estos archivos en tu carpeta Metadata no necesitas el segundo mapping.

NuGet install Packages

Este paso obtiene los nugets y los instala para su uso en cada ejecución. He tenido problemas con esta task.

2020 04 25 12 41 47 2
Azure hosted build: nuget install

El comando usa los archivos config que hemos puesto en la carpeta Build y, como podéis ver, está obteniendo los archivos de $(build.sourcesDirectory)\Build como hemos configurado en el paso Get sources. Si habéis puesto esos archivos en otro sitio tenéis que cambiar el path para que se ajuste a vuestra configuración.

Update Model Version

Este es uno de los pasos que muestran errores pese a que tengo instaladas las herramientas de Dynamics 365 del marketplace en el proyecto de DevOps. Si lo tienes bien seguramente no tienes que tocar nada. Si tienes el problema simplemente añade la tarea «Update Model Version» y cámbialo par que quede así:

Update Model Version
Azure hosted build: Update Model Version

Create Deployable Package

Este es otro de los pasos que no me cargaron bien. De nuevo, añádelo y cambia lo que necesites:

2020 04 24 14 55 32
Azure hosted build: Create Deployable Package

Add Licenses to Deployable Package

Otro paso que me daba problemas. Hacemos lo mismo.

2020 04 24 14 57 35
Azure hosted build: Add Licenses to Deployable Package

Y eso es todo. Puedes ejecutar las Azure hosted builds para probar si funciona. Para las primeras ejecuciones puedes deshabilitar los pasos posteriores a «Build solution» para ver si los nugets se descargan y instalan bien y se compila tu código. Una vez esté eso podemos seguir con la generación y publicación de DPs.

Ya has configurado tu Azure hosted build, ahora te toca a ti decidir en qué casos usarlas el viejo agente o el hospedado en Azure.

Actualización para la versión 10.0.18

A partir de la versión 10.0.19 vamos a tener 4 paquetes NuGet en vez de 3 porque el tamaño del paquete Microsoft.Dynamics.AX.Application.DevALM.BuildXpp se acerca o supera ya el tamaño máximo, que son 500MB, y vendrá separado en 2 paquetes distintos.

Puedes leer sobre esto en los docs.

Hay sólo 2 pequeños cambios que tendremos que hacer a nuestra pipeline si ya la estamos usando, uno al archivo packages.config y otro a la pipeline.

packages.config

El fichero packages.config tendrá una línea adicional con el NuGet del modelo Application Suite.

<?xml version="1.0" encoding="utf-8"?>
<packages>
    <package id="Microsoft.Dynamics.AX.Platform.DevALM.BuildXpp" version="7.0.5968.16973" targetFramework="net40" />
    <package id="Microsoft.Dynamics.AX.Application.DevALM.BuildXpp" version="10.0.793.16" targetFramework="net40" />
    <package id="Microsoft.Dynamics.AX.ApplicationSuite.DevALM.BuildXpp" version="10.0.793.16" targetFramework="net40" />
    <package id="Microsoft.Dynamics.AX.Platform.CompilerPackage" version="7.0.5968.16973" targetFramework="net40" />
</packages>

Pipeline

Tendremos que añadir una variable nueva llamada AppSuitePackage a nuestra pipeline, con el valor Microsoft.Dynamics.AX.ApplicationSuite.DevALM.BuildXpp.

New Azure DevOps pipeline variable
New Azure DevOps pipeline variable

Y después usarlo en el paso de compilar para que quede así:

/p:BuildTasksDirectory="$(NugetsPath)\$(ToolsPackage)\DevAlm" /p:MetadataDirectory="$(MetadataPath)" /p:FrameworkDirectory="$(NuGetsPath)\$(ToolsPackage)" /p:ReferenceFolder="$(NuGetsPath)\$(PlatPackage)\ref\net40;$(NuGetsPath)\$(AppPackage)\ref\net40;$(MetadataPath);$(Build.BinariesDirectory);$(NuGetsPath)\$(AppSuitePackage)\ref\net40" /p:ReferencePath="$(NuGetsPath)\$(ToolsPackage)" /p:OutputDirectory="$(Build.BinariesDirectory)"

¡Suscríbete!

Recibe un correo cuando se publique un nuevo post
Author

Microsoft Dynamics 365 Finance & Operations technical architect and developer. Business Applications MVP since 2020.

5 Comments

  1. Pingback: Añade y compila proyectos .NET a tu pipeline de Dynamics 365 - ariste.info

  2. Pingback: Desaparecen las máquinas Tier 1 gestionadas por Microsoft - ariste.info

  3. Hola!

    Que tipo de permisos debe tener el usuario que hace el push de los nugets? Yo soy Project Administrator y no me deja continuar, no me da error, sin embargo me sigue solicitando usuario y password.

    Gracias

    • Adrià Ariste Santacreu Reply

      Hola,

      lo mejor es que sea administrador de la organización (no sólo del proyecto) para poder subir los nugets.

  4. Pingback: Planificación de modelos y paquetes - ariste.info

Write A Comment

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

ariste.info