Wie eine Änderung in einer Zeile unsere Klonzeiten um 99 verringerte %

(Pinterest Engineering) (23. Oktober 2020)

Urvashi Reddy | Software Engineer, Engineering Productivity Team
Adam Berry | Technischer Leiter, Engineering Productivity Team
Rui Li | Software Engineer, Engineering Productivity Team

Das Engineering Productivity Team von Pinterest hat eine kleine Änderung festgestellt, die einen großen Einfluss auf die Verkürzung der Bauzeiten über Pipelines hinweg hatte. Wir haben festgestellt, dass das Festlegen der Option refspec während des Abrufs von Git unseren Klonierungsschritt um 99% reduziert hat.

Das Engineering Productivity-Team von Pinterest ist für die Unterstützung der Ingenieure verantwortlich, die Software im Unternehmen erstellen und bereitstellen. Unser Team unterhält eine Reihe von Infrastrukturdiensten und arbeitet häufig in großem Umfang. Dabei wird die gesamte Software auf Pinterest (nach Bazel) migriert und eine Continuous Delivery-Plattform mit dem Namen Hermez erstellt. und Aufrechterhaltung der Monorepos, die sich ein paar hundert Mal am Tag verpflichten, um nur einige zu nennen.

Alle unsere größeren Anstrengungen zielen darauf ab, das Ziel zu erreichen, die Softwareentwicklung und -bereitstellung bei Pinterest schnell zu gestalten und schmerzlose Erfahrung. Kürzlich wurden wir daran erinnert, wie kleine Details auch einen großen Einfluss auf dieses Ziel haben können. Wir haben eine übersehene Git-Option entdeckt, die die Erstellungszeiten in unseren Pipelines für die kontinuierliche Integration erheblich verkürzt. Um zu verstehen, wie sich diese kleine Änderung so stark ausgewirkt hat, müssen wir einige Informationen zu unseren Monorepos und Pipelines austauschen.

Monorepos und Pipelines

Wir haben sechs Haupt-Repositories bei Pinterest: Pinnwand, Optimus, Cosmos, Magnus, iOS und Android. Jedes ist ein Monorepo und beherbergt eine große Sammlung sprachspezifischer Dienstleistungen. Pinnwand ist so alt wie das Unternehmen und ist die größte Monorepo. Die Pinnwand hat mehr als 350 KB Commits und ist 20 GB groß, wenn sie vollständig geklont wird.

Das Klonen von Monorepos mit viel Code und Verlauf ist zeitaufwändig und muss in unserer kontinuierlichen Integration häufig im Laufe des Tages durchgeführt werden Pipelines. Allein für Pinboard führen wir an Werktagen mehr als 60.000 Git-Pulls durch. Die meisten unserer Jenkins-Pipeline-Konfigurationsskripte (in Groovy geschrieben) beginnen mit einer Checkout-Phase, in der wir das Repository klonen, das in den späteren Phasen erstellt und getestet wird. So sieht eine typische „Checkout“ -Stufe aus:

Wenn wir die Git-CLI direkt verwenden würden, würde dies bedeuten:

„ `

Obwohl wir Git anweisen, einen flachen Klon zu erstellen, keine Tags abzurufen und die letzten 50 Commits abzurufen, Wir führen diesen Vorgang immer noch nicht so schnell aus, wie wir könnten. Dies liegt daran, dass wir nicht die Option refspec festlegen. Beachten Sie, dass wir Git anweisen, alle Refspecs abzurufen, wenn Sie es nicht im Pipeline-Konfigurationsskript festlegen: + refs / Heads / *: refs / remotes / origin / *. Im Fall von Pinboard würde diese Operation mehr als 2.500 Zweige abrufen.

Durch einfaches Hinzufügen der Option refspec und Angabe der Refs, die uns wichtig sind (master In unserem Fall können wir die Refs auf den Zweig beschränken, der uns wichtig ist, und viel Zeit sparen. So sieht das in unserem Pipeline-Code aus:

Diese einfache Änderung in einer Zeile reduzierte unsere Klonzeiten um 99% und damit unsere Erstellungszeiten erheblich. Beim Klonen unseres größten Repos ging die Pinnwand von 40 Minuten auf 30 Sekunden. Es zeigt, dass unsere kleinen Anstrengungen manchmal auch große Auswirkungen haben können.

Erkenntnisse

Wie die meisten Entwicklerproduktivitätsteams arbeiten wir an großen Services, die einen großen Einfluss auf unsere tägliche Erfahrung haben. Es sind jedoch manchmal die Korrekturen in einer Zeile, die einen großen Unterschied machen können. Bei unserer Arbeit geht es darum, das zu verstehen.

Wenn Sie eine Leidenschaft für die Verbesserung der Entwicklerproduktivität haben, treten Sie unserem Team bei! Wir stellen in unserem Engineering Productivity-Team technische Funktionen ein.

Um mehr über Engineering bei Pinterest zu erfahren, besuchen Sie unser und besuchen Sie unser Pinterest Labs . Besuchen Sie unsere Karriere Seite, um offene Stellen anzuzeigen und zu beantragen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.