¿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 🙂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_tokenPara 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 $refreshHeaderEstá 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: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" -SkipInitialStatusFetchComo 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!