Saltar al contenido principal
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Distribución de Ejecución de Tareas (DTE)

Lerna acelera tu tiempo promedio de CI con caching y la bandera --since. Pero ninguna de estas características ayuda en el peor escenario. Cuando se modifica algo central en tu repositorio y cada tarea debe ejecutarse en CI, la única forma de mejorar el rendimiento es agregando más trabajos de agentes y paralelizando eficientemente las tareas.

La forma más obvia de paralelizar tareas es dividirlas por tipo: ejecutar todas las pruebas en un trabajo, todas las compilaciones en otro y todas las tareas de lint en un tercero. Esta estrategia se llama binning. Esto puede complicarse si algunas pruebas tienen tareas de compilación como requisitos previos, pero asumiendo que resuelves cómo manejarlo, una configuración típica puede verse como el diagrama siguiente. Aquí las pruebas se retrasan hasta que los artefactos de compilación necesarios estén listos, pero las tareas de compilación y lint pueden comenzar inmediatamente.

CI usando binning

El problema con el enfoque de binning es que terminarás con tiempo de inactividad en uno o más trabajos. La ejecución distribuida de tareas de Nx reduce ese tiempo de inactividad al mínimo posible asignando cada tarea individual a trabajos de agentes según su tiempo promedio de ejecución. Nx también garantiza que las tareas se ejecuten en el orden correcto y usa caché distribuido para asegurar que los artefactos de compilación estén presentes en cada trabajo de agente que los necesite.

Cuando configuras la ejecución distribuida de tareas de Nx, tu gráfico de tareas se verá más así:

CI usando DTE

Y no solo terminará el CI más rápido, sino que la experiencia de depuración será idéntica a ejecutar todo tu CI en un solo trabajo. Esto se debe a que Nx usa caché distribuido para recrear todos los registros y artefactos de compilación en el trabajo principal.

Encuentra más información en esta guía detallada para mejorar tus peores tiempos de CI.

Configuración

Para distribuir tu ejecución de tareas, necesitas (1) conectarte a Nx Cloud y (2) habilitar DTE en tu flujo de trabajo de CI.

1. Connect to Nx Cloud via the interactive, browser-based workflow
npx nx connect-to-nx-cloud

Configura tu flujo de trabajo de CI

Cada organización gestiona sus pipelines de CI/CD de manera diferente, por lo que no es posible cubrir todos los casos. Sin embargo, los siguientes ejemplos de configuración de DTE para la CLI de Nx en proveedores populares te darán un buen punto de partida, y son sencillos de adaptar a comandos específicos de lerna como lerna run (en lugar de nx run-many o nx affected):

Nota: Solo las operaciones almacenables en caché pueden distribuirse porque deben reproducirse en el trabajo principal.

Para más detalles sobre la configuración de DTE, lee esta guía.

Flujo de Ejecución en CI

La ejecución distribuida de tareas funciona con cualquier proveedor de CI. Tú eres responsable de lanzar trabajos en tu sistema CI. Nx Cloud luego coordina cómo esos trabajos colaboran. Hay dos tipos distintos de trabajos que deberás crear:

  1. Un trabajo principal que controla qué se ejecutará

  2. Múltiples trabajos de agentes que ejecutan las tareas

El flujo del trabajo principal se ve así:

# Coordinate the agents to run the tasks
- npx nx-cloud start-ci-run
# Run any commands you want here
- lerna run lint --since=main & lerna run test --since=main & lerna run build --since=main
# Stop any run away agents
- npx nx-cloud stop-all-agents

El flujo del trabajo de agente es muy simple:

# Wait for tasks to execute
- npx nx-cloud start-agent

El trabajo principal se ve casi igual que si no usaras distribución. Lo único que necesitas hacer es invocar npx nx-cloud start-ci-run al inicio y opcionalmente invocar npx nx-cloud stop-all-agents al final.

Los trabajos de agentes ejecutan procesos de larga duración con start-agent que procesan todas las tareas asociadas a una ejecución CI. Lo único que necesitas para configurarlos es invocar npx nx-cloud start-agent. Este proceso continuará ejecutándose hasta que Nx Cloud le indique terminar.

Nota: Es crucial que el trabajo principal y los agentes tengan el mismo entorno y código fuente. Deben iniciarse aproximadamente al mismo tiempo. Además, cuando finalice el trabajo principal, todos los agentes se detendrán.

También es importante notar que un agente de Nx Cloud no es una máquina, sino un proceso de larga duración que se ejecuta en una máquina. Es decir, Nx Cloud no gestiona tus agentes; necesitas hacerlo en tu configuración de CI (consulta los ejemplos de CI arriba).

Nx Cloud actúa como orquestador. El trabajo principal indica a Nx Cloud qué deseas ejecutar, y Nx Cloud distribuirá esas tareas entre los agentes. Nx Cloud moverá automáticamente archivos entre agentes y desde los agentes hacia el trabajo principal.

El resultado final es que cuando, por ejemplo, lerna run build --since=main se completa en el trabajo principal, todos los artefactos de archivos creados en los agentes se copian al trabajo principal, como si este hubiera construido todo localmente.

Ejecución en Paralelo

--concurrency se propaga a los agentes. Por ejemplo, npx lerna run build --since=main --concurrency=3 --dte indica a Nx Cloud que ejecute hasta 3 objetivos de construcción en paralelo en cada agente. Si tienes 10 agentes, podrás ejecutar hasta 30 construcciones en paralelo en total.

También conviene ejecutar tantos comandos en paralelo como sea posible. Por ejemplo:

- lerna run lint --since=main
- lerna run test --since=main
- lerna run build --since=main

es menos eficiente que

- lerna run lint --since=main & lerna run test --since=main & lerna run build --since=main

El último enfoque programará los tres comandos simultáneamente. Si un agente no encuentra tareas de construcción, comenzará a ejecutar pruebas y lints. Esto mejora la utilización de agentes y reduce el tiempo de CI.

Repositorios y Ejemplos Relevantes