Aquí puedes leer mi guía completa sobre Dynamics 365 for Finance and Operations y Azure DevOps.

Hace no mucho hablé en otro post sobre la API de movimiento de base de datos de LCS, y en este quiero mostrar como llamar a la API usando PowerShell desde nuestras pipelines de Azure DevOps.

¿Para qué?

Básicamente por automatización. Ahora mismo la API sólo permite el refresco de un entorno de Microsoft Dynamics 365 for Finance and Operations a otro, así que la idea es tener datos frescos de producción en nuestros entornos de UAT a diario. No sé qué nuevas operaciones soportará la API en el futuro pero otra idea sería añadir al pipeline la exportación de la DB (creando un bacpac) de un entorno de UAT para tener datos listos para restarurar en una máquina de desarrollo.

No olvidemos que la API tiene un límite de 3 operaciones de refresco por entorno por 24 horas. No hagáis esto en una build de integración contínua (tampoco tiene mucho sentido). Seguramente la mejor idea es que se ejecute una vez al día con los tests.

Todas estas operaciones/llamadas se pueden hacer también con las d365fo.tools de Mötz Jensen que dan soporte a la API de LCS. Pero si estás usando un agente de Azure en lugar de uno en una VM (como la máquina de build) no se pueden instalar. O por lo menos no he encontrado cómo hacerlo 🙂

EDIT: bueno, gracias al comentario de Mötz con instrucciones para añadir las d365fo.tools a un pipeline de azure he editado el post con cómo hacerlo, sólo id al final para ver cómo tenemos que hacerlo para usar las d365fo.tools en vuestras pipelines!

Llamando a la API

Voy a usar PowerShell para las llamadas a la API desde DevOps. PowerShell tiene un comando llamado Invoke-RestMethod que hace peticiones HTTP/HTTPS. Es muy fácil usarlo y sólo necesitamos hacer lo mismo que en mi anterior post sobre la API.

Obtener el token

$projectId = "1234567"
$tokenUrl = "https://login.microsoftonline.com/common/oauth2/token"
$clientId = "12345678-abcd-432a-0666-22de4c4321aa"
$clientSecret = "superSeCrEt12345678"
$username = "youruser@tenant.com"
$password = "strongerThan123456"

$tokenBody = @{
    grant_type = "password"
    client_id = $clientId
    client_secret = $clientSecret
    resource = "https://lcsapi.lcs.dynamics.com"
    username = $username
    password = $password
}

$tokenResponse = Invoke-RestMethod -Method 'POST' -Uri $tokenUrl -Body $tokenBody
$token = $tokenResponse.access_token

Para obtener el token usaremos este script. Sólo hay que cambiar los valores de las variables por los de tu proyecto, App de AAD, usuario (recuerda que tiene que estar dado de alta en la preview) y contraseña para ejecutarlo. Si todo está bien recibiremos un JSON con la respuesta en $tokenResponse y ahí podremos acceder al valor del token usando notación por puntos.

Solicitar el refresco de DB

$projectId = "1234567"
$sourceEnvironmentId = "fad26410-03cd-4c3e-89b8-85d2bddc4933"
$targetEnvironmentId = "cab68410-cd13-9e48-12a3-32d585aaa548"
$refreshUrl = "https://lcsapi.lcs.dynamics.com/databasemovement/v1/databases/project/$projectId/source/$sourceEnvironmentId/target/$targetEnvironmentId"

$refreshHeader = @{
    Authorization = "Bearer $token"
    "x-ms-version" = '2017-09-15'
    "Content-Type" = "application/json"
}

$refreshResponse = Invoke-RestMethod $refreshUrl -Method 'POST' -Headers $refreshHeader

Está es la llamada para lanzar el refresco. Necesitamos el token que hemos obtenido en el paso anterior para usarlo en la cabecera y los Ids de los entornos de origen y destino.

Si va bien recibiremos una respuesta 200 OK.

Añadirlo a tu pipeline

Añadir esto a un pipeline de Azure DevOps no tiene misterior. Selecciona y edita tu pipeline, yo lo hago en una build nocturna (aunque pone coninuous no lo es…) que se ejecuta después de la actualización de los entornos, y añadre una task de PowerShell:

Selecciona la tarea y cambias el tipo a «Inline»:

Y finalmente pega el script anterior en el campo Script y ¡listo! Tendrás un refresco de datos después de los tests.

También puedes ejecutar esto en tu pipeline de release PERO si lo haces después del paso de despliegue recuerda marcar la opción «Wait for Completion» o ¡la operación fallará al estar el entorno en servicio! E incluso podría fallar si el tiempo de mantenimiento del entorno sobrepasa el del timeout del pipeline. Bueno, mejor… ¡no hagas esto en el pipeline de release!

Y eso es todo, vamos a ver qué nuevas funcionalidades se añaden a la API y qué podemos hacer con ellas.

Actualización: Usar d365fo.tools en tu Pipeline de Azure

Gracias al comentario de Mötz indicando como usar las d365fo.tools en un pipeline he creado una que instalará las herramientas y ejecutará los comandos. Es incluso más fácil que hacerlo con el Invoke-RestMethod.

Pero antes…

Aseguraros que en vuestra App de Azure Active Directory habéis seleccionado «Treat application as a public client» en el apartado de autenticación:

La tarea

Primero necesitamos instalar las d365fo.tools y después podemos usar los comandos para llamar a la API de LCS:

Install-PackageProvider nuget -Scope CurrentUser -Force -Confirm:$false

Install-Module -Name AZ -AllowClobber -Scope CurrentUser -Force -Confirm:$False -SkipPublisherCheck

Install-Module -Name d365fo.tools -AllowClobber -Scope CurrentUser -Force -Confirm:$false

Get-D365LcsApiToken -ClientId "{YOUR_APP_ID}" -Username "{USERNAME}" -Password "{PASSWORD}" -LcsApiUri "https://lcsapi.lcs.dynamics.com" -Verbose | Set-D365LcsApiConfig -ProjectId 1234567

Invoke-D365LcsDatabaseRefresh -SourceEnvironmentId "958ae597-f089-4811-abbd-c1190917eaae" -TargetEnvironmentId "13cc7700-c13b-4ea3-81cd-2d26fa72ec5e" -SkipInitialStatusFetch

Como podéis ver es un poco más fácil hacer el refresh usando las d365fo.tools. Obtenemos el token y lo que devuelve la operación lo pasamos al comando Set-D365LcsApiConfig que guardará el token (y otras cosas). Esto ayuda a no tener que andar poniendo varias veces el AppId, usuario, etc. Y ya véis lo fácil que es invocar el refresco de DB, sólo necesitamos el environment Id del entorno de origen y destino. Y listo!

¡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.

Write A Comment

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

ariste.info