Una línea que hizo que la clonación fuera 100 veces más rápida

Nuestro equipo de optimización del rendimiento encontró un pequeño cambio que tuvo un gran impacto en la velocidad de construcción en todas las canalizaciones. Descubrimos que establecer el parámetro refspecen el tiempo git fetchacelera el paso de clonación en un factor de 100.



El grupo de productividad de ingeniería es responsable de apoyar a los ingenieros que crean e implementan software en Pinterest. Nuestro equipo respalda una variedad de servicios de infraestructura y, a menudo, trabaja en grandes proyectos: migrando todo el software a Bazel , creando una plataforma de entrega continua llamada Hermez . También admiten repositorios mono , donde envían varios cientos de confirmaciones todos los días, y esas no son todas sus tareas.



Trabajamos arduamente para que el desarrollo y la entrega de software en Pinterest sean rápidos y sencillos. Recientemente, la vida ha demostrado una vez más el gran impacto que puede tener hasta el más mínimo detalle. Encontramos un pequeño detalle en Git que redujo drásticamente los tiempos de construcción en nuestras canalizaciones de integración continua. Para comprender cómo este pequeño cambio tuvo un impacto tan grande, necesitamos compartir algo de información sobre nuestros monorrepositorios y tuberías.



Monorepositorios y transportadores



Tenemos seis repositorios principales en Pinterest: Pinboard, Optimus, Cosmos, Magnus, iOS y Android. Todos estos son mono-repositorios con una amplia gama de servicios específicos del idioma. Pinboard es el repositorio individual más grande mantenido desde la fundación de la empresa. Tiene más de 350k confirmaciones y tiene un tamaño de 20 GB cuando está completamente clonado.



Clonar un repositorio mono con mucho código y una larga historia lleva mucho tiempo, y en nuestras tuberías de integración continua tenemos que hacerlo con mucha frecuencia durante el día. Solo para Pinboard, de lunes a viernes fabricamos más de 60 mil artículos.git pull... La mayoría de los scripts de configuración de la canalización de Jenkins (escritos en Groovy) comienzan con el paso Checkout, donde clonamos el repositorio, que se construirá y probará en pasos posteriores. Así es como se ve una etapa de Checkout típica:







Si usa la CLI de Git directamente:







``

Incluso con la clonación incompleta / superficial, sin extraer ninguna etiqueta y solo para las últimas 50 confirmaciones, la operación aún no fue tan rápida como podría. Esto se debe a que no configuramos el parámetro refspec . Tenga en cuenta que la ausencia de este parámetro significa el comando para recuperar todas las especificaciones de referencia: + refs / heads / *: refs / remotes / origin / * . En el caso de Pinboard, se procesan más de 2.500 sucursales.



Simplemente agregando la opción refspec y especificando qué enlaces nos interesan (en nuestro caso, solo desde el maestro), puede limitar el alcance del procesamiento a la rama deseada y ahorrar mucho tiempo. Así es como se ve en nuestra tubería:







un simple cambio de una línea redujo el tiempo de clonación en 100 veces y, como resultado, redujo significativamente el tiempo de construcción. El tiempo de clonación para el repositorio de Pinboard más grande se ha reducido de 40 minutos a 30 segundos. Esto demuestra que, a veces, incluso el esfuerzo más pequeño marca una gran diferencia.



All Articles