¿Cosas deberías saber antes de iniciar en el mundo de DevOps?
Tags: devops, ci, cd, software
Published: 2020-07-05 23:45:07

> Foto de bongkarn thanyakij en Pexels

DevOps es un término que está atrayendo cada vez mas a muchos programadores y administradores de sistemas y tiene mucho sentido, DevOps es una filosofía y conjunto de prácticas que nos permiten crear software escalable, delegando actividades como escuchar cambios en el código, construir nuestra aplicación y llevar nuestros cambios a producción a ciertas herramientas (también conocido como automatizar).

Y realmente nos podemos aventurar en aprender alguna herramienta que nos ayude a lograr dicho cometido, pero antes de comenzar, te recomendaría que te tomes un tiempo para entender ¿por qué necesitas aprender DevOps?.

## Entendiendo el proceso de desarrollo de software

Los procesos de desarrollo de software suelen variar por cada proyecto, equipo o empresa, pero regularmente se apegan mucho a lo siguiente:

- Creación del entorno de desarrollo.
- Desarrollo de software.
- Validación de calidad interna del código.
- Construcción o empaquetamiento de aplicación.
- Despliegue a producción.



## Antes de DevOps

### Creación del entorno de desarrollo

Todo proyecto de software requiere de un entorno de desarrollo, esto incluye la instalación de aplicaciones y servicios para que tu código pueda ser ejecutado, por ejemplo, motores de bases de datos, apache o nginx, firewalls, etc. En éste paso también se incluye la configuración de estas aplicaciones y servicios. 

Para poder determinar qué requiere el entorno de desarrollo podríamos hacer una lista de todo aquello que se necesita instalar/configurar en una computadora recién salida de fabrica para nuestra aplicación pueda ejecutarse. 

### Desarrollo de software

Una vez que logramos echar a andar nuestra aplicación en nuestro entorno de desarrollo, solemos agregar funcionalidades, mejorar el rendimiento o corregir los errores encontrados en la aplicación. 

### Validación de calidad interna del código

Cada que un equipo de desarrollo (o desarrollador) completa un fragmento funcional de la aplicación, se realiza una revisión para saber si el código entregado por el equipo de desarrollo cumple con los estándares de calidad del proyecto, si cumple con los requerimientos y si no  tiene errores.

>  **Nota:** En este paso también nos aseguramos de que la nueva funcionalidad no afecte el código que ya se encuentra funcionando.

### Construcción o empaquetamiento de aplicación

En caso de que el código cumpla con todo lo necesario, entonces, una persona se encargaba de ejecutar en su computadora una serie de tareas para construir o empaquetar nuestra aplicación, tareas como instalar las dependencias del proyecto y construir un ejecutable (si es que se requería).

> **Nota:** Cuando hablamos de dependencias del proyecto, nos referimos a las librerías propias del código, por ejemplo, librerías para manejar fechas, librerías para leer archivos CSV, etc.

### Despliegue a producción

Finalmente se toma la construcción de nuestra aplicación (o empaquetado) y se realiza un proceso de despliegue, en el que colocamos nuestro producto final a disposición de nuestros clientes, nuevamente, los pasos para hacer despliegue pueden variar dependiendo de la aplicación, lenguaje, etc. Y cada uno de estos pasos era ejecutado por una persona encargada a través de una terminal ssh o mediante archivos de transferencia de archivos (FTP).


### Problemas frecuentes

Una vez que conocemos el proceso por cual pasa una simple mejora de código, nos podemos percatar de que se requiere de demasiado esfuerzo, por ello, las empresas o equipos solían hacer despliegue de un grupo de mejoras cada cierto tiempo o cuando se cumplía cierto entregable.  

A parte de que las entregas se tornaban lentas, si algo salía mal, se tenía que hechar para atrás todo el grupo de mejoras que se habían lanzado a producción.


## Con DevOps

### Creación del entorno de desarrollo

En vez de crear un entorno de desarrollo manualmente, se opta por utilizar herramientas como virtualización o contenedores para armar éstos entornos de desarrollo, de ésta manera, solo se crea un servicio para cada aplicación y éste servicio se instancía cada que sea necesario. 

Ejemplos de herramientas con las que se logra esto: Docker, VMWare.

### Desarrollo de software

Para este punto se suelen utilizar sistemas de versionamiento de archivos, como git o mercurial. Estas herramientas pueden ser configuradas para trabajar en conjunto con otros servicios que se encarguen de realizar automáticamente el despliegue a producción cada que se detecte un cambio. 

En este paso se agrega una capa adicional y "obliga" a los desarrolladores a crear pruebas automatizadas para su código, cada que un desarrollador o equipo de desarrollo completa una funcionalidad, el código va acompañado de una serie de pruebas que se encargan de validar que el código cumple con su función.

Ejemplos de herramientas con la que se peude lograr esto: github, gitlab, bitbucket.

### Validación de calidad interna del código

En éste paso, se obtienen los últimos cambios registrados en el sistema de versionamiento, y las herramientas se encargan de utilizar instanciar un contenedor o levantar una máquina virtual con el entorno de desarrollo, configurar el proyecto y ejecutar la suite completa de pruebas sobre los cambios detectados. Si algo llegara a salir mal, el proceso de despliegue se detiene aquí, de lo contrario procede a la construcción.

Ejemplos de herramientas con las que se logra esto: Jenkins, TravisCI, CircleCI.

### Construcción o empaquetamiento de aplicación

Una vez asegurada la calidad del código se realiza una serie de pasos automatizados que se encargan de construir la aplicación, a través de comandos o de ciertos plugins de la herramienta de integración continua.

Ejemplos de herramientas con las que se logra esto: Jenkins, TravisCI, CircleCI.

### Despliegue a producción

Las mismas herramientas de integración continua, nos permiten configurar los pasos necesarios para poder hacer un depliegue a producción, esto conlleva la preparación del entorno productivo, la configuración de las variables de entorno y la copia de archivos necesarios para poder tener nuestra aplicaicón disponible para nuestros usuarios.

Ejemplos de herramientas con las que se logra esto: Jenkins, TravisCI, CircleCI.

## Conclusión

DevOps requiere de una configuración muy fuerte al incio para poder automatizar todo el proceso, sin embargo, una vez configurada nos permite realizar despliegues mucho más confiables, haciendo que cada entrega se puede realizar de manera independiente y no requiera de esperar a una fecha para desplegar un grupo de cambios

A demás, en caso de error, solamente se regresaría ese último cambio desplegado.

**Nota:** Te recomiendo no implementar DevOps si no conoces el proceso completo de desarrollo de tu proyecto, ya que DevOps no es una receta única, se debe crear y configurar acorde a las necesidades de cada proyecto.

Te invito a que analices el proceso actual de desarrollo de tu empresa o tu proyecto siguiendo los pasos que te comenté en éste post. 

Si tienes dudas de como iniciar a automatizar con alguna herramienta, deja tu inquietud en un comentario y te pasaré algún recurso de utilidad, al igual si ya tienes experiencia en DevOps cuentanos de ella y finalmente, si tienes algún comentario o sugerencia, siempre serán bienvenidos.

¡Hasta la próxima!