Une ligne qui a rendu le clonage 100 fois plus rapide

Notre équipe d'optimisation des performances a découvert un petit changement qui a eu un impact important sur la vitesse de construction dans tous les pipelines. Nous avons constaté que la définition du paramètre refspecau moment git fetchaccélère l'étape de clonage d'un facteur 100.



Le groupe Productivité de l'ingénierie est chargé de soutenir les ingénieurs qui créent et déploient des logiciels sur Pinterest. Notre équipe prend en charge une gamme de services d'infrastructure et travaille souvent sur de grands projets - migrant tous les logiciels vers Bazel , créant une plate-forme de livraison continue appelée Hermez . Ils prennent également en charge les mono-référentiels , où ils envoient plusieurs centaines de commits chaque jour, et ce n'est pas toutes leurs tâches.



Nous travaillons dur pour rendre le développement et la livraison de logiciels sur Pinterest rapides et faciles. Récemment, la vie a montré une fois de plus quel impact même le plus petit détail peut avoir. Nous avons trouvé un petit détail dans Git qui a considérablement réduit les temps de construction dans nos pipelines d'intégration continue. Pour comprendre comment ce petit changement a eu un si grand impact, nous devons partager des informations sur nos monorépôts et nos pipelines.



Monorépôts et convoyeurs



Nous avons six référentiels principaux sur Pinterest: Pinboard, Optimus, Cosmos, Magnus, iOS et Android. Ce sont tous des mono-référentiels avec une large gamme de services spécifiques aux langues. Pinboard est le plus grand référentiel unique conservé depuis la fondation de l'entreprise. Il a plus de 350k commits et fait 20 Go lorsqu'il est entièrement cloné.



Le clonage d'un référentiel mono avec beaucoup de code et une longue histoire prend beaucoup de temps, et dans nos pipelines d'intégration continue, nous devons le faire très souvent pendant la journée. Rien que pour Pinboard, nous fabriquons plus de 60 000 articles en semaine.git pull... La plupart des scripts de configuration du pipeline Jenkins (écrits en Groovy) commencent par l'étape Checkout, où nous clonons le référentiel, qui sera construit et testé dans les étapes ultérieures. Voici à quoi ressemble une étape de paiement typique:







Si vous utilisez directement la CLI Git:







``

Même avec un clonage incomplet / superficiel, sans extraire de balises et uniquement pour les 50 derniers commits, l'opération ne s'est toujours pas déroulée aussi vite qu'elle le pouvait. C'est parce que nous n'avons pas défini le paramètre refspec . Notez que l'absence de ce paramètre signifie la commande pour récupérer toutes les refspecs: + refs / heads / *: refs / remotes / origin / * . Dans le cas du Pinboard, plus de 2 500 succursales sont traitées.



En ajoutant simplement l'option refspec et en spécifiant les liens qui nous intéressent (dans notre cas, uniquement à partir du maître), vous pouvez limiter la portée du traitement à la branche souhaitée et gagner beaucoup de temps. Voici à quoi cela ressemble dans notre pipeline:







Un simple changement d'une ligne a réduit le temps de clonage de 100x et, par conséquent, considérablement réduit le temps de construction. Le temps de clonage du plus grand référentiel Pinboard a été réduit de 40 minutes à 30 secondes. Cela montre que parfois même le moindre effort fait une énorme différence.



All Articles