Inicio / Blog / Arquitectura de backend de Monorepo
Ingeniería de backend

Arquitectura Monorepo para backend de APIs: flujos de trabajo de CI y ejecución de código a escala

Un monorepo no es sólo una elección de organización de código. Es una declaración sobre cómo se relacionan los paquetes entre sí, cómo se ejecuta la CI y cómo se aplica la calidad a través de fronteras compartidas. Tomar esas decisiones desde el principio es más difícil que dividir los paquetes más adelante.

CodePulse interfaz IDE del compilador en línea que muestra el editor de código, los controles de ejecución y el espacio de trabajo de salida
CodePulse vincula el IDE del navegador, la ejecución de APIs en Node.js y las puertas de calidad de CI en un flujo de trabajo monorepo.

Lo que te compra un monorepo en un proyecto Node.js

El principal beneficio es la gestión del cambio atómico: un PR que modifica una biblioteca compartida y actualiza a los consumidores que dependen de ella aterriza como una unidad en lugar de dos implementaciones coordinadas. Los beneficios secundarios incluyen configuración de herramientas compartidas, informes de pruebas unificados y un árbol de dependencia único que simplifica la resolución de conflictos de versiones.

CodePulse Monorepo aplica esta estructura a una plataforma IDE en línea con una interfaz Vanilla JS, un backend de ejecución Node.js y flujos de trabajo de CI que ejecutan controles de calidad en todos los paquetes antes de promocionar cualquier paquete.

Las APIs de ejecución de código requieren un sandbox explícito

Un backend de APIs que ejecuta código enviado por el usuario necesita un modelo de amenaza antes de escribir una línea. Los riesgos son diferentes a los de un [[PKLAVC0] de datos]: la ejecución de código arbitrario puede escapar de los límites de un proceso, consumir recursos ilimitados o filtrar información del entorno del host. Las opciones de diseño de Sandbox incluyen:

  • Aislamiento de procesos — cada ejecución genera un proceso hijo aislado o un contenedor sin acceso a los recursos del host fuera del entorno limitado.
  • Límites de recursos — Límites de tiempo de CPU, asignación de memoria y descriptores de archivos aplicados a nivel del sistema operativo en lugar de en el código de la aplicación, que se pueden eludir.
  • Truncamiento de salida — el resultado de la ejecución está limitado para evitar la filtración de grandes cantidades de datos o el abuso de la respuesta como canal lateral.
Los límites de recursos en el código de la aplicación son orientativos. Los límites impuestos por el sistema operativo o el tiempo de ejecución del contenedor son estructurales. Las ejecuciones API deben usar ambos, no uno ni el otro.

Diseño de flujo de trabajo de CI para repositorios de múltiples paquetes

Una pipeline de CI monorepo tiene una opción: ejecutar todas las comprobaciones en cada confirmación o detectar qué paquetes cambiaron y ejecutar solo las comprobaciones afectadas. La detección de cambios afectados es más rápida pero agrega complejidad y puede pasar por alto dependencias transitivas. Para monorepos más pequeños donde la CI completa se ejecuta en menos de unos minutos, la ejecución completa del proceso en cada PR es más simple y confiable que la detección de cambios.

Las gates de CI en un proyecto de ejecución de código generalmente incluyen linting y formateo, pruebas unitarias en todos los paquetes, pruebas de integración contra la ejecución de APIs y aplicación de cobertura. Cualquier falla bloquea la promoción del código.

Lograr una cobertura de control de calidad superior al 85 % sin teatro de cobertura

Los umbrales de cobertura son útiles como piso, no como techo. Un proyecto que escribe pruebas de bajo valor para alcanzar un umbral tiene la métrica pero no la protección. Las suites de alta cobertura que realmente protegen contra regresiones cubren las rutas de ejecución que importan: casos extremos, ramas de manejo de errores y condiciones de contorno.

Para una ejecución de APIs, la cobertura significativa se dirige a las rutas de código que ejecutan, truncan, agotan el tiempo de espera y rechazan la entrada del usuario, no solo la ruta feliz. El umbral de más del 85% en CodePulse refleja la cobertura de estas rutas críticas en lugar de la cobertura nominal de archivos.

Frontend y backend compartiendo un límite de repositorio

Cuando el frontend y el backend viven en el mismo repositorio, la prueba del contrato de API se vuelve sencilla: la prueba puede importar el controlador del servidor real y el código del cliente real y verificar que coincidan en las formas de solicitud y respuesta. Esto es más difícil de mantener cuando los paquetes se encuentran en repositorios separados y el contrato está implícito.

el Stack de desarrollo JavaScript describe cómo este patrón de integración frontend-backend se relaciona con la arquitectura más amplia Node.js y Vanilla JS.