Hur en radförändring minskade våra klontider med 99 %

(Pinterest Engineering) (23 okt 2020)

Urvashi Reddy | Software Engineer, Engineering Productivity Team
Adam Berry | Tech Lead, Engineering Productivity Team
Rui Li | Software Engineer, Engineering Productivity Team

Engineering Productivity-teamet på Pinterest stötte på en liten förändring som hade stor inverkan på att minska byggtiderna över rörledningar. Vi fann att inställningen av refspec-alternativet under git-hämtning minskade vårt kloningssteg med 99%.

Engineering Productivity-teamet på Pinterest ansvarar för att stödja ingenjörerna som bygger och distribuerar programvara på företaget. Vårt team underhåller ett antal infrastrukturtjänster och arbetar ofta med storskaliga insatser – migrerar all programvara på Pinterest (till Bazel) och skapar en kontinuerlig leveransplattform som heter Hermez , och upprätthålla (de) monorepos som engageras några hundra gånger om dagen, för att nämna några.

Alla våra större ansträngningar är utformade för att gå vidare med målet att göra programvaruutveckling och leverans på Pinterest snabbt och smärtfri upplevelse. Nyligen påmindes vi om hur små detaljer också kan ha stor inverkan på det målet. Vi upptäckte ett förbises Git-alternativ som avsevärt minskade byggtiderna i våra kontinuerliga integrationsledningar. För att förstå hur denna lilla förändring hade så stor inverkan, måste vi dela lite information om våra monorepos och våra rörledningar.

Monorepos och Pipelines

Vi har sex huvudförvar på Pinterest: Pinboard, Optimus, Cosmos, Magnus, iOS och Android. Var och en är en monorepo och rymmer en stor samling språkspecifika tjänster. Pinboard är lika gammalt som företaget och är det största monorepo. Pinboard har mer än 350 000 åtaganden och är 20 GB i storlek när det klonas helt.

Kloning av monorepos som har mycket kod och historia är tidskrävande, och vi måste göra det ofta hela dagen i vår kontinuerliga integration rörledningar. Endast för Pinboard gör vi mer än 60 000 git pulls på arbetsdagar. De flesta av våra Jenkins pipeline-konfigurationsskript (skrivna i Groovy) börjar med ett ”Checkout” -steg där vi klonar förvaret som de senare stegen kommer att bygga och testa. Så här ser ett typiskt ”Checkout” -stadium ut:

Om vi ​​använde Git CLI direkt skulle det översättas till:

Även om vi säger till Git att göra en grund klon, att inte hämta några taggar och att hämta de senaste 50 åtagandena, vi kör fortfarande inte den här åtgärden så snabbt som vi kunde vara. Det beror på att vi inte ställer in alternativet refspec . Observera att genom att inte ställa in det i pipeline-konfigurationsskriptet ber vi Git att hämta alla refspecs: + refs / heads / *: refs / remotes / origin / *. När det gäller Pinboard skulle den operationen hämta mer än 2500 grenar.

Genom att helt enkelt lägga till refspec-alternativet och ange vilka refs vi bryr oss om (master , i vårt fall) kan vi begränsa refs till den gren vi bryr oss om och spara mycket tid. Så här ser det ut i vår pipeline-kod:

Denna enkla ändring av en rad minskade våra klontider med 99% och minskade våra byggtider avsevärt som ett resultat. Kloning av vår största repo gick Pinboard från 40 minuter till 30 sekunder. Det visar att ibland våra små ansträngningar också kan ha stor inverkan.

Läranden

Som de flesta produktivitetsteam för utvecklare arbetar vi med stora tjänster som har stor inverkan på vår dagliga upplevelse. Ibland är det dock de ena raden som kan göra en enorm skillnad. Vårt arbete handlar om att förstå det.

Om du har en passion för att förbättra utvecklarens produktivitet, gå med i vårt team! Vi anställer för ingenjörsroller i vårt Engineering Productivity-team.

För att lära dig mer om Engineering på Pinterest, kolla in vårt och besök vårt Pinterest Labs webbplats. För att se och ansöka om öppna möjligheter, besök vår Karriär sida.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *