Skalowanie i optymalizacja CI/CD

Wdrażanie przepływu pracy CI/CD do tworzenia aplikacji staje się coraz bardziej popularne. Jednocześnie jednak skalowanie i optymalizacja CI/CD stanowi wyzwanie.

Dzisiaj omówimy, czym jest to wyzwanie i dokładnie zbadamy, w jaki sposób możemy skalować i optymalizować CI/CD. Więc podążaj dalej!

Obecnie tworzenie aplikacji odbywa się zwykle w zespołach składających się z kilku programistów. Każda osoba lub zespół ma swoją rolę w projekcie, rozwijając swoją dedykowaną część.

Następnie znajdujemy się na końcu projektu z kilkoma fragmentami kodu do skompilowania. W zależności od metod pracy każdego z nas, na zarządzanie tą integracją można zmarnować dużo czasu.

CI/CD, Continuous Integration oraz Continuous Delivery/Deployment to rozwiązanie tego problemu, które zapewnia udostępnianie aktualizacji bez zbędnych opóźnień i konfliktów. Rozumiemy ten proces.

Ciągła integracja

CI lub Continuous Integration grupuje procesy mające na celu ciągłe publikowanie zmian w kodzie i dodatków do współdzielonej gałęzi projektu. Umożliwia testowanie kodu oraz wprowadzanie ulepszeń i zmian w czasie rzeczywistym. Celem jest przetestowanie każdego elementu poprzez stworzenie testów.

Ta trwała miara pozwala nie sprawdzać wszystkiego w jednym bloku na końcu i uniknąć pracy na zbyt wielu elementach jednocześnie. Wykonywanie testów jednostkowych jest zatem bardzo przydatne, aby to zapewnić. Dzięki temu łatwiej jest wykryć błędy, zapewniając, że kod dobrze się kompiluje i nie tworzy regresji.

Ciągła dostawa

Ciągłe dostarczanie lub CD łączy ciągłą integrację i testowanie, które można łączyć w kontenery i wprowadzać do produkcji. Oznacza to, że gromadzi te kody i wykonane testy i wprowadza je do produkcji za pomocą automatyzacji.

Nawet jeśli wymaga ludzkiego działania, zostaje zautomatyzowana, umieszczając wszystko, co zostało zrobione „na antenie”, w sposób zintegrowany i kompletny. Konkretnie, dzięki ciągłej dystrybucji, nasza aplikacja jest rozwijana tak, aby można ją było wprowadzić do produkcji, bez względu na to, kiedy.

Ciągłe wdrażanie

Chociaż koncepcje ciągłego dostarczania i ciągłego wdrażania są podobne, istnieją różnice. Jeśli ich cel jest taki sam, to znaczy wdrożenie aplikacji w produkcji, środki do jego osiągnięcia są różne. Tym, co oddziela ciągłe dostarczanie od ciągłego wdrażania, jest wersja.

Rzeczywiście, ciągłe wdrażanie umożliwia bezpośrednie wdrożenie każdej modyfikacji, która przechodzi przez różne etapy naszego potoku. W przypadku ciągłego dostarczania niezbędny jest etap weryfikacji przez człowieka, aby wdrożenie miało miejsce.

Skalowanie CI/CD

Gdy liczba mikrousług wzrasta, skalowanie CI/CD staje się prawie nieuniknione. Zwiększona liczba mikroserwisów powoduje, że różne potoki są podłączone do jednego repozytorium git, co zwiększa obciążenie serwera CI i obniża wydajność.

Aby skalować CI/CD, konieczne jest stworzenie znormalizowanego i zautomatyzowanego procesu rozwoju dla wszystkich zespołów, a stamtąd zapewnienie jakości dostaw poszczególnych deweloperów i zespołów. Ułatwia również zarządzanie rurociągiem.

Skalowanie można osiągnąć poprzez zdefiniowanie procesu CI do wykonywania testów jednostkowych i walidacji jakości dostarczonego kodu.

Następnie następuje proces budowania obrazów i wdrażania ich w środowiskach w sposób ciągły na płycie CD, a następnie definiowanie procesu budowania obrazów i wdrażania ich w środowisku produkcyjnym.

