Hvordan en endring av en linje reduserte klonetiden med 99 %

(Pinterest Engineering) (23. okt 2020)

Urvashi Reddy | Programvareingeniør, Engineering Productivity Team
Adam Berry | Teknisk leder, teknisk produktivitetsteam
Rui Li | Programvareingeniør, Engineering Productivity Team

Engineering Productivity-teamet på Pinterest kom over en liten endring som hadde stor innvirkning på å redusere byggetider på tvers av rørledninger. Vi fant ut at innstilling av alternativet refspec under git-henting reduserte kloningstrinnet vårt med 99%.

Engineering Productivity-teamet hos Pinterest er ansvarlig for å støtte ingeniørene som bygger og distribuerer programvare hos selskapet. Teamet vårt vedlikeholder en rekke infrastrukturtjenester og jobber ofte med storskala innsats – migrering av all programvare på Pinterest (til Bazel), og skaper en kontinuerlig leveringsplattform kalt Hermez , og vedlikeholde (monorepoene) som blir forpliktet til noen hundre ganger om dagen, for å nevne noen.

Alle våre større anstrengelser er designet for å komme videre med målet om å gjøre programvareutvikling og levering på Pinterest raskt og smertefri opplevelse. Nylig ble vi påminnet om hvordan små detaljer også kan ha stor innvirkning på det målet. Vi oppdaget et oversett Git-alternativ som reduserte byggetider i våre kontinuerlige integrasjonsrørledninger betydelig. For å forstå hvordan denne lille endringen hadde så stor innvirkning, må vi dele litt informasjon om våre monorepos og våre 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 av språkspesifikke tjenester. Pinboard er like gammel som selskapet og er den største monorepo. Pinboard har mer enn 350 000 forpliktelser og er 20 GB i størrelse når den klones fullstendig.

Kloning av monorepos som har mye kode og historie er tidkrevende, og vi trenger å gjøre det ofte hele dagen i vår kontinuerlige integrasjon. rørledninger. For Pinboard alene gjør vi mer enn 60 000 git-trekk på virkedager. De fleste av Jenkins-pipeline-konfigurasjonsskriptene våre (skrevet i Groovy) starter med en «Checkout» -fase hvor vi kloner depotet som de senere trinnene vil bygge og teste. Slik ser en typisk «Checkout» -fase ut:

Hvis vi brukte Git CLI direkte, ville det oversettes til:

«

Selv om vi ber Git om å gjøre en grunne klon, ikke hente noen koder og hente de siste 50 forpliktelsene, vi kjører fortsatt ikke denne operasjonen så fort vi kunne være. Det er fordi vi ikke setter alternativet refspec . Legg merke til at ved å ikke sette det i pipeline-konfigurasjonsskriptet, ber vi Git om å hente alle refspecs: + refs / heads / *: refs / remotes / origin / *. Når det gjelder Pinboard, vil den operasjonen hente mer enn 2500 grener.

Ved å bare legge til alternativet refspec og spesifisere hvilke refs vi bryr oss om (master , i vårt tilfelle), kan vi begrense refs til grenen vi bryr oss om og spare mye tid. Slik ser det ut i rørledningskoden vår:

Denne enkle endringen av en linje reduserte klonetiden vår med 99% og reduserte byggetidene våre betydelig. Ved å klone vår største repo gikk Pinboard fra 40 minutter til 30 sekunder. Det viser at noen ganger også vår lille innsats kan ha stor innvirkning.

Lærdommer

Som de fleste produktivitetsteam for utviklere, jobber vi med store tjenester som har stor innvirkning på vår daglige opplevelse. Imidlertid er det noen ganger de eneste linjene som kan gjøre en stor forskjell. Vårt arbeid handler om å forstå det.

Hvis du har en lidenskap for å forbedre utviklerens produktivitet, kan du bli med på teamet vårt! Vi ansetter for ingeniørroller i Engineering Productivity-teamet vårt.

For å lære mer om Engineering på Pinterest, sjekk ut og besøk Pinterest Labs nettsted. For å se og søke om åpne muligheter, besøk Karriere siden.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *