De acuerdo con la Documentación de GitLab para caché frente a artefactos, los node_modules deben almacenarse como caché en lugar de un artefacto. El problema con esto es que si hay varios corredores y un corredor diferente del que creó la "compilación" selecciona un trabajo, entonces el caché ( node_modules ) no existirá, lo que fallará en el GitLab CI aleatoriamente (si el mismo corredor pasa a hacer el resto de los trabajos entonces tendrá éxito).
Podría hacerlo para que todo se haga en un solo trabajo, pero una vez que tenga que implementarlo, este problema volverá a ocurrir. Otra opción es etiquetarlo para que solo un corredor específico complete el trabajo, pero siento que eso es lento.
Después de investigar, me di cuenta de que podía poner node_modules como un artefacto en lugar del caché y se recuperará sin importar qué corredor ejecute el trabajo, pero no puedo encontrar ninguna documentación sobre si esto es malo o no.
Entonces, ¿está bien poner node_modules como un artefacto? Si es así, ¿por qué la gente no lo pondría como un artefacto normalmente (suponiendo que agreguen un vencimiento)?
La respuesta corta aquí es que puede usar la herramienta como quiera. Absolutamente puede usar artefactos para node_modules. Sin embargo, también hay una manera de hacer que el caché funcione.
De forma predeterminada, cuando un ejecutor almacena en caché un archivo o directorio, lo almacena localmente en el host que ejecuta ese ejecutor (por lo que no está disponible en otros ejecutores). Sin embargo, en la configuración del corredor, puede cambiar esto para almacenar objetos en caché en AWS S3 o un repositorio similar a S3 (como Minio). Si todos los ejecutores están configurados de esta manera, o al menos 2 lo están, entonces esos ejecutores también pueden usar los mismos elementos almacenados en caché.
Puede leer sobre las opciones de configuración de caché del corredor aquí: https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runnerscache-section
Puede leer sobre Minio (una solución de almacenamiento de código abierto que proporciona una interfaz API S3) aquí: https://docs.min.io/