Growing Pains: cómo logramos superar el desafío de crecer ordenados

Leonel Corso
PeYa Tech
Published in
4 min readAug 27, 2021

A fines de 2019, en PedidosYa nos encontrábamos con la necesidad de sumar más desarrolladores para poder sumar más y mejores funcionalidades, pero a la vez, nos encontramos lidiando con algunos de los problemas que comienzan a surgir a medida que el número de desarrolladores crece:

  • Tiempos de on-boarding extensos, debido a que no había un proceso claro y definido para hacer las cosas.
  • En vez de poner el foco en construir nuevas funcionalidades, los equipos se pisaban constantemente debido a que trabajaban sobre el mismo código, sobre todo cuando se trataba de la App móvil
  • Se experimentaban cuellos de botella en los pedidos de infraestructura, gestión de repositorios y permisos sobre algún recurso. Esto en parte a que un único equipo debía administrar las demandas del resto de Tech
  • Se debían hacer grandes procesos de regresión para asegurar la calidad, demorando el tiempo de salida a producción

Es de la necesidad de resolver estos problemas que nace Jarvis.

¿Qué es Jarvis? Entendiendo sus conceptos claves

Jarvis es un orquestador de todas las tareas comunes al proceso de desarrollo, estandarizando y simplificando los puntos de control de calidad y seguridad.

En otras palabras, Jarvis fue concebido con la idea de darle a cada equipo la posibilidad de autogestionar sus necesidades sin tener que depender de terceros para llevar sus funcionalidades a producción, automatizando cada necesidad.

(Estarán pensando: la verdadera pregunta es ¿por qué se llama Jarvis? Y sí, se llama así porque somos muy fans de Marvel y Iron Man es uno de nuestros héroes preferidos. Además, ¿quién no quiere un chofer reconvertido en AI Assistant con voz de Jude Law/Paul Bettany?)

Jarvis posee dos componentes principales

  • Jarvis-cli: un aplicación escrita en Golang que se ejecuta desde la línea de comandos que permite realizar todas las operaciones necesarias por un equipo
  • Jarvis-ui: una aplicación web escrita en React que apunta a la gobernanza de todos los componentes creados con Jarvis.

En esta primera entrega te vamos a contar cómo funciona Jarvis-cli para fijar las bases y no cargar con demasiados conceptos. En próximos posts abordaremos de lleno Jarvis-UI, contándote cómo gestionamos la información para un rápido entendimiento de nuestra plataforma.

Arquitectura

En el diagrama que observamos aquí arriba, Jarvis-cli se comunica con un servicio también escrito en Golang que se encarga de llamar al motor de workflow de AWS, Step functions, que ejecutará una serie de funciones lambdas para comunicarse con Github, Jenkins o AWS entre otros, para gestionar el comando solicitado.

Estos comandos son las abstracciones de toda tarea necesaria por un equipo de desarrollo, garantizando que se ejecuten de la manera uniforme acordada entre los equipos y sin necesidad de solicitar tickets o asistencia a otros equipos.

Abstracciones

Jarvis maneja las siguientes abstracciones principales:

  • Apps: es un contenedor de componentes, similar a una carpeta del sistema operativo donde cada equipo agrupa los distintos componentes de una funcionalidad a construir.
  • Builds: compilación de los distintos módulos soportados, por ejemplo un build de un servicio de backend escrito en kotlin.
  • Deploys: despliegue del build en un ambiente a elección, como ser staging o live.
  • Release: lanzamiento de una nueva versión de nuestra aplicación móvil.
  • Trains: forma en la que agrupamos los cambios en nuestra aplicación en cada nueva versión. Los equipos suben cambios al tren que luego es lanzado en una determinada fecha.
  • Componentes: son todos los objetos que Jarvis puede crear a demanda, como por ejemplo: Servicio de backend, Infraestructura (SQS, SNS, Caches, DynamoDB), Módulos de Mobile (Android/iOS) y Módulos Web (Micrositios, AppShells, Web Pools).

En este diagrama podemos ver en color todos los componentes de frontend, backend e infra que Jarvis permite crear a los equipos de manera completamente independiente:

Jarvis en acción

Supongamos que un nuevo desarrollador backend se suma al equipo A. Tras recibir su onboarding inicial y haber conocido Jarvis, su líder le comenta de un nuevo servicio en Go que necesitan lanzar.

A continuación, veremos los comandos necesarios en Jarvis-cli para lanzar a producción dicho servicio, nombrando el impacto más importante que genera

  1. jarvis@> create app

En este paso Jarvis le pedirá el nombre de la app a crear y hará “cd” a la misma para dejarlo parado dentro. La llamaremos “demo”

2. jarvis@demo> add backend-golang

Aquí estaremos indicando a Jarvis que nos cree un repositorio en Github listo para clonar y usar, en base a un template que definimos que trae el código base para un servicio de backend en Golang

3. jarvis@demo> build

Tras haber hecho el commit del código al repositorio por parte del desarrollador, este comando compila nuestro código, ejecuta los unit tests y taggea el mismo.

4. jarvis@demo> deploy start

Finalmente le indicamos a Jarvis que despliegue nuestro código en producción.

Por supuesto cada comando es interactivo, por ejemplo al iniciar un deploy, nos pregunta el ambiente entre otra cosas, pero el propósito de este post es mostrar cómo Jarvis provisionó el repositorio, sus permisos, el pipeline de build y deploy y permitió liberar a producción el microservicio con 4 simples comandos.

En nuestro próximo post mostraremos cómo Jarvis acompañado de cambios en la arquitectura en nuestra aplicación móvil nos permitió automatizar el 100% del proceso de lanzamiento.

Para cerrar, ya que somos firmes creyentes de que crecemos con el intercambio de opiniones, si tenés alguna duda, propuesta o si querés contarnos cómo lo hacen en tu trabajo, ¡nos encantaría leerte!

--

--