/ / Przyspieszanie budowania Jenkinsa - node.js, git, amazon-web-services, jenkins, npm

Przyspieszenie budowy Jenkinsa - node.js, git, amazon-web-services, jenkins, npm

Mam aplikację NodeJs. Mam pracę Jenkinsa, która wykonuje gollowing:

  • Czy klon git
  • Uruchamia instalację NPM
  • Uruchamia testy
  • Gzipuje wszystkie pliki html, css, js
  • Wysyła statyczną zawartość do S3 przy użyciu synchronizacji aws
  • Gzipuje niestatyczną zawartość, aby później mogła zostać wdrożona w naszym środowisku scenicznym.

Szukam sposobów na ulepszenie budowy. Niektóre z moich pomysłów

  • Może buforowanie modułów węzła i nie uruchamianie instalacji npm za każdym razem
  • Używanie artefaktu jako pamięci lokalnego modułu węzła
  • Uruchamianie poleceń synchronizacji aws równolegle
  • Korzystanie z polecenia s3cmd zamiast zsynchronizowania (mamy problem z tym, że synchronizacja zss przesyła te same pliki do S3, ponieważ klon git zmienia czas modyfikacji plików)
  • Użyj git diff, aby uzyskać listę plików, które uległy zmianie, i tylko wysyłaj te pliki do S3

Czy jest coś jeszcze, co mogę zrobić, aby poprawić czas budowy?

Odpowiedzi:

4 dla odpowiedzi № 1

Kilka dobrych pomysłów - oto, co bym rozważył:

Po pierwsze, spróbuj zmierzyć jak długo każdy krok (klonowanie, npm install, uruchom testy, ...), a następnie spróbuj pracować nad ulepszaniem każdego kroku. Możesz albo skupić się na tym, który zajmuje większość czasu, albo możesz spróbować go zdobyć szybkie zwycięstwo przed próbą złamania twardszych orzechów.

Jakieś pomysły:

  • Czy musisz zrobić git clone każdego razu? Może rozważyć zrobienie git pull zamiast. Pod koniec kompilacji wykonaj git reset --hard ; git clean -f -d jako ostatni krok do pozbycia się wszelkich niezatwierdzonych lub lokalnie zmienionych plików. Zauważyłem, że robienie tego jest o wiele szybsze niż wykonanie pełnego git clone każdego razu.
  • npm install: Zgodnie z powyższym krokiem, jeśli zatrzymasz node_modules folder z poprzedniej kompilacji, ten krok powinienbyć także szybszym. Istnieje oczywiście ryzyko aktualizacji lub usuniętych zależności, które nadal będą się utrzymywać. Wiele zmian w kodzie nie wymaga ponownej instalacji wszystkich modułów węzła. Może się nawet zdarzyć, że wprowadzi się trochę logiki, która wykrywa, czy package.json plik zmienił się od czasu ostatniej kompilacji i uruchamia tylko pełną npm install w tym wypadku.
  • Rozwiązałem powyższe, wykonując nocną kompilację, która wykonuje pełną, czystą kompilację: Świeżą git clone i pełne npm install raz dziennie. Wszystkie inne kompilacje w ciągu dnia używają poprzedniego stanu kompilacji i są o wiele szybsze w wyniku tego. Jeśli okaże się, że prowadzi to do złych wyników, możesz zaplanować czystą kompilację, aby działała kilka razy dziennie.
  • Dostrój s3cmdKomenda / aws - Myślę, że mogą działać w podobny sposób jak rsync, która może być naprawdę szybka i efektywna, jeśli jest używana we właściwy sposób. Tylko spróbuj git diff trasa w ostateczności. Robiąc git pull zamiast git clone może już rozwiązać ten problem.
  • Ogólnie spróbuj zrozumieć, czy wszystkiekroki należy uruchamiać przy każdej kompilacji lub czy można przenieść niektóre z nich do innych planów budowy lub do innych okien czasowych (w nocy?). Jeśli twoim głównym celem planu budowy jest uruchomienie testów jednostkowych, aby dać szybką informację zwrotną dla programistów, to może nie musisz za każdym razem zamykać / kopiować / wdrażać aplikacji, lub podzielić ją na dwa plany kompilacji, jeden uruchamia testy i zwraca szybko, a drugi wykonuje całe wdrożenie. Posiadanie tego w osobnych planach kompilacji pozwoli Ci być elastycznym z harmonogramem.

Oto kilka wstępnych pomysłów, które wypróbowałem jako pierwszy krok.


1 dla odpowiedzi nr 2

Wykonanie płytkiego klonu przyspiesza klonowanie. Ponieważ nie pobiera wszystkich zatwierdzeń.

git clone --depth 1 clone_url...

Powinieneś mieć możliwość buforowania node_modules z tą wtyczką: https://plugins.jenkins.io/jobcacher