Hvordan en ændring af en linje reducerede vores klontider med 99 %

(Pinterest Engineering) (23. oktober 2020)

Urvashi Reddy | Softwareingeniør, Engineering Productivity Team
Adam Berry | Tech Lead, Engineering Productivity Team
Rui Li | Softwareingeniør, Engineering Productivity Team

Engineering Productivity-teamet på Pinterest stødte på en lille ændring, der havde stor indflydelse på at reducere byggetider på tværs af rørledninger. Vi fandt ud af, at indstilling af refspec-indstillingen under git-hentning reducerede vores kloningstrin med 99%.

Engineering Productivity-teamet hos Pinterest er ansvarlig for at støtte de ingeniører, der bygger og implementerer software hos virksomheden. Vores team vedligeholder en række infrastrukturtjenester og arbejder ofte med storskala indsats – migrering af al software på Pinterest (til Bazel) og skaber en kontinuerlig leveringsplatform kaldet Hermez , og vedligeholde (de) monorepoer, der bliver forpligtet til et par hundrede gange om dagen, for at nævne nogle få.

Alle vores større bestræbelser er designet til at gøre fremskridt med målet om at gøre softwareudvikling og levering hos Pinterest hurtigt og smertefri oplevelse. For nylig blev vi mindet om, hvordan små detaljer også kan have stor indflydelse på dette mål. Vi opdagede en overset Git-mulighed, der reducerede byggetiderne i vores kontinuerlige integrationsrørledninger markant. For at forstå, hvordan denne lille ændring havde så stor indflydelse, er vi nødt til at dele lidt information om vores monorepos og vores rørledninger.

Monorepos og Pipelines

Vi har seks hovedlagre på Pinterest: Pinboard, Optimus, Cosmos, Magnus, iOS og Android. Hver enkelt er en monorepo og huser en stor samling af sprogspecifikke tjenester. Pinboard er lige så gammel som virksomheden og er den største monorepo. Pinboard har mere end 350K forpligtelser og er 20 GB i størrelse, når den klones fuldt ud.

Kloning af monorepos, der har meget kode og historie, er tidskrævende, og vi er nødt til at gøre det ofte hele dagen i vores kontinuerlige integration rørledninger. For Pinboard alene udfører vi mere end 60K git pulls på hverdage. De fleste af vores Jenkins pipeline-konfigurationsskripter (skrevet i Groovy) starter med en “Checkout” -fase, hvor vi kloner lageret, som de senere faser vil bygge og teste. Sådan ser en typisk “Checkout” -fase ud:

Hvis vi brugte Git CLI direkte, ville det oversættes til:

Selvom vi beder Git om at lave en lav klon, ikke hente nogen tags og hente de sidste 50 forpligtelser, vi kører stadig ikke denne operation så hurtigt som vi kunne være. Det skyldes, at vi ikke indstiller indstillingen refspec . Bemærk, at ved ikke at indstille det i pipeline-konfigurationsscriptet, fortæller vi Git at hente alle refspecs: + refs / heads / *: refs / remotes / origin / *. I tilfælde af pinboard ville denne operation hente mere end 2.500 grene.

Ved blot at tilføje refspec-indstillingen og angive, hvilke refs vi holder af (master , i vores tilfælde), kan vi begrænse refs til den gren, vi holder af, og spare meget tid. Sådan ser det ud i vores pipeline-kode:

Denne enkle ændring af en linje reducerede vores klonetider med 99% og reducerede vores byggetider betydeligt som et resultat. Ved at klone vores største repo gik Pinboard fra 40 minutter til 30 sekunder. Det viser, at nogle gange også vores lille indsats kan have stor indflydelse.

Læring

Som de fleste team med udviklerproduktivitet arbejder vi på store tjenester, der har stor indflydelse på vores daglige oplevelse. Imidlertid er det undertiden den ene linjefixing, der kan gøre en enorm forskel. Vores arbejde handler om at forstå det.

Hvis du har en passion for at forbedre udviklerens produktivitet, skal du deltage i vores team! Vi ansætter til ingeniørroller i vores Engineering Productivity-team.

For at lære mere om Engineering på Pinterest, se vores og besøg vores Pinterest Labs site. For at se og ansøge om åbne muligheder, besøg vores Karriere side.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *