Tworzenie pipeline’u CI/CD to jedno z głównych zadań DevOps, mające na celu usprawnienie procesu tworzenia oprogramowania, jego automatyzację i przyspieszenie. Do tego celu DevOps może korzystać z różnych narzędzi. W tym artykule przedstawimy najlepsze narzędzia CI/CD, opisując ich główne funkcje, zalety i wady.
Co to jest CI/CD?
CI oznacza continuous integration (ciągła integracja), a CD – continuous deployment i delivery (ciągłe wdrażanie i dostarczanie). Jest to sposób wprowadzania automatyzacji na etapy tworzenia aplikacji. Ciągła integracja pomaga programistom częściej scalać zmiany kodu z główną gałęzią (tzw. „trunk”) — czasem nawet codziennie. Gdy zmiany programisty są scalone z aplikacją, są one automatycznie weryfikowane poprzez budowanie aplikacji i uruchamianie różnych poziomów testów automatycznych, zazwyczaj testów jednostkowych i integracyjnych, aby upewnić się, że zmiany nie zepsuły aplikacji. Oznacza to testowanie wszystkiego — od klas i funkcji po różne moduły tworzące całą aplikację. Jeśli testy automatyczne wykryją konflikt między nowym a istniejącym kodem, CI ułatwia szybkie i częste usuwanie błędów.
Ciągłe dostarczanie zwykle oznacza, że fragmenty kodu aplikacji (lub zmiany w kodzie) są automatycznie testowane pod kątem błędów i przesyłane do repozytorium w sposób zautomatyzowany, co można realizować za pomocą narzędzi opisanych w tym artykule. Ciągłe wdrażanie to kolejny proces, w którym program jest automatycznie dostarczany do środowisk produkcyjnych i testowych. Cały proces testowania i wdrażania jest projektowany i kontrolowany przez inżyniera DevOps, który tworzy tzw. pipeline’y CI/CD, o których wspomnieliśmy w tym artykule. Dzięki temu efektywność tworzenia oprogramowania i współpracy między działem rozwoju a operacjami jest znacznie wyższa. Również czas potrzebny na rozwój oprogramowania ulega skróceniu.
Jenkins
Początkowo nazywany Hudson, w 2011 roku zmienił nazwę na Jenkins i stał się jednym z najpopularniejszych narzędzi dla DevOps. Jenkins to oprogramowanie open source do tworzenia automatyzacji budowania, testowania i wdrażania oprogramowania. Działa na serwerach Java, ale pozwala tworzyć aplikacje w innych językach programowania. Główne zalety Jenkinsa to bogaty ekosystem wtyczek, duża globalna społeczność, łatwa instalacja, konfiguracja i dystrybucja. Jak to dokładnie działa?
Gdy programista dodaje zmiany do repozytorium, Jenkins przenosi je na serwer i wykonuje build. W przypadku niepowodzenia programista otrzymuje automatycznego maila o tym fakcie. W przypadku powodzenia build trafia do etapu wdrożenia.
Do głównych wad Jenkinsa można zaliczyć jego wtyczki – narzędzie wymaga dziesiątek pluginów, a im więcej ich jest, tym większe ryzyko błędów podczas aktualizacji. Co więcej, nie wszystkie wtyczki są kompatybilne z Declarative Pipelines.

Bitbucket
Stworzony przez Atlassian, Bitbucket to natywne narzędzie Git CI/CD współpracujące z Jira i Trello. Dzięki temu zespół programistów może tworzyć jedno środowisko, w którym pracują nad kodem, testują go i wdrażają. Dostępne są trzy wersje narzędzia. Bitbucket Cloud korzysta z rozwiązań chmurowych, by zwiększyć bezpieczeństwo, zapobiegać błędom i oczywiście tworzyć pipeline’y. Bitbucket Server jest hostowany lokalnie i współpracuje z Bamboo dedykowanym do CI/CD. Bitbucket Data Center to rozszerzenie Servera, które umożliwia hosting na wielu serwerach.
Najczęściej zgłaszaną wadą Bitbucketa jest brak możliwości integracji z produktami spoza Atlassiana oraz brak wsparcia dla bardziej zaawansowanych funkcji GIT.

Github Actions
GitHub to darmowa platforma hostingowa założona w 2008 roku. Może działać jako zdalne i lokalne repozytorium, co oznacza, że podczas pracy programista nie musi mieć dostępu do internetu, bo wszystkie zmiany są zapisywane na dysku. W 2018 roku GitHub wprowadził API dedykowane CI/CD nazwane GitHub Actions. Działa zarówno na kontenerach, jak i maszynach wirtualnych z macOS, Windows i Linux. Wspiera też wiele języków programowania, takich jak Java, Python, PHP, .NET czy C++. Actions składa się z kodu, więc programiści mogą go traktować jak zwykły kod – edytować, wykorzystywać ponownie, dzielić się nim lub rozwidlać (forkować). To świetne rozwiązanie nie tylko do automatyzacji, ale także do orkiestracji workflow.

Gitlab
GitLab to kolejny darmowy, open source’owy serwer z modułem CI/CD. GitLab CI odpowiada za budowanie i testowanie oprogramowania, gdy programista dodaje nowy kod (ciągła integracja), a następnie GitLab CD wdraża zmiany kodu na środowisko produkcyjne (ciągłe dostarczanie). Co więcej, GitLab korzysta z Auto DevOps – zestawu funkcji i integracji wspierających dostarczanie i rozwój oprogramowania. Automatycznie wykrywa język kodu i korzysta z szablonów do tworzenia pipeline’ów CI/CD.
GitLab CI/CD jest łatwy do nauki, elastyczny i wysoko skalowalny. Można przyspieszyć wykonywanie zadań, konfigurując własnego runnera, a członkowie zespołu projektowego mogą codziennie integrować swoją pracę, co prowadzi do mniejszej liczby błędów.

GoCD
GoCD działa podobnie do Jenkinsa i jest często wybierany jako dobra alternatywa. Automatyzuje cały proces budowania i testowania – od sprawdzenia kodu po wdrożenie. W przeciwieństwie do Jenkinsa, GoCD nie tworzy oddzielnego serwera na środowisku, ale może współpracować z Kubernetes i Docker, także przy wdrożeniach cloud native. Zapewnia też audyt. GoCD jest polecany dla mniejszych projektów, ponieważ jest narzędziem CI/CD o jednym przeznaczeniu.
Słabą stroną GoCD jest dokumentacja, którą użytkownicy opisują jako „wymagającą ulepszeń poprzez dodanie rzeczywistych przykładów i większej liczby scenariuszy konfiguracji”.

Flux
Flux należy do rodziny projektów GitOps i jest zestawem rozwiązań zaprojektowanych specjalnie dla Kubernetes, udostępnionym również jako open source w ramach Cloud Native Computing Foundation. Flux działa trochę inaczej niż pozostałe narzędzia CI/CD opisane tutaj. Gdy programiści piszą manifesty Kubernetes i wypychają je do repozytorium, pod utrzymuje aktualną konfigurację, a Flux co 5 minut sprawdza, czy zaszły jakieś zmiany. Jeśli je wykryje, synchronizuje konfigurację z klastrem.
