Integración continua
Paso a paso

Usando la Integración Continua por primera vez

¿LaIintegración Continua puede hacer más sencillo mi trabajo?

En un mundo perfecto, tu desarrollador rockstar conoce el negocio, las necesidades del cliente, desarrolla backend y frontend, hace TDD, QA, es arquitecto, DevOps y despliega a producción antes del mediodía.

Pero en la realidad, el desarrollo de software es una actividad de conjunto donde existen varios equipos con talentos multidisciplinarios y la meta es entregar nuevas funcionalidades y corregir errores lo más rápido posible. Todo esto con la obligación de no introducir nuevos bugs y mantener una arquitectura e infraestructura sólida y escalable.

Suena como un proceso desgastante y con muchas aristas. No solo suena, lo es.

Desarrollo tradicional
Desarrollo tradicional

¿Cómo puede un flujo tan básico complicarse tanto? R: Con el tiempo y el tamaño del proyecto.

Mientras un proyecto crece y el equipo de desarrollo sufre cambios, la complejidad y tiempo para realizar las pruebas y asegurar que no se ha roto algo viejo con cambios nuevos, también va en aumento. Como consecuencia, los equipos hacen releases con menor frecuencia tratando de juntar la mayor cantidad de características y correcciones en un solo lanzamiento. Estas circunstancias provocan la caída de productividad.

¡Pero no todo son malas noticias! Los pasos de construcción/compilación, pruebas y despliegue pueden ser, en su mayor parte, automatizados. Ufff…

Not today, technical debt

Introduciendo un pequeño proceso llamado Integración Continua (CI) tu equipo se encontrará haciendo lo que mejor sabe hacer y dedicando la mínima cantidad de tiempo a tareas que comúnmente se denomina como talacha.

“Integración continua es la práctica del desarrollo de software donde los miembros de un equipo incorporan su trabajo frecuentemente. Cada integración es verificada por una construcción automática para detectar errores lo antes posible” .

Martin Fowler

Proceso de integración continua
Proceso de integración continua

Los objetivos de la integración continua (CI) son:

  • Aumentar la frecuencia de releases
  • Automatizar la construcción, pruebas y despliegue
  • Identificar errores rápidamente
  • Poner a disposición del equipo la última versión construida

Cómo lo hacemos en KarmaPulse

 flujo de CI
Nuestro flujo de CI a grandes rasgos

Los pasos:

  1. Mantenemos nuestro código en un repositorio central.
  2. Usamos Jenkins para realizar pruebas y construir el proyecto.
  3. Crea una imagen de Docker de la aplicación.
  4. Se hace push de la imagen al registro de Docker.
  5. Despliega el proyecto en Amazon Web Services con ECS.

Claro que mantenemos ambientes de desarrollo y producción para evitar sorpresas

Un flujo muy simple, pero nos ha ahorrado muchos dolores de cabeza y trabajo innecesario. La verdadera magia la hace Jenkins, nuestra herramienta elegida para realizar la Integración Continua. Es open source, sencillo, distribuido y extensible. Para casi todo lo que se te ocurra hacer, existe un pluginEste tutorial te ayudará con el proceso de instalación y los primeros pasos para crear una Tarea.

Existen muchas más herramientas y servicios allá afuera que puedes usar dependiendo de tus necesidades: TravisTeamCityCodeshipGitLab y si eres más “serverless”, puede que te interese LambCI.

Si tu equipo aún no cuenta con ningún proceso automatizado para construir, probar y desplegar sus aplicaciones, te recomiendo que lo introduzcas de manera gradual para asegurarte que cada paso lo estas ejecutando correctamente y de forma repetible y automatizable:

  1. Inicia por crear (si no existen ya) archivos README de cada proyecto, donde se indiquen los pasos a seguir para construir, probar y ejecutar la aplicación. Este archivo será tu receta para crear tareas en la herramienta CI de tu elección.
  2. Crea una nueva tarea de Jenkins (o lo que uses) que sea capaz de traer tu repositorio de GitHub, Bitbucket, GitLab o donde sea que esté.
  3. Agrega el paso de construcción a tu tarea, que, dependiendo del lenguaje o framework, puede estar dividido en subpasos como: descarga de librerías, compilación de estáticos, compilación de código fuente, etc. La salida de este paso debe ser un ejecutable de la aplicación listo para ser usado.
  4. Ejecuta el conjunto de pruebas de la aplicación que determinaran si la construcción es válida o no.
  5. Hasta este punto ya tienes una versión válida de la aplicación que puedes tomar manualmente y desplegarla en el ambiente que quieras, sin embargo, es preferible que también automatices este paso. Crea un script que manda la aplicación en un repositorio de artefactos para su almacenamiento y posterior descarga i.e. Archiva, NPM, DockerHub.
  6. Ahora puedes tomar tu aplicación construida y probada desde tu repositorio y ejecutarla en el ambiente correspondiente.

Cada uno de estos pasos puede fallar por dos razones: Error en el código o error en la herramienta de CI. Los logs deben ser tu primer recurso para identificar que salió mal y solucionarlo.

Te recuerdo que la Integración Continua no es más que la automatización de las tareas que tu equipo ya realiza de forma manual, así que asegúrate de incluirlos en cada paso para saber que estás cubriendo todas las necesidades de la aplicación.

 mapa de la República Mexicana con división política
A falta de una imagen para ilustrar este proceso, pongo un mapa de la República Mexicana con división política

Para después…

Las herramientas de CI pueden hacer mucho más, una vez que tengas bien implementado el flujo básico puedes experimentar con:

  • Disparar la construcción con un webhook cada vez que se hace un push a un branch del repo. Nosotros ocupamos un bot de Slack 🙂
  • Por cada construcción crear el Changelog y subirlo al repositorio. Esto requiere de buenas prácticas en los mensajes de commits.
  • Notificar cuando se ejecuta una tarea y el resultado de la misma.
  • Implementar herramientas de calidad de código como parte de las pruebas (JSLint, Scalastyle, Checkstyle, Pylint).
  • Integración con tu herramienta de seguimiento de bugs e.g. JIRA.

Recuerda que para cada uno de estos puntos adicionales, los plugins son tus mejores aliados.

Con un proceso automatizado tu equipo dejará de preocuparse por la talacha y se enfocará en los arreglos y funcionalidades que necesitan sus proyectos, con la seguridad de que la construcción, pruebas y despliegue se encuentran en buenas manos. No olvides que la meta es aumentar la frecuencia de releases y la estabilidad de los mismos.

¡Si tienes alguna duda no dudes en contactarme en mi twitter!