Jak zmiana o jedną linię zmniejszyła czas klonowania o 99 %

(Pinterest Engineering) (23 października 2020 r.)

Urvashi Reddy | Inżynier oprogramowania, zespół inżynierów ds. Produktywności
Adam Berry | Kierownik ds. Technicznych, zespół ds. Produktywności inżynierów
Rui Li | Inżynier oprogramowania, zespół inżynierów ds. Produktywności

Zespół inżynierów ds. Produktywności na Pinterest napotkał niewielką zmianę, która miała duży wpływ na skrócenie czasu kompilacji w potokach. Okazało się, że ustawienie opcji refspec podczas pobierania git zmniejszyło nasz krok klonowania o 99%.

Zespół Engineering Productivity na Pinterest jest odpowiedzialny za wspieranie inżynierów, którzy budują i wdrażają oprogramowanie w firmie. Nasz zespół utrzymuje szereg usług infrastrukturalnych i często pracuje na dużą skalę – przenosząc całe oprogramowanie na Pinterest (do Bazel), tworząc platformę Continuous Delivery o nazwie Hermez , i utrzymywanie (tych) monorepozytów, które angażują się kilkaset razy dziennie, żeby wymienić tylko kilka.

Wszystkie nasze większe wysiłki mają na celu przyspieszenie tworzenia i dostarczania oprogramowania na Pinterest i bezbolesne doświadczenie. Niedawno przypomniano nam, jak drobne szczegóły mogą mieć duży wpływ na ten cel. Odkryliśmy przeoczoną opcję Git, która znacznie skróciła czas kompilacji w naszych potokach ciągłej integracji. Aby zrozumieć, w jaki sposób ta niewielka zmiana miała tak duży wpływ, musimy udostępnić trochę informacji na temat naszych monorepozycji i naszych potoków.

Monorepos i rurociągi

Na Pinterest mamy sześć głównych repozytoriów: Pinboard, Optimus, Cosmos, Magnus, iOS i Android. Każdy z nich jest monorepo i zawiera duży zbiór usług specyficznych dla języka. Tablica korkowa jest tak stara jak firma i jest największym monorepo. Pinboard ma ponad 350 000 zatwierdzeń i ma rozmiar 20 GB po całkowitym sklonowaniu.

Klonowanie monoreposów, które mają dużo kodu i historii, jest czasochłonne i musimy to robić często przez cały dzień w naszej ciągłej integracji rurociągi. W przypadku samego Pinboard wykonujemy ponad 60 000 pobrań w dni robocze. Większość naszych skryptów konfiguracyjnych potoku Jenkinsa (napisanych w Groovy) zaczyna się od etapu „Checkout”, w którym klonujemy repozytorium, które później zbudujemy i przetestujemy. Oto jak wygląda typowy etap „Do kasy”:

Gdybyśmy używali interfejsu wiersza polecenia Git bezpośrednio, przełożyłoby się to na:

„ `

Mimo że mówimy Gitowi, aby wykonał płytki klon, nie pobierał żadnych tagów i pobierał ostatnie 50 zatwierdzeń, my nadal nie wykonujemy tej operacji tak szybko, jak byśmy mogli. Dzieje się tak, ponieważ nie ustawiamy opcji refspec . Zwróć uwagę, że nie ustawiając tego w skrypcie konfiguracyjnym potoku, mówimy Gitowi, aby pobierał wszystkie refspecs: + refs / heads / *: refs / remotes / origin / *. W przypadku Pinboard, ta operacja pobrałaby ponad 2500 gałęzi.

Po prostu dodając opcję refspec i określając, na których referencjach nam zależy (master w naszym przypadku) możemy ograniczyć referencje do branży, na której nam zależy i zaoszczędzić sporo czasu. Oto jak to wygląda w naszym kodzie potoku:

Ta prosta zmiana w jednej linii skróciła czas klonowania o 99% iw rezultacie znacznie skróciła czas kompilacji. Klonując nasze największe repozytorium, Pinboard przeszedł z 40 minut do 30 sekund. To pokazuje, że czasami nasze małe wysiłki mogą mieć również duży wpływ.

Nauka

Podobnie jak większość zespołów programistycznych, pracujemy nad dużymi usługami, które mają duży wpływ na nasze codzienne doświadczenia. Jednak czasami to jedna linia naprawcza może mieć ogromne znaczenie. Nasza praca polega na zrozumieniu tego.

Jeśli pasjonujesz się zwiększaniem produktywności programistów, dołącz do naszego zespołu! Zatrudniamy na stanowiska inżynieryjne w naszym zespole ds. Produktywności inżynierów.

Aby dowiedzieć się więcej o inżynierii na Pinterest, sprawdź nasze i odwiedź nasze Pinterest Labs site. Aby wyświetlić otwarte oferty pracy i aplikować na nie, odwiedź naszą stronę Kariera .

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *