Eine Zeile, die das Klonen 100-mal schneller machte

Unser Team für Leistungsoptimierung hat eine kleine Änderung festgestellt, die einen großen Einfluss auf die Build-Geschwindigkeit in allen Pipelines hatte. Wir haben festgestellt, dass das refspeczeitliche Einstellen des Parameters git fetchden Klonierungsschritt um den Faktor 100 beschleunigt.



Die Engineering Productivity Group ist verantwortlich für die Unterstützung von Ingenieuren, die Software auf Pinterest erstellen und bereitstellen. Unser Team unterstützt eine Reihe von Infrastrukturdiensten und arbeitet häufig an großen Projekten. Dabei wird die gesamte Software auf Bazel migriert und eine kontinuierliche Bereitstellungsplattform namens Hermez erstellt . Sie unterstützen auch Monorepositories , in denen sie täglich mehrere hundert Commits senden, und das sind nicht alle ihre Aufgaben.



Wir arbeiten hart daran, die Softwareentwicklung und -bereitstellung auf Pinterest schnell und schmerzlos zu gestalten. In letzter Zeit hat das Leben erneut gezeigt, welchen Einfluss selbst kleinste Details haben können. Wir haben in Git ein kleines Detail gefunden, das die Erstellungszeiten in unseren Pipelines für die kontinuierliche Integration drastisch verkürzt hat. Um zu verstehen, wie sich diese kleine Änderung so stark ausgewirkt hat, müssen wir einige Informationen über unsere Monorepositories und Pipelines austauschen.



Monorepositories und Förderer



Wir haben sechs Haupt-Repositories auf Pinterest: Pinnwand, Optimus, Cosmos, Magnus, iOS und Android. All dies sind Monorepositories mit einer breiten Palette sprachspezifischer Dienste. Pinboard ist das größte einzelne Repository, das seit der Gründung des Unternehmens unterhalten wurde. Es hat über 350.000 Commits und ist 20 GB groß, wenn es vollständig geklont ist.



Das Klonen eines Mono-Repositorys mit viel Code und einer langen Historie nimmt viel Zeit in Anspruch, und in unseren Pipelines für die kontinuierliche Integration müssen wir dies tagsüber sehr oft tun. Allein für die Pinnwand stellen wir an Wochentagen mehr als 60.000 Artikel her.git pull... Die meisten Jenkins-Pipeline-Konfigurationsskripte (in Groovy geschrieben) beginnen mit dem Checkout-Schritt, in dem wir das Repository klonen, das in späteren Schritten erstellt und getestet wird. So sieht eine typische Checkout-Phase aus:







Wenn Sie die Git-CLI direkt verwenden:







``

Selbst bei unvollständigem / flachem Klonen, ohne Extrahieren von Tags und nur für die letzten 50 Commits ging der Vorgang immer noch nicht so schnell wie möglich. Dies liegt daran, dass wir den Parameter refspec nicht festgelegt haben . Beachten Sie, dass das Fehlen dieses Parameters den Befehl zum Abrufen aller Referenzspezifikationen bedeutet: + refs / Heads / *: refs / remotes / origin / * . Bei Pinboard werden über 2.500 Filialen bearbeitet.



Durch einfaches Hinzufügen der Option refspec und Angabe der Links, an denen wir interessiert sind (in unserem Fall nur vom Master), können Sie den Verarbeitungsumfang auf den gewünschten Zweig beschränken und viel Zeit sparen. So sieht es in unserer Pipeline aus:







Eine einfache Änderung in einer Zeile reduzierte die Klonzeit um den Faktor 100 und damit die Erstellungszeit erheblich. Die Klonzeit für das größte Pinboard-Repository wurde von 40 Minuten auf 30 Sekunden reduziert. Dies zeigt, dass manchmal schon der kleinste Aufwand einen großen Unterschied macht.



All Articles