Maksymalizacja wydajności: Przewodnik po prawidłowym wdrożeniu procesów CI/CD
2023-04-17 12:53:45Ciągłe doskonalenie jest jedną z podstaw filozofii DevOps, która może przynieść Twojej firmie wiele korzyści.
Proces ciągłego doskonalenia obejmujący wszystkie aspekty tworzenia oprogramowania polega na gromadzeniu i analizowaniu informacji zwrotnych na temat utworzonych dotychczas produktów, aby ustalić, które rozwiązania się sprawdzają, a które wymagają dopracowania. Wdrażając tego rodzaju spostrzeżenia, możesz sprawdzać, czy zmierzasz we właściwym kierunku, a w razie potrzeby dokonać korekty.
Niezbędnym elementem umożliwiającym ciągłe doskonalenie jest proces ciągłej integracji i ciągłego wdrażania (CI/CD). Dzięki automatyzacji wdrażania zmian takie procesy pozwalają skrócić proces wydawania oprogramowania oraz ograniczyć potencjalne zagrożenia.
Nie dziwi zatem fakt, że procesy CI/CD stanowią podstawę pracy zespołów DevOps i inżynierów oprogramowania. W dalszej części artykułu dowiesz się więcej na temat tej koncepcji i przygotujesz się do utworzenia procesów CI/CD w swojej firmie.
Czym są procesy CI/CD w modelu DevOps?
CI/CD to skrót od zwrotów oznaczających w języku angielskim ciągłą integrację (CI) oraz ciągłe wdrażanie (CD). Pojęcie to odnosi się do praktyk dostarczania oprogramowania, których celem jest zwiększenie tempa wdrażania, jakości oraz stabilności kolejnych wydań produktu.
Choć komponenty CI oraz CD są ze sobą powiązane i bazują na automatyzacji, odnoszą się do odmiennych aspektów procesu tworzenia oprogramowania.
Ciągła integracja polega na automatycznym tworzeniu, testowaniu i scalaniu zmian w kodzie.
Ciągłe dostarczanie polega na automatycznym wdrażaniu zmian w różnych środowiskach: od programistycznego, poprzez testowe, aż po produkcyjne.
W zestawieniu praktyki CI/CD umożliwiają zespołom szybsze dostarczanie nowych funkcji i poprawek. W rezultacie nowe wydania oprogramowania szybciej trafiają do użytkowników i generują mniej błędów w toku ciągłej eksploatacji.
Najważniejsze zalety procesów CI/CD
Jedną z najważniejszych zalet modelu CI/CD jest to, że umożliwia on zespołom wychwytywanie i usuwanie problemów już na wczesnym etapie procesu tworzenia oprogramowania.
Dzięki automatycznemu tworzeniu oraz testowaniu zmian w kodzie bezpośrednio po ich zatwierdzeniu zespoły mogą wykrywać i rozwiązywać problemy, zanim eskalują, doprowadzając do poważnych strat.
Ponadto zmiany w środowiskach funkcjonujących według tego modelu mogą być wdrażane przyrostowo. W ten sposób łatwiej uniknąć marnowania czasu i zasobów na tworzenie aplikacji o monolitycznych architekturach, w których najdrobniejsze zmiany mogą czasami doprowadzić do nieodwracalnych problemów.
Częste wprowadzanie drobnych zmian sprzyja tworzeniu niezawodnego oprogramowania, ponieważ daje możliwość błyskawicznego wychwytywania zagrożeń. Wówczas można podjąć działania: przełożyć zmianę na później do czasu rozwiązania problemu lub całkowicie zaniechać jej wprowadzenia w sposób nieodczuwalny dla użytkownika końcowego.
Taka możliwość jest szczególnie cenna dzisiaj, gdy cierpliwość nie jest cnotą użytkowników końcowych. Jednym z najbardziej negatywnych doświadczeń współczesnego użytkownika aplikacji (czyli Twojego klienta końcowego) jest długi czas oczekiwania na załadowanie strony. Problem ten jest szczególnie dotkliwy dla branży e-commerce, jednak może dotyczyć także firm działających w innych sektorach.
Badanie przeprowadzone przez Unbounce wykazało, że użytkownicy zaczynają się irytować, jeśli strona ładuje się dłużej niż 3 sekundy. Połowa respondentów zadeklarowała, że po upływie tego czasu odświeżają stronę, 22% z nich zamyka kartę, a 14% przechodzi do witryny konkurencji.
Reakcja użytkowników następuje szybciej, jeśli klient widzi białą stronę lub błąd 404 informujący o niedostępności witryny. Procesy CI/CD minimalizują ryzyko takich niechętnych reakcji.
Tworzenie procesów CI/CD
Pierwszym krokiem przy tworzeniu procesów CI/CD jest uzmysłowienie sobie, że wymaga on narzędzi koniecznych do zoptymalizowania operacji.
Nawet najlepsze narzędzie nie pozwoli pominąć tego etapu, jeśli Twoja firma nie będzie dysponować globalnie uporządkowanymi i właściwie skonfigurowanymi procesami. Jako jeden z podstawowych mechanizmów w filozofii DevOps, CI/CD często zastępuje wiele czynności.
Jednak praktyka ta sama w sobie nie zastąpi zdrowego rozsądku ani nie skoryguje błędów, jakie my jako inżynierowie popełniamy (w końcu jesteśmy tylko ludźmi!). Jeśli dodatkowo praca zespołowa kuleje, cele biznesowe nie są przejrzyste, a zespół nie posiada odpowiednich umiejętności technicznych, nawet najlepsze narzędzie nie przyniesie poprawy wyników.
Zanim jednak przejdziemy do omówienia etapów procesu tworzenia procesów CI/CD rzućmy nieco światła na samą koncepcję procesów w dziedzinie dostarczania oprogramowania.
Istota procesów w IT
Krótko mówiąc, procesy CI/CD umożliwiają zespołom zajmującym się tworzeniem oprogramowania zautomatyzowanie różnych procesów.
Inżynierowie często muszą pobierać i testować kod w trakcie pracy, przy czym konieczne jest również uzupełnianie, a czasami kompilowanie zmiennych. Ponadto przed wdrożeniem zespoły często muszą uzyskać dodatkowe zatwierdzenia, zwłaszcza w przypadku systemów przeznaczonych dla branż podlegających rygorystycznym przepisom, takich jak finanse czy ubezpieczenia.
Widać zatem wyraźnie, że dostarczanie oprogramowania to nic innego jak zbiór wykonywanych kolejno czynności. Za pomocą procesów zespoły mogą precyzyjnie przenosić nowe dodawane fragmenty kodu i aktualizacje ze środowiska kontroli wersji do środowiska produkcyjnego — i w tym właśnie pomagają procesy CI/CD.
Dobór i konfiguracja narzędzi CI/CD
Procesy CI/CD można tworzyć z wykorzystaniem narzędzi zarówno chmurowych, jak i lokalnych — każde z tych podejść ma swoje wady i zalety. Jednak na początek lepiej korzystać z wersji chmurowej, gdyż jest to łatwiejsze i nie wymaga utrzymywania serwerów ani instalowania aktualizacji.
Z perspektywy DevOps obecnie dwoma najpopularniejszymi rozwiązaniami CI/CD są GitLab CI/CD oraz Azure DevOps. Od pewnego czasu na rynku dostępne są także inne rozwiązania, takie jak Jenkins, CircleCI i Bamboo.
Większość z tych rozwiązań to produkty udostępniane na zasadzie closed-source. Jedynie Jenkins daje pewną swobodę wprowadzania własnych zmian w kodzie. Możliwość ta jest jednak ograniczona do instalacji lokalnych, które, jak już wcześniej wspomniano, wymagają utrzymywania własnej infrastruktury.
Monitorowanie CI/CD
Po opracowaniu wdrażania zmian, upewnieniu się, że zespół wie, co i jak ma robić, oraz zainstalowaniu i skonfigurowaniu narzędzi pozostaje jedynie rzetelne monitorowanie.
Nierzadko zdarza się, że wdrożenie przebiega bezproblemowo, a aplikacja działa sprawnie, jednak tylko do czasu pierwszej usterki, na przykład w trakcie transakcji online. Ciągłe monitorowanie pozwala możliwie jak najszybciej wykrywać i naprawiać takie problemy.
Do wyboru jest wiele rozwiązań przeznaczonych do monitorowania procesów CI/CD.
Poszukując najlepszego rozwiązania, musisz ustalić, czy chcesz monitorować cały system — od sprzętu po aplikację — czy jedynie najwyższą warstwę abstrakcji.
W pierwszym przypadku warto wypróbować takie rozwiązania, jak Zabbix lub Nagios. Obydwa są w pełni konfigurowalne, mają ugruntowaną pozycję na rynku i są stale rozwijane.
Jeśli chcesz sprawdzać przede wszystkim wydajność aplikacji, możesz sięgnąć po NewRelic lub zestaw narzędzi ELK (Elasticsearch, Logstash, Kibana). Jeśli dodatkowo interesuje Cię tworzenie przejrzystych i merytorycznie istotnych wizualizacji wskaźników, przydatnym rozwiązaniem będzie Grafana.
Najlepsze praktyki CI/CD
Innym zagadnieniem o krytycznym znaczeniu jest tworzenie i utrzymywanie różnych środowisk.
W zależności od stopnia złożoności systemu, dobrym rozwiązaniem może być stworzenie odrębnych środowisk do prac programistycznych, testowania itp. — w takich środowiskach powinno się najpierw testować zmiany.
Dopiero później powinno się instalować nowe wersje w środowisku produkcyjnym. Warto również rozważyć przeprowadzanie testów kanarkowych, które pozwolą uniknąć natychmiastowego wydawania oprogramowania w całym środowisku produkcyjnym, ograniczając wydania tylko do niektórych użytkowników.
Aby wszystkie elementy współpracowały ze sobą, trzeba opracować systematykę wszystkich operacji, wykorzystując następujące procedury:
Tworzenie gałęzi
Każdą zmianę powinien poprzedzać proces utworzenia kopii repozytorium, a następnie prac nad tą kopią. Pozwala to wyeliminować potencjalny problem związany z nadpisywaniem zmian przez osoby zajmujące się tym samym zadaniem.
Dobrze jest również przyjąć solidny system nazewnictwa gałęzi. Można na przykład pogrupować gałęzie według nazwy, poprzedzając przedrostkiem „funkcja_” elementy wprowadzające nowe funkcjonalności, przedrostkiem „poprawka_” typowe zmiany, których celem jest naprawienie kodu, a przedrostkiem „pilnapoprawka_” pilne poprawki błędów.
Pobieranie i scalanie kodu
Pisząc nowe wiersze kodu, musisz tworzyć żądania pobrania kodu (pull request) lub jego scalenia (merge request), które są prośbą o ocenę ostatniej zmiany kierowaną do innych programistów. Nawet bardzo doświadczeni i posiadający ogromną wiedzę programiści przekazują swój kod współpracownikom do sprawdzenia.
Każda para oczu jest na wagę złota, jednak nie należy przesadzać z weryfikacją: w większości przypadków wystarczy dwóch do trzech weryfikatorów.
Weryfikacja kodu
Każda zmiana może doprowadzić do usterki po stronie niektórych, większości lub wszystkich użytkowników końcowych. Sprawdzając nawzajem swój kod, programiści ograniczają do minimum prawdopodobieństwo błędów i maksymalnie zwiększają swoje szanse powodzenia. Weryfikacja kodu pomaga również wychwycić nieścisłości oraz uprościć lub zoptymalizować kod.
Bardziej doświadczeni programiści często służą wiedzą i wnoszą szerszą perspektywę, dzięki czemu zespół może wykorzystywać kod dłużej.
Ważne, aby pamiętać, że w procesie weryfikacji nie chodzi o próbę zdominowania zagadnienia, tylko o wypracowanie wspólnego stanowiska i wyrażanie konstruktywnych opinii.
Czasami zmiany optymalne z technicznego punktu widzenia mogą być nie do przyjęcia dla użytkowników, a ostatecznym celem powinno być przecież zawsze osiągnięcie celów biznesowych przy użyciu technologii.
Trochę dobrych i złych praktyk CI/CD
Za każdym razem, gdy pojawia się konieczność utworzenia procesów, warto mieć na uwadze także inne praktyki CI/CD. Warto również rozważyć utworzenie jednego głównego procesu CI/CD i modyfikowania go pod kątem wszystkich kolejnych przypadków.
Poniżej przedstawiamy wybrane wytyczne, jakich przestrzegają nasi inżynierowie DevOps przy tworzeniu procesów CI/CD, które sprawdzą się niezależnie od przyjętego podejścia:
1. Automatyzuj tyle, ile się da: tworzenie, testowanie, instalowanie, weryfikację. Pomoże to uniknąć błędów.
2. Stosuj kontrolę wersji (wersjonowanie) oraz pliki konfiguracyjne.
3. Pamiętaj o wypychaniu zmian do repozytoriów. Czytelnie opisuj wszystkie zmiany.
4. Wdrażaj i automatyzuj testy. W miarę możliwości stosuj testy jednostkowe, integracyjne lub kompleksowe, aby unikać błędów aplikacji.
5. Korzystaj ze środowisk będących odbiciem Twojego środowiska produkcyjnego — programistycznych, testowych itp.
6. Monitoruj i korzystaj z alertów. Musisz wiedzieć, gdy coś nie idzie zgodnie z planem lub przestaje działać. Bez takich informacji nie da się podjąć działań naprawczych.
7. Opracuj procedury wycofywania zmian. Przy wdrożeniu zawsze coś może pójść nie tak, a przygotowanie poprawki może chwilę potrwać. Bardzo ważne jest zapewnienie możliwości przywrócenia ostatniej działającej wersji aplikacji.
8. Wykorzystaj tworzenie gałęzi i/lub flagi do wdrażania nowych funkcjonalności w najmniejszych możliwych przyrostach. W ten sposób zyskasz możliwość szybkiego testowania zmian i jeszcze szybszego ich wycofywania w razie wystąpienia problemów.
9. Korzystaj z rozwiązań chmurowych. Takie podejście pozwoli Ci wykorzystać zalety nowych narzędzi oraz funkcji bez konieczności utrzymywania infrastruktury.
Podsumowanie
Ciągła integracja i ciągłe wdrażanie są podstawowymi elementami praktyk DevOps i pozwalają poprawić tempo wdrażania oraz jakość wydań oprogramowania.
Procesy CI/CD automatyzują wdrażanie zmian w produkcie, dając zespołom możliwość wczesnego wykrywania i eliminowania problemów, przeprowadzania testów oraz szybszego dostarczania nowych funkcji. Warto poświęcić nieco uwagi modelowi CI/CD tak szeroko stosowanemu przez zespoły DevOps oraz zespoły inżynierów oprogramowania.
Dostępnych jest wiele narzędzi, które pomogą w utworzeniu procesów CI/CD, jednak pierwszym i najważniejszym krokiem musi być wyraźne zdefiniowanie celów biznesowych. Ta logika powinna stanowić podstawę wszystkich dalszych wyborów.
Choć może to zabrzmieć trywialnie, osiągnięcie takiej przejrzystości i zaplanowanie kolejnych kroków często okazuje się największym wyzwaniem. Jeśli Twój zespół nie ma żadnych procesów CI/CD, zazwyczaj dobrze jest skonsultować swoje potrzeby i wymagania z doświadczonymi specjalistami DevOps.
Nasi inżynierowie zaplanowali, wdrożyli i zoptymalizowali model CI/CD w wielu firmach — i z przyjemnością udzielimy wsparcia także Twojej firmie. Skontaktuj się z nami, abyśmy mogli porozmawiać o stworzeniu procesów CI/CD dla Ciebie.