Autentia

Blog

Entendiendo DevOps en 5 minutos

Cuando un tema se convierte en tendencia pueden pasar dos cosas, que sea una moda o que sea una buena práctica que venga para quedarse. Este segundo caso es el de DevOps. Este post lo que pretende una visión generalista de este concepto y por qué deberías considerar incorporarlo en tu organización.

A nivel introductorio, aunque con seguridad ya te hayas familiarizado con el concepto (aunque sólo sea de oídas), DevOps es una metodología de desarrollo de software que busca optimizar el proceso de entrega así como reforzar “la colaboración” entre los equipos de desarrollo de software que construyen las soluciones y los equipos de operaciones encargados de estas soluciones estén disponibles en los diferentes entornos. Para ello se requiere un cambio cultural.

En los últimos años, la evolución de la tecnología nos ha permitido alcanzar esta conciliación entre la parte de Desarrollo y la de Operaciones, brindándonos la posibilidad de trabajar con la infraestructura como código, lo que posibilita trabajar con procesos que anteriormente eran manuales o poco automatizables con las ventajas de todo el trabajo que se ha realizado en la parte de desarrollo para mejorar la calidad (test), el trabajo colaborativo (gestión de versiones) y la gestión de dependencias e integración con productos de terceros, con la finalidad de reducir el tiempo y esfuerzo en cada uno de los pasos, consiguiendo entregar código en producción con mayor rapidez y calidad, reduciendo los errores y limitando las tareas manuales que no aporten valor añadido al proceso.

El matiz está en que no es que antes no existiera este flujo de trabajo, sino la posibilidad de realizarlo de forma programática con tareas que antes eran manuales o poco automatizables.

Desde la generación del código, hasta el despliegue en producción de la build correspondiente, se establece un flujo de trabajo y unas herramientas y/o tecnologías que permiten su automatización. Se trata de un flujo de trabajo que es necesario adaptar según el caso, por lo que a continuación realizamos una propuesta sobre un flujo de trabajo genérico y unas soluciones tecnológicas de referencia para entender mejor el proceso y sus beneficios.

  1. Siguiendo el gráfico anterior, partimos del código fuente que un desarrollador tiene en su equipo local, donde trabaja con el IDE elegido (Eclipse, Netbeans, IntelliJ…) sobre un lenguaje concreto, en este caso Java.
  2. Lo primero con lo que debemos contar es con un repositorio de código distribuido, en este caso hablamos de Git (pudiendo implementar cualquiera de sus opciones, alojándolo en hosting propios o externos, como GitLab o GitHub) de forma que el equipo de desarrollo pueda trabajar de forma colaborativa, donde se aloje todo el código de los diferentes desarrolladores de forma centralizada es el primer paso hacia la integración continua. Los beneficios son:
    1. Podremos versionar el código, pudiendo recuperar una versión específica en un momento dado, reduciendo el coste y el esfuerzo de deshacer cambios en el código. 
    2. Nos aseguraremos así que todos los desarrolladores construyen su código sobre la misma versión y se reducen los problemas de integración.
    3. Se simplifica la gestión de cambios en el proyecto, todo cambio se encuentra etiquetado y es trazable, además solo se actualizan los cambios específicos, no se reemplaza el proyecto completo ni los archivos cambiados.
  3. A continuación contamos con un gestor de dependencias como Maven, que es capaz de analizar las dependencias que tiene el proyecto y resolverlas para compilar posteriormente. A partir de ese momento compilará y ejecutará los procesos de calidad (pruebas unitarias, integración…) que se hayan establecido. Los beneficios son:
    1. Mayor control de la correcta generación de las builds.
    2. Ejecución automática de los test y comprobación de los resultados.
  4. Una vez llegados a este punto, tenemos que hablar de Jenkins, que actuará como orquestador de múltiples procesos del flujo. Hay que pensar en él como el encargado de realizar las tareas rutinarias y comprobar si un paso del flujo para llevar la funcionalidad a producción ha sido correcto para disparar el siguiente, lo que es posible gracias a la infinidad de plugins con los que cuenta y que nos permitirá adaptar el flujo a nuestras necesidades. El flujo más común sería, la compilación del proyecto con Maven cuando un miembro del equipo hace cambios en el repositorio, y la publicación en un entorno de preproducción de dicha compilación. Además se suele integrar también con Nexus para sacar las distintas versiones para los entornos productivos.
  5. Jenkins ejecutará Sonar para verificar la calidad del código escrito, con respecto a las métricas establecidas.
  6. Si los resultados del proceso anterior son favorables, Jenkins lanzará el proceso de Selenium para ejecutar los casos de prueba establecidos y asegurarnos de que el nuevo código no rompe la funcionalidad recogida en dichos casos. Si este paso finaliza de forma exitosa, dispondremos de una build, lista para ser desplegada. Habremos conseguido entonces disponer de un entorno de Integración continua que os permitirá acelerar el proceso de generación de releases.
  7. Si queremos extender el concepto de Integración continua, podríamos incluir el despliegue automatizado de la build generada y pasaremos a hablar de Entrega Continua. Gracias a herramientas de virtualización como Vagrant o Docker y herramientas de gestión de la configuración como Ansible (que permite realizar configuraciones específicas sobre nuestras virtualizaciones), podemos ser capaces de crear los entornos necesarios para desplegar la build.
  8. De forma complementaria, proponemos también el empleo de un APM (monitor de rendimiento de aplicaciones) como AppDynamics para cubrir dos puntos fundamentales:
    1. Durante el desarrollo, analizar el rendimiento de cada módulo de software desarrollado para garantizar su correcto desempeño y que la solución implementada se comporta como se esperaba antes de llevarlo a producción. Ahorrando tanto el tiempo, como el esfuerzo y el coste asociado de llevar software que no funcione de la forma esperada a producción, pudiendo convertirse en un cuello de botella de nuestro sistema.
    2. En producción, permite analizar el rendimiento del sistema y comprobar que en el entorno real responde de la forma esperada.
  9. Y por último, debido a la gran cantidad de información que las diferentes partes de nuestro sistema va a generar, proponemos el uso de una herramienta de explotación de logs como B-ELK  tratándose de una suite compuesta por:
    1. Beats: Es la solución de la suite que cuenta con agentes que se encargan de capturar la información que posteriormente van a procesar y explotar Logstash y Elasticsearch.
    2. Elasticsearch: Es la pieza principal de la suite, basada en el motor de indexación y búsqueda Apache Lucene, se encarga de almacenar la información.
    3. Logstash: Es un procesador de logs que permite estructurar la información formateándola y enriqueciéndola , antes de almacenarla, de forma que se optimice su posterior explotación.
    4. Kibana: Es una herramienta de visualización que permite la creación de dashboards que muestran de una forma gráfica la información enviada por Beats, enriquecida por Logstash y almacenada por Elasticsearch. Permite de esta manera agregar gran cantidad de información para seguimiento de KPIs y métricas tanto de negocio como de IT, aportando una visión muy valiosa para las diferentes organizaciones.

 

Como resumen, el implementar DevOps en una compañía permite:

  1. Mejorar la colaboración en el desarrollo, ganando control y trazabilidad sobre el código que se genera. Reduciendo el riesgo durante los merges de código y acelerando el proceso de integración.
  2. Acelerar el proceso de generación de builds y mejorar la calidad del código que se incorpora en dichas builds, adelantando problemas y reduciendo riesgos e impacto derivado de poner un código que no funciona correctamente en producción.
  3. Automatizar procesos manuales repetitivos y que no aportan valor, reduciendo el ciclo de publicación y mejorando notablemente el time-to-market de las versiones y su promoción entre entornos.
  4. Automatizar el escalado horizontal de un sistema de forma que una vez revisado un capacity planning se pueda de una manera sencilla realizar el redimensionamiento de la plataforma.

 

Como puede verse, todos los beneficios van orientados a mejorar la calidad del software, reducir el tiempo de entrega de funcionalidad y ahorrar esfuerzos/costes en el proceso completo, alineando las estrategias de desarrollo y producción/operaciones.

Si estás interesado en DevOps, contacta con nosotros para que podamos plantearte una introducción estructurada a DevOps o bien consulta nuestros cursos relacionados de Integración y despliegue continuo con Docker y Kubernetes y Docker Swarm, escalando tus contenedores.

¿Buscas formación en DevOps?

VER CURSOS
Por Jesús Angulo 17 Aug 2018

¿Cómo podemos ayudarte?