Agregando uno de los primeros pasos a nuestro ciclo de desarrollo y despliegue

Quienes han dedicado un rato a ver mi serie sobre automatización en el despliegue de aplicaciones con Azure habrán notado que había varios pasos manuales a la hora de preparar los entornos en los que íbamos a desarrollar y luego desplegar nuestras aplicaciones.

Pero, ¿nos hemos preguntado que pasa cuando hemos llegado a cierta madurez y nos encontramos con un escenario en que?: siempre creamos nuestros Websites en la misma zona geográfica de Azure, el mismo plan de precios, y… que la organización ya definió cuantos slots (ranuras) de despliegue son requeridos para el ciclo de desarrollo antes de que algo pase a producción.

En ese sentido Azure nos ofrece los Azure Resource Manager templates, que nos permiten definir y usar plantillas para automatizar la creación de recursos y entornos completos dentro de Azure, y ojo esto no esta limitado unicamente a Web Apps, sino también a entornos que involucren VM, Docker, Logic App, etc, en suma algo muy potente si queremos simplificar tareas repetitivas.

Este mecanismo llamo mi atención luego de que la genial GiS (a quien pude conocer de pasada en mi época en España) publicara este interesante articulo sobre como crear las citadas plantillas desde Visual Studio y es a ese articulo a donde deben remitirse para entender con detalle las partes de un proyecto de este tipo, luego de lo cual podemos regresar aquí.

¿Ok? En nuestro caso vamos a definir un proyecto de plantilla de tipo Web App (a diferencia de GiS que eligió la Blank Template para explicar con mas detalle la estructura base), así:

RM1En este caso notaremos que a diferencia del ejemplo genérico, lo que obtendremos serán archivos de nombre WebSite.json y WebSite.param.dev.json, los cuales se corresponden con los DeploymentTemplate.json y DeploymentTemplate.param.dev.json que con tanto detalle se describieron en el articulo de GiS.

RM2Ahora lo que haremos sera configurar los diversos archivos a fin de lograr una plantila que automáticamente nos permita:

  • Crear un Web App que incluya dos slots por defecto: “QA” y “Staging
  • Localizar esta Web App (y sus slots) en una zona geografica determinada, en mi caso: “East US
  • Usar siempre un mismo Grupo de Recursos (ya previamente creado en nuestro Portal de Azure, o creado la primera vez que invoquemos la plantilla), en mi caso: “Default-Web-EastUS

Definidos los objetivos pasamos a modificar WebSite.json en la sección correspondiente a “sku” (que define los planes de pago que se asignaran a la Web App a crear):

RM3Originalmente esta sección incluía otros valores como Free y Shared, pero debemos retirar dichas opciones de nuestra plantilla puesto que la creación de slots solo esta disponible en los planes Standard y Premium, y como salvo excepciones no vamos a usar el modo Premium dejaremos con valor por defecto el Standard,

Ahora modificaremos el WebSite.param.dev.json , quedándonos algo como esto:

RM4Nótese que he resaltado el valor correspondiente al nombre del site (en este caso demoRG11) puesto que sera este valor el que iremos cambiando cada vez que queramos efectuar la creación de un nuevo Web App.

Ahora pasemos a la parte mas delicada de este proceso, pues deberemos modificar el Powershell (Deploy-AzureResourceGroup.ps1) que nos genero Visual Studio, a fin de que obtenga el nombre del website que definamos en WebSite.param.dev.json y lo utilice como base para la creación de los slot hijos.

Lo primero que debemos hacer es recuperar el valor correspondiente y asignarlo a una variable dentro del PowerShell, lo cual haremos mediante esta porcion de codigo:

#Custom Section $MyWebSiteName
$MyWebSiteName = "vacio"
    $JsonContent2 = Get-Content $TemplateParametersFile -Raw | ConvertFrom-Json
    $JsonParameters2 = $JsonContent2 | Get-Member -Type NoteProperty | Where-Object {$_.Name -eq "parameters"}

    if ($JsonParameters2 -eq $null)
    {
        $JsonParameters2 = $JsonContent
    }
    else
    {
        $JsonParameters2 = $JsonContent2.parameters
    }

    $JsonParameters2 | Get-Member -Type NoteProperty | ForEach-Object {
        $ParameterValue2 = $JsonParameters2 | Select-Object -ExpandProperty $_.Name

        if ($_.Name -eq "siteName" )
        {
            $MyWebSiteName = $ParameterValue2.value
        }
    }

    #end Custom Section

Esto lo insertaremos entre las lineas $TemplateParametersFile = [System.IO.Path]::Combine($PSScriptRoot, $TemplateParametersFile) y if ($UploadArtifacts), como se ve en el gráfico de abajo:

RM5Con dicha variable captura lo que toca es decirle a nuestro PowerShell que una vez que haya provisionado todo lo que haya que provisionar invoque la creación de nuestros slots, para lo cual haremos uso de esta otra porción de código, que colocaremos al final del archivo:

Switch-AzureMode AzureServiceManagement
New-AzureWebsite $MyWebSiteName -Location "East US" -Slot "Stage"
New-AzureWebsite $MyWebSiteName -Location "East US" -Slot "QA"

RM6

Y listo, queda como tarea para uds capturar el valor de la zona geográfica y pasarla como variable en las 2 ultimas lineas de código, pues como notaran aun la estamos pasando “a mano”.

Hecho esto toca hacer Deploy desde Visual Studio y comprobar que se ha efectuado el despliegue respectivo para lo cual vamos al portal de Azure:

RM7Espero que les sea de utilidad para automatizar aun mas sus procesos de preparación de entornos, espero sus comentarios. Ya luego de esta precuela podemos proseguir con lo visto en:

  1. Gestión automática de entornos de despliegue con Azure (Introducción)
  2. Gestión automática de entornos de despliegue con Azure (Primeros pasos y un pequeño tropiezo
  3. Gestión automática de entornos de despliegue con Azure (tercera parte ¡desplegando!)

Información adicional: Automating web hosting creation in Azure with PowerShell

2 thoughts on “Agregando uno de los primeros pasos a nuestro ciclo de desarrollo y despliegue

Agregue un comentario

Su dirección de correo no se hará público.

Time limit is exhausted. Please reload the CAPTCHA.