Korzyści dzięki CI/CD
9 lutego 2024

Continuous Integration, Continuous Delivery
Automatyzacja procesu rozwoju oprogramowania
CI/CD (Continuous Integration, Continuous Delivery) pozwala na automatyzację procesu rozwoju oprogramowania, zaczynając od fazy początkowego zatwierdzenia kodu, a kończąc na wdrożeniu tworzonego oprogramowania.
Pierwsze fazy pracy nad oprogramowaniem możemy automatyzować dzięki CI, dzięki czemu możliwa jest do uzyskania automatyzacja: przekazania kodu przez wielu deweloperów (code commit), tworzenia build, realizacji testów integracji (unit and integration tests), tworzenia aplikacji lub usługi (create application or service).
Kolejne fazy pracy nad oprogramowaniem automatyzujemy dzięki CD: testowanie (functional testing, user acceptance testing), configuration automation, testy ładowania (load testing) oraz wdrożenie (deployment).
Szybsze wdrożenie kodu
Dzięki CI/CD możemy wyeliminować sporą część tradycyjnie niezbędnego manualnego zaangażowania i konieczności realizacji zadań, które wykonane muszą być przez wyznaczone osoby wspierające pracę zespołu programistycznego.
Proces CI/CD pozwala nam zatem wygenerować wsparcie w zakresie budowy, testowania oraz wdrożenia nowego kodu do wersji produkcyjnej oprogramowania. Celem jest doprowadzenie do sytuacji szybszego wdrożenia kodu, który będzie charakteryzował się wyższą jakością.

CI – automatyzacja w celu scalania zmian w kodzie
Zautomatyzowany workflow
Continuous Integration wykorzystuje automatyzację w celu umożliwiania szybkiego i częstego scalania zmian w kodzie ze wspólnym repozytorium.
Każde zatwierdzenie (tzw. commit) uruchamia zautomatyzowany przepływ pracy na serwerze CI, który w rezultacie dołącza commit do głównej gałęzi kodu (main branch) po upewnieniu się, że jest to bezpieczne.
Testowanie w Continuous Integration
Proces CI opiera się więc na dobranym zestawie sprawdzonych testów. Istotnym jest zatem utrzymywanie zestawu testów, które nie są wadliwe.
Należy zauważyć, że wysoki zasięg testu powoduje większą konsumpcję czasu, co ma wpływ na produktywność zespołu deweloperskiego.
Dąży się zatem do znalezienia właściwego balansu między zasięgiem testu, a wymaganiami co do produktywności zespołu (szybkość fazy testowania).
System zarządzania kodem źródłowym
Popularnym narzędziem wykorzystywanym w CI jest system zarządzania kodem źródłowym. Dobry system zarządzania kodem ma fundamentalne znaczenie dla systemu CI.
Jednym z przykładów popularnych systemów do zarządzania kodem jest Github lub Gitlab. System zarządzania kodem zawiera kod źródłowy, skrypty testów (test scripts) oraz instrukcje dotyczące budowania aplikacji.
Zarządzanie procesem CI
Zarządzanie procesem CI jest łatwiejsze dzięki popularnym narzędziom do tego dedykowanym, np. Github Actions, Buildkite, Jenkins, CircleCI, TravisCI. Narzędzia pozwalają na zarządzanie budową oraz zadaniami testów w Continuous Integration.
Jest również sporo narzędzi do pisania i przeprowadzania testów, właściwych dla danego środowiska (np. Jest to popularny framework do testowania dla JS, playwright lub cypress dedykowane są do aplikacji webowych).
Narzędzia do budowy (build tools) są bardziej zróżnicowane i specyficzne dla danego środowiska, np. Gradle to narzędzie dla Java, Webpack dla Javascript.

Continuous Deployment (CD)
CD w procesie produkcji oprogramowania
Continuous Deployment (CD) wymaga więcej wysiłku, jeśli chodzi o wdrożenie w procesie produkcji oprogramowania przez zespoły programistyczne.
Z tego powodu zdarza się, że CD jest wykorzystywane w odniesieniu do podstawowych typów systemów (systemy bezstanowe, np. API lub serwery WWW).
Production monitoring
Uwzględniając skuteczny monitoring produkcji (production monitoring), systemy mogą być wdrażane w sposób ciągły bez większego ryzyka.
Systemy typu stateless (bezstanowe) pozwalają na praktycznie bezproblemowy rollback. W tym miejscu warto wspomnieć o przykładowych rozwiązaniach: Datadog, Prometheus.
Feature flags
Częstą praktyką jest korzystanie z tzw. feature flags w celu odseparowania wdrożenia kodu od aktywacji określonych funkcjonalności, co pozwala na szybkie wyłączanie nowych funkcjonalności jeśli napotkane zostały jakiekolwiek problemy bez konieczności wykonania pełnego rollback.
Canary deployment
Warto wspomnieć o tzw. wdrożeniu canary deployment, typowym dla produktów posiadających duże liczby użytkowników.
Canary deployment pozwala na wdrożenie nowego kodu do środowiska produkcyjnego dla wybranej, niedużej liczby użytkowników (zwykle power users i staff).
Dzięki temu możliwe jest wychwycenie ewentualnych problemów zanim wdrożenie zostanie przekazane dla całego środowiska produkcyjnego. Zespół może przetestować zmiany w rzeczywistych warunkach użytkowania produktu programistycznego.
Manualne wdrażanie zmian w systemach stanowych
Wykorzystanie CD w odniesieniu do systemów stanowych (stateful systems) zdarza się rzadziej (database backend clusters, websocket cluster).
Takie złożone systemy mają zwykle ustaloną stałą częstotliwość wdrażania zmian. Sam proces wdrażania zmian przebiega wówczas manualnie, co niesie ze sobą czynnik ryzyka oraz konsumpcję czasu.
Popularne narzędzia wykorzystywane w Continuous Deployment to: wspomniany wcześniej Github Actions, Buildkite, Jenkins, ArgoCD dedykowane dla Kubernetes.

Indywidualne wdrożenie CI/CD
Podsumowując, CI/CD sprowadza się do praktyk w zakresie wsparcia dla tworzenia oprogramowania, które mają ogromny wpływ na szybkość tworzenia oraz jakość kodu.
Warto jednak pamiętać, że CI/CD to nie jest rozwiązanie, które można zamiennie stosować dla różnych firm i zespołów.
Włączenie narzędzi CI/CD wymaga indywidualnego podejścia, więc wskazane jest wykorzystanie partnera IT mającego doświadczenie, który uwzględni złożoność obecnego systemu oraz potrzeby zespołu programistów.
Indywidualne podejście jest zatem warunkiem koniecznym rozpoczęcia korzystania z optymalizacji, jakie daje wdrożenie Continuous Integration oraz Continuous Deployment dla firmy.