Podría ser, por ejemplo, un design system, que es uno común, pero también algunas bibliotecas de lógica de authentication o cosas así, donde muchos de nuestros proyectos dependen de ello. Y si lo cambiamos, a menudo nos encontramos con un escenario de peor caso donde los proyectos defectuosos son casi todo el grafo, porque todo el proyecto depende de eso. Por lo tanto, lo que se hace generalmente es distribuir. En lugar de simplemente paralelizar las cosas tanto como sea posible en la misma máquina, lo que intentamos hacer es distribuirlos en diferentes máquinas.
Entonces aquí puedes ver, distribuirlos en la máquina uno, máquina dos, máquina tres. Lo que puedes ver aquí, sin embargo, es que es una distribución muy uniforme, ¿verdad? Y eso es lo que generalmente sucede si lo configuras manualmente. Porque la distribución es difícil, porque necesitas codificarla de alguna manera. Y una forma muy directa, potencialmente ingenua de hacerlo es simplemente dividirlo por las diferentes tareas que tienes y luego ejecutarlo en diferentes máquinas.
Entonces aquí puedes ver, los diferentes tiempos de ejecución pueden llevar potencialmente a una baja eficiencia, porque algunas tareas pueden llevar mucho tiempo, y por lo tanto, la ejecución completa lleva más tiempo, pero otras máquinas ya están inactivas, porque su tarea, digamos el linting, fue más rápido, y ya han terminado. También el número de máquinas es estático. Por lo general, defines el número de máquinas, y eso es básicamente el número que está fijo allí. Y necesitas ajustarlo con el tiempo a medida que la estructura de tu monorepo obviamente se vuelve más grande y crece. Y también hay complejidad potencialmente en la puesta en marcha de esas máquinas, dependiendo de tu proyecto o proveedor de CI que estés utilizando.
Muy a menudo veo scripts que se hacen en CI. Por ejemplo, NX tiene una API programática, por lo que puedes calcular esos nodos afectados programáticamente, y luego intentar mezclarlos de alguna forma inteligente, donde los distribuyes en diferentes máquinas e incluso generas pipelines dinámicamente. Este es un ejemplo para GitLab, que te permite crear nodos dinámicamente, y así tener algún tipo de distribución. Pero es algo muy estático como puedes ver, porque está codificado en tu código, y no puede adaptarse realmente a una estructura de monorepo cambiante. Por lo tanto, esto requiere mucho mantenimiento.
Después de ver algunas de estas dificultades que enfrentan los equipos al crear estos scripts personalizados, hemos estado investigando lo que llamamos NX agents, básicamente para ayudar con esa distribución, específicamente para configurar las máquinas, pero también con la dinamicidad de la distribución en sí, para que no necesites ajustarlo continuamente a medida que tu estructura de monorepo crece, sino que la distribución se produciría dinámicamente en función del número de tareas que se ejecutan, pero también en función del tiempo de ejecución de estas tareas basado en datos históricos básicamente.
Por lo tanto, los NX agents intentan aprovechar el grafo del proyecto, porque tienen acceso al grafo NX en segundo plano, y por lo tanto, saben cómo se estructuran los proyectos, qué dependencias hay, lo cual es un punto importante cuando se distribuye, como distribuirlos de manera eficiente. Y describes qué quieres ejecutar, no cómo quieres ejecutarlos, sino que simplemente dices, quiero ejecutar la tarea afectada de construcción y linting, y las tareas de extremo a extremo de una cierta manera, pero no defines cómo se distribuyen.
Y una gran parte que viene con la primera versión de los NX agents es todo el aspecto de escalado dinámico, por lo que se generan más máquinas según el PR, pero también la distribución detallada y también la rerun automática de tareas inestables. Ahora, nos hemos centrado específicamente en las pruebas y las pruebas de extremo a extremo en este momento, pero en teoría, podemos detectar tareas inestables y volver a ejecutarlas automáticamente en CI. Así que echemos un vistazo. ¿Cómo se ve la descripción de lo que se ejecuta? Bueno, todo lo que necesitas hacer básicamente para activar la distribución es esta línea. Específicamente el dash-dash distributes on, donde proporcionas la información, quiero distribuir mis tareas que se ejecutan justo después en 15 máquinas, en este caso, de la nota Linux Medium plus JS. Y esos son nombres de máquinas basados en ciertas características, que obviamente puedes definir según las necesidades que tengas. Es algo así como una configuración de Docker casi. Y luego ejecutas los comandos reales. Y aquí puedes ver cómo describes qué ejecutar y no cómo.
Comments