CI/CD (ang. Continuous Integration/Continuous Delivery lub Deployment) to proces ciągłej integracji (CI) zmian w kodzie, automatycznego testowania oraz ciągłego dostarczania lub wdrażania (CD).
Jest to zestaw praktyk i narzędzi, które pozwalają na szybkie, zautomatyzowane i niezawodne dostarczanie oprogramowania. Stanowi część metodyki DevOps i ułatwia pracę przy projektach informatycznych.
CI/CD obejmuje wszystkie kroki od napisania kodu do dostarczenia go użytkownikom. Celem stosowania tej metodologii jest osiągnięcie spójnego i zautomatyzowanego sposobu budowania, testowania i wdrażania aplikacji. CI/CD znacznie zwiększa efektywność tworzenia oprogramowania i produktywność zespołów developerskich, ponieważ:
- Przyspiesza wprowadzanie zmian,
- Automatyzuje wykrywanie błędów w kodzie,
- Umożliwia wprowadzanie poprawek na bieżąco.
Dzięki CI/CD wersja oprogramowania, która trafia do użytkowników, posiada mniej błędów, ponieważ automatyzacja ciągłego testowania pozwala łatwiej je znaleźć. Ciągłe wdrażanie natomiast umożliwia szybkie wprowadzanie poprawek – także tych opartych na informacji zwrotnej od użytkowników. Przekłada się to na oszczędność czasu i pieniędzy oraz wyższą jakość tworzonego oprogramowania.
CD – Continuous Delivery/Continuous Deployment. Jaka jest różnica? #
W Continuous Deployment (ciągłe wdrażanie) wszystkie przetestowane zmiany są automatycznie wdrażane na środowisko produkcyjne. W przypadku Continuous Delivery (ciągłe dostarczanie) developerzy ręcznie zatwierdzają wdrożenie.
Proces i narzędzia CI/CD #
Proces CI/CD składa się z 4 głównych kroków:
- Integracja – kod przesłany do repozytorium jest integrowany w jedną całość,
- Budowa – kompilacja kodu,
- Testowanie – sprawdzanie kodu pod kątem poprawności i wydajności,
- Dostarczanie – przesyłanie kodu do środowiska produkcyjnego i użytkowników.
Pierwszym krokiem jest integracja kodu z repozytorium, czyli połączenie wprowadzonych przez programistów zmian w kodzie w jedną całość. Praktyka CI nakazuje, aby developerzy wysyłali (commit) swój kod okresowo i możliwie często (np. codziennie). Zmniejsza to prawdopodobieństwo wprowadzania zmian w tych samych plikach przez różnych developerów, co wymusza konieczność porównywania i łączenia (merge) zmian w kodzie.
Drugi krok – budowa – to proces kompilowania i tworzenia wykonywalnego kodu z kodu źródłowego w repozytorium. Pozwala sprawdzić czy kod się uruchamia oraz przeprowadzić dalsze testy. Większość narzędzi CI/CD pozwala na uruchomienie procesu tworzenia „paczki” (build) na kilka sposobów, np.:
- Ręcznie – uruchamiane przez użytkownika,
- Automatycznie – po commicie kolejnego fragmentu kodu,
- Automatycznie – w zdefiniowanym czasie.
Poprawność nowego kodu testuje się za pomocą zautomatyzowanych narzędzi zarówno przed integracją, jak i po kompilacji. W tym celu przeprowadza się m.in. automatyczne testy jednostkowe, integracyjne oraz akceptacyjne, które pozwalają na wczesne wykrycie błędów. Jeśli testy zostaną pomyślnie zakończone, kod jest dostarczany do środowiska produkcyjnego.
Ostatni krok polega na połączeniu kodu w całość w celu dostarczenia go do użytkowników końcowych. Uruchamiane są wtedy zautomatyzowane narzędzia kompilacyjne, które generują kod. Następnie, z pomocą skryptów lub narzędzi, aplikacja z wprowadzonymi zmianami udostępniana jest na środowisku produkcyjnym.
Do najpopularniejszych narzędzi CI/CD zaliczają się:
- Jenkins
- CircleCI
- TeamCity
- Bamboo
- GitLab
- Buddy
- Travis CI
Ciągłe testowanie w CI/CD #
Testowanie jest integralną częścią procesu CI/CD, ponieważ umożliwia dostarczenie wysokiej jakości aplikacji użytkownikowi końcowemu. Testy przeprowadzane w każdej fazie procesu CI/CD pozwalają sprawdzić, czy tworzona aplikacja lub jej fragment działa poprawnie, tj. zgodnie z założeniami.
W procesie CI/CD wykorzystywane są m.in.:
- Testy jednostkowe – niskopoziomowe testy poszczególnych komponentów oprogramowania, są łatwe w automatyzacji z użyciem serwera ciągłej integracji.
- Testy integracyjne – pozwalają sprawdzić, czy moduły lub usługi aplikacji współdziałają poprawnie; przykładem takiego testu jest sprawdzenie interakcji aplikacji z bazą danych.
- Testy systemowe – wykonywane są na kompletnej i w pełni zintegrowanej aplikacji. Ich celem jest znalezienie błędów oraz upewnienie się, że program działa zgodnie z wymaganiami użytkownika.
Do testów systemowych zaliczamy m.in.:
- Testy funkcjonalne – weryfikują, czy aplikacja spełnia funkcje założone w wymaganiach biznesowych.
- Testy wydajnościowe – oceniają działanie systemu pod określonym obciążeniem, czyli pomagają zmierzyć niezawodność, skalowalność i szybkość reakcji aplikacji.
- Testy regresji – pozwalają na sprawdzenie całej aplikacji w kontekście wprowadzanych zmian.
- Testy akceptacyjne – zazwyczaj wykonywane są po stronie klienta lub przez użytkowników końcowych. Ich głównym celem jest znajdowanie błędów upewnienia się, że aplikacja spełnia ich oczekiwania.
Automatyzacja w CI/CD #
Automatyzacja poszczególnych etapów procesu CI/CD, w tym ciągłych testów, znacząco przyspiesza proces tworzenia i rozwijania aplikacji. Automatyczne może być nie tylko dostarczanie zmian w kodzie, ale też procedury ich cofania.
W ramach CI/CD developerzy mogą korzystać z automatyzacji w:
- Integracji kodu,
- Tworzeniu paczek,
- Wykonywaniu testów,
- Dostarczaniu i wdrażaniu kodu.
Automatyzacja testów #
Napisane przez developerów testy można zautomatyzować za pomocą serwera ciągłej integracji, który będzie monitorować repozytoria i wykonywać zestaw testów za każdym razem, gdy nowe zmiany zostaną przesłane do głównego repozytorium. W przypadku niepowodzenia testu zwróci on rezultat z odpowiednim statusem błędu. W ten sposób można zautomatyzować wiele testów, np. regresji, wydajności czy bezpieczeństwa.
CI/CD – Podsumowanie #
CI/CD to skuteczna metodologia wytwarzania oprogramowania, która oferuje wiele korzyści, w tym:
- Skrócenie czasu wprowadzania zmian, co zwiększa elastyczność firmy,
- Zmniejszenie liczby błędów, a tym samym zwiększenie niezawodności aplikacji,
- Poprawa wydajności dzięki automatyzacji testowania.
CI/CD jest idealnym rozwiązanie dla firm, które chcą często poprawiać lub zmieniać swoje aplikacje, zachowując stabilność ich działania. Z CI/CD mogą one zwiększyć swoją konkurencyjność i poprawić wydajność pracy zespołów programistycznych.