Kroki do skalowania CI/CD

Pierwszym krokiem jest uzgodnienie rurociągu z architektami, z udziałem liderów zespołów. Podąża za mapowaniem gałęzi Git na środowiska (develop -> development i master -> [homologation and production]). Następnie następuje uruchomienie zadania CI przy każdym żądaniu ściągnięcia i zadania CD przy każdej zmianie w mapowanych gałęziach.

Strumień zadań można utworzyć dla śledzenia zarówno CI, jak i CD.

Przepływ pracy CI rozwija się w 7 krokach:

  • Zapoznaj się z gałęzią źródłową i docelową żądania ściągnięcia;
  • Sprawdza, czy scalanie nie zawiera konfliktów wymagających ręcznego rozwiązania;
  • Uruchom testy jednostkowe;
  • Zbuduj pakiet, aby zweryfikować integralność i czy kod jest kompilowalny;
  • Weryfikacja jakości kodu wyzwalania;
  • Zwiększ i zatwierdź wersję projektu do gałęzi źródłowej;
  • Powiadom repozytorium Git żądania ściągnięcia o powodzeniu lub niepowodzeniu za pomocą wywołania Webhook lub interfejsu API Rest (repozytorium Git).

Przepływ zadań CD przebiega według następującej ścieżki:

  • Powiadomiona gałąź jest wyrejestrowana.
  • Artefakt jest budowany przy użyciu konkretnego narzędzia do budowania projektu, nad którym pracujemy.
  • Po pojawieniu się artefaktu projekty biblioteczne są wysyłane do Nexusa w celu przechowywania artefaktu, a przepływ zostaje zakończony.

Przeprowadzane są następujące działania:

Krok 1: Obraz platformy Docker jest tworzony dla wygenerowanego artefaktu, stosując wersję artefaktu do obrazu platformy Docker.

Krok 2: Obraz zostanie przesłany do rejestru platformy Docker.

Krok 3: Wdrożenie poprzez wdrożenie obrazu za pośrednictwem Kubernetes.

W przypadku projektów aplikacji, które znajdują się w środowisku zatwierdzania/produkcyjnym, wykonaj kroki 1 i 2 powyżej, a następnie:

  • Wdrażaj poprzez wdrażanie obrazów za pośrednictwem Kubernetes w środowisku zatwierdzania;
  • Zadanie ma przerwę na oczekiwanie na zatwierdzenie wdrożenia do produkcji;
  • Po zatwierdzeniu obraz, który jest zatwierdzany, jest promowany do produkcji;
  • W przeciwnym razie wycofuje obraz w zatwierdzeniu.

Optymalizacja CI/CD

CI/CD usprawnia cykl rozwoju aplikacji i rozwiązuje problem spowodowany integracją nowego kodu i zwiększeniem częstotliwości dostarczania.

Poniżej przedstawiono sposoby dalszej optymalizacji wykorzystania CI/CD:

Priorytetowo naprawiaj uszkodzoną kompilację

Gdy kompilacja się zepsuje, naprawienie jej powinno być priorytetem zespołu. Jeśli kompilacji nie można naprawić w ciągu kilku minut, zespół musi zdecydować, czy usunąć kod, czy wyłączyć flagę funkcji.

Ideą naprawiania uszkodzonej kompilacji jest to, że kompilacja zawsze będzie generować działający kod, który można wydać.

Małe częste wdrożenia

Ogólnie rzecz biorąc, stabilność aplikacji jest zagrożona przy każdym wdrożeniu. Dlatego staramy się oddalać od siebie wdrożenia. Problem w tym podejściu polega na tym, że kumulujemy zbyt wiele zmian. Jedna z tych zmian może się nie udać, zmuszając nas do wycofania innych, które działały.

Zastosuj wzór dusiciela i przełam skomplikowane zmiany na małe i proste. Jeśli wdrażasz częściej i pracujesz w małych partiach, ryzyko wdrożenia jest mniejsze.

Zautomatyzuj testy QA w celu ograniczenia ryzyka

Prawdopodobnie wszyscy byliśmy zaangażowani w scenariusz „Pracowałem na moim lokalnym komputerze”, ponieważ lokalne środowiska programistyczne często się różnią. Może istnieć wiele różnych rzeczy między twoim lokalnym środowiskiem a miejscem, w którym wchodzisz na produkcję. Możesz zoptymalizować CI/CD, automatyzując zadania zapewniania jakości (QA), takie jak testowanie przeglądarki, zmniejszając ryzyko pojawienia się błędu w działającej aplikacji.

Zaufaj automatycznym testom

Aby sprawdzić, kiedy programista integruje nowy kod, CI opiera się na zautomatyzowanym i niezawodnym zestawie testów. Jeśli potrzebujesz skompilować kod, pierwszym testem jest to, że się kompiluje. Następnie możesz dodać tyle testów, ile uznasz za krytyczne.

Ile testów należy uwzględnić? Aby to ustalić, pamiętaj, że celem CI jest dostarczenie informacji zwrotnej tak szybko, jak to możliwe. Jeśli programista musi czekać godzinę na otrzymanie opinii, to nie zadziała. Zawsze będziesz tęsknić, ale kiedy zauważysz błąd w środowisku produkcyjnym, stwórz przypadek testowy i dołącz go do pętli CI.

Zawsze bierz pod uwagę bezpieczeństwo

Rozważ bezpieczeństwo narzędzia CI/CD, ponieważ integruje się ono z istniejącymi konfiguracjami lub środowiskami. CI/CD wymaga, aby wszystkie narzędzia do testowania bezpieczeństwa były wywoływane programowo, a ich wyniki były agregowane w jednym miejscu. Poszukaj narzędzi, które mają interfejsy API do automatycznych audytów szyfrowania.

Korzyści ze skalowania i optymalizacji CI/CD

Oprócz zwiększenia wydajności zespołów programistycznych, skalowanie i optymalizacja CI/CD mają również inne zalety, z których niektóre to:

Mniejsze koszty ogólne

Godziny opracowywania są zazwyczaj płatne, ale co z czasem spędzonym na ręcznym wdrażaniu kodu lub plików? Automatyzacja dużych części przepływu pozwoli zaoszczędzić czas na płatną pracę, co każdy może docenić. Zautomatyzowane testowanie pozwala również na wcześniejsze niepowodzenie, zamiast znajdowania błędów w kontroli jakości lub produkcji lub, co gorsza, klient je znajdzie. Więcej błędów naprawionych w tym samym czasie to wyraźna wygrana.

Dostawa z mniejszą liczbą błędów i mniejszym ryzykiem

Błędy łapiesz znacznie wcześniej w procesie tworzenia, częściej publikując drobne zmiany. Wdrażając testy automatyczne na wszystkich etapach rozwoju, nie ryzykujesz przeniesienia wadliwego kodu do następnego etapu, a w razie potrzeby łatwiej jest wycofać drobne zmiany.

Szybciej reaguj na warunki rynkowe

Warunki rynkowe nieustannie się zmieniają. Załóżmy, że odkrywasz, że nowy produkt traci przychody lub że więcej klientów uzyskuje dostęp do Twojej witryny ze smartfonów niż laptopów. W takim przypadku znacznie łatwiej jest dokonać szybkiej zmiany, jeśli zoptymalizowałeś ciągłe dostarczanie.

Zaufanie

Jeśli masz zoptymalizowany CI/CD, co oznacza, że ​​masz solidny zestaw testów, Twoja pewność, że nie zgłosisz błędu, znacznie wzrasta. Jeśli jesteś przejrzysty w swoim procesie i edukujesz resztę swojego zespołu i klientów, ich zaufanie do Ciebie jako zespołu programistycznego również wzrasta.

Ostatnie słowa

CI/CD przyspiesza integrację i dostawy. Jednak ważne jest, aby skalować i zoptymalizować go, aby uniknąć sytuacji, w której proces stał się nieproduktywny ze względu na rosnącą złożoność.

Możesz także spojrzeć na niektóre z najlepszych narzędzi CI.