En algún momento del ciclo de vida de cualquier aplicación web, la misma tendrá que ser actualizada por algún motivo: puede ser por cambios en los requerimientos de negocio, rebranding, corrección de errores, adopción de nuevas versiones de librerías de las cuales depende, etc.
Si todos nuestros usuarios están en la misma zona horaria, es fácil identificar una ventana de tiempo en la que llevar adelante la manutención offline, aplicar los cambios requeridos y volver a conectarla sin afectar la operativa.
Sin embargo, cuando nuestra aplicación tiene usuarios en diferentes zonas horarias, llevar la aplicación offline puede no ser una opción.
Aquí es donde se nos solicitará hacer un despliegue con cero tiempo de inactividad.
El proceso para llevar adelante un despliegue con cero tiempo de inactividad puede ser resumido de esta manera:
Cuando creamos un App Service en Azure, podemos especificar distintos slots (espacios) a ser desplegados. Estos espacios son instancias aisladas de nuestra aplicación, con su configuración propia y URL único.
Una vez definido al menos un espacio, el espacio por defecto será etiquetado como Producción.
Para más información dirigirse a: https://docs.microsoft.com/en-us/azure/app-service/deploy-staging-slots
El siguiente paso que necesitamos realizar es identificar exactamente qué cambios necesitan ser aplicados al ambiente de producción para actualizar la aplicación exitosamente.
¿Necesitamos actualizar el esquema de base de datos?, ¿Necesitamos cambiar la ubicación desde donde la aplicación está leyendo un archivo?
¿Hay otros cambios en los recursos externos siendo utilizados por la aplicación?
Esto es muy importante para un despliegue exitoso. Si todos los cambios relacionados con recursos externos son ubicaciones de donde leer archivos, siempre que el esquema de esos archivos continúe incambiado, no habrá que realizar pasos adicionales mas allá de actualizar los ajustes a las rutas de los archivos.
Ahora, si necesitamos actualizar el esquema de base de datos, tendremos que asegurarnos de que el código en la aplicación actualmente desplegado es enteramente compatible con el esquema de base de datos actualizado.
Dado que el código ya existente debería poder utilizar la base de datos exactamente de la misma manera que antes de las actualizaciones del esquema, las siguientes consideraciones deberían ser tenidas en cuenta dependiendo del cambio que necesitemos aplicar:
Antes de desplegar el nuevo código de aplicación:
Antes de desplegar el nuevo código de aplicación:
Antes de desplegar el nuevo código de aplicación:
Azure DevOps nos permite intercambiar espacios en nuestro pipeline de lanzamientos. Esto significa que podemos tener por ejemplo un espacio llamado “Staging” y hacer un intercambio entre los espacios “Staging” y “Producción” desde una tarea en Azure DevOps.
Haciendo un intercambio de espacios con “Producción” como objetivo nos asegura que “Producción” no tendrá tiempo de inactividad.
Para hacer un intercambio de espacios en nuestro pipeline de lanzamientos, solo necesitamos agregar una tarea a la etapa que representa nuestro entorno de producción:
Para más información sobre qué sucede exactamente durante un intercambio de espacios diríjase a https://docs.microsoft.com/en-us/azure/app-service/deploy-staging-slots#AboutConfiguration
Hay dos consideraciones importantes cuando desplegamos mediante un intercambio de espacios:
Una vez completados los pasos descriptos hasta ahora, los diferentes espacios para desplegar en nuestro App Service serán mostrados en el portal de Azure de esta manera:
Se recomienda para nuestro pipeline de release tener configuradas distintas etapas a ser desplegadas únicamente despúes que la etapa previa fué desplegada con éxito.
También es recomendable pre-configurar las aprobaciones de despliegues en cada etapa, especialmente en producción. Esto nos permitirá testear la aplicación web con las mismas configuraciones que en producción y así poder identificar errores que puedan estar sucediendo en esa configuración específica antes de que afecte al usuario final.
Si tenemos integración o testing end-to-end en nuestro proyecto, también es una buena idea hacer que el pipeline de releases los corra y sólo despliegue a producción una vez que todos los tests hayan pasado.
Las etapas en nuestro pipeline de releases se verían así:
Planificar un despliegue con cero tiempo de inactividad no es tarea trivial. Una vez identificamos la necesidad del mismo, el planning idealmente debería comenzar durante la etapa temprana del desarrollo de cambios que queramos incluir en el mismo.
Mayormente porque parte de los pasos mencionados arriba incluyen usar nuevos nombres para dependencias externas ya existentes (como ser el procedimiento de almacenaje) y realizar varios cambios a nuestro ambiente Azure y al pipeline de releases de Azure DevOps.