.

Narzędzia continuous integration, których potrzebuje każdy DevOps

DevOps jest bez wątpienia jednym z najpopularniejszych terminów w świecie IT. Do wykonywania pracy jako inżynier DevOps wymagane są m.in. umiejętności w zakresie tworzenia oprogramowania oraz znajomość procesów jego wdrożenia. Ze względu na szeroki wachlarz technologii i konieczność posiadania specjalistycznej wiedzy, niezbędny do pracy jest wybór właściwych narzędzi.

W drodze do continuous integration

Każdy kto aktywnie żyje w branży technologii informatycznych wielokrotnie spotkał się z terminem continuous. Słowo oznaczające “czynność lub proces trwający w sposób ciągły i nieprzerwany” najczęściej spotykane jest w zespołach DevOps i pojawia się w rozwiązaniu CI/CD, które pomaga usprawnić proces rozwoju oprogramowania. Wśród kilku jego typów wyróżnić należy narzędzie ciągłej integracji - Continuous Integration, które było początkiem powstania CI/CD.

Aby lepiej zrozumieć istotę tego narzędzia, należy cofnąć się kilka lat i przypomnieć proces wdrażania oprogramowania. Wówczas większość prac była wykonywana przez programistów w izolacji, bez żadnej automatyzacji, a scalanie zmian kodu było trudne i czasochłonne. Nie istniały wówczas repozytoria kodu, a zmiany przekazywano za pomocą m.in. pendrive lub serwera FTP. Wynikiem takich prac były: długi czas generowania paczki do wdrożenia, wykonywanie, podatnych na błędy, manualnych i powtarzalnych procesów oraz brak testowania aplikacji. Lekiem na te problemy stał się system CI, obecnie podstawowa praktyka DevOps, która automatyzuje większość czynności, ujednolica różne środowiska programistyczne, ułatwia przekazywanie i testowanie zmian, jednocześnie oszczędzając czas zespołu.

Co to jest continuous integration (CI)?

Podstawową zasadą continuous integration jest jak najczęstsze i regularne wprowadzanie zmian do głównej gałęzi kodu, a następnie ich budowanie i testowanie. Cały proces realizowany jest na pojedynczym, współdzielonym repozytorium kodu źródłowego z dostępem dla wszystkich osób zaangażowanych w projekt. CI, oprócz jego głównej funkcji jako narzędzia ciągłej integracji, jest też narzędziem automatyzującym testowanie aplikacji po każdej wprowadzonej zmianie. Praktyka ta rozszerza standardowe pojęcie integracji kodu o ciągłość, co skłania do częstszego wprowadzania zmian w kodzie i pozwala wykryć błędy i ograniczyć konflikty już na wstępnym etapie. Wcześnie otrzymana informacja zwrotna i automatyzacja procesów kompilacji i testów pomagają skrócić czas potrzebny na przejście od zatwierdzonego kodu do pomyślnego uruchomienia w środowisku produkcyjnym. Te wszystkie czynniki umożliwiają szybsze wdrażanie aktualizacji i poprawek, skracając średni czas do rozwiązania problemu (MTTR - mean time to recovery).

Cykl operacyjny w continuous integration

Źródło: Mind the Product

Continuous integration a continuous delivery

Continuous delivery, kolejny element CI/CD, jest rozszerzeniem continuous integration o automatyczne budowanie gotowych paczek wdrożeniowych. Porównując oba narzędzia, CI odpowiedzialny jest za build, a CD za release. CD automatyzuje dostarczanie aplikacji do środowisk nie tylko produkcyjnych, ale także programistycznych i testowych. Jednak sam proces wdrożenia odbywa się manualnie.

Continuous integration, jak już wspomnieliśmy, to praktyka oparta na automatycznym testowaniu każdej zmiany w repozytorium kodu, podczas gdy continuous delivery jest procesem uzyskiwania zmian nowych funkcji, konfiguracji i poprawek błędów. CI jest uruchamiane natychmiast po wykryciu i pobraniu zmiany dostarczonej przez programistę, natomiast w continuous delivery kod jest ciągle rozwijany i dostarczany, do momentu potwierdzenia przez programistę gotowości kodu do wysyłki.

Continuous integration i continuous delivery ściśle ze sobą współpracują, jednak wymagają ciągłego testowania, ponieważ od nich zależą losy wdrażanej aplikacji.

Schemat przedstawiający elementy składowe continuous integration, continuous delivery i continuous deployment

Źródło: Atlassian

Jakie są narzędzia do continuous integration?

Rynek oferuje wiele narzędzi do ciągłej integracji, które uzupełniają proces tworzenia oprogramowania. Każde narzędzie ma inną charakterystykę i architekturę, ale ich wspólny cel to podniesienie jakości i szybkości dostarczenia aplikacji. Wykorzystując ciągłą integrację jako element swojej strategii, dana firma oszczędza czas i pieniądze. Dlatego kluczowym jest wybranie odpowiedniego narzędzia, dostosowanego do celów organizacji. Wśród czynników wyboru można wyróżnić dostępne funkcje, możliwość rozbudowy narzędzia, obsługiwane platformy i języki programowania, koszt oraz łatwość użytkowania.

Wybrane narzędzie powinno bezproblemowo wykonywać główne etapy procesu integracji, czyli:

  • monitorowanie i pobieranie zmian kodu,
  • budowanie nowego kodu,
  • testowanie kodu,
  • naprawę błędów.

Wykorzystanie narzędzi continuous integration zapewnia stabilność i czystość kodu oraz zapobiega konfliktom, takim jak błędy i zduplikowany kod. CI można osiągnąć na dwa sposoby - jako manualny build oraz build obsługiwany przez serwer. Oba rozwiązania tak samo spełniają swoje funkcje, jednak wybór należy do danej firmy. Zespoły, które nie korzystają z serwera CI mogą osiągać ciągłą integrację poprzez okresowe wykonywanie kompilacji i samodzielne tworzenie skryptów. Takie podejście wymaga większej kontroli nad kodem źródłowym, procesami testowania i zatwierdzania. Dla zespołów, które wykorzystują drugi sposób, istnieje wiele gotowych narzędzi DevOps, które ułatwiają ciągłą integrację.

Serwer CI, zwany też jako build server, wykorzystywany jest przede wszystkim do automatyzacji i sprawdzenia integralności dostarczanej przez programistę zmiany z obecną wersją kodu oraz wszystkimi poprawkami i zależnościami, wprowadzonymi przez pozostałych członków zespołu. Serwery CI często zawierają również historię zmian, generują powiadomienia o statusie wykonywanych prac oraz łączą informacje z wielu projektów. Z bardzo dużej ilości dostępnych rozwiązań, należy więc dokonać właściwego wyboru narzędzia, które zapewni stabilną platformę dla realizowanych projektów programistycznych.

Jenkins

Jenkins jest jednym z najpopularniejszych narzędzi, stworzonych do celów ciągłej integracji. To rozwiązanie open source, napisane w Javie, służy do automatyzacji kroków budowania i testowania aplikacji i ułatwia programistom integrację wymaganych zmian z projektem. Jenkins jest narzędziem wieloplatformowym, więc można go uruchomić zarówno w środowisku on-premise, jak i w chmurze lub z wykorzystaniem Dockera. Ponadto posiada ogromną ilość pluginów do integracji z różnymi platformami. Jednak mnogość wtyczek w połączeniu z od lat niezmiennym i mało przyjaznym interfejsem graficznym, wymaga od zespołu DevOps dużo pracy i cierpliwości podczas, zwykle niełatwej, konfiguracji projektu.

Jenkins, oprócz kompilowania projektu, wykonania testów jednostkowych i integracyjnych oraz budowania aplikacji, może uruchomić statyczną analizę kodu oraz testy automatyczne. Inną zaletą tego narzędzia jest jego elastyczność i możliwość pracy w rozproszeniu. Umożliwia to uruchomienie licznych procesów na wielu maszynach w tym samym czasie, przyspieszając kompilowanie, testowanie i wdrażanie aplikacji oraz znacząco ułatwia dystrybucję na różne środowiska. Z uwagi na dużą popularność Jenkinsa na całym świecie, posiada on ogromne wsparcie społeczności zgromadzonej wokół niego.

GitLab

GitLab, znany przez deweloperów jako narzędzie do wersjonowania repozytoriów, posiada w swojej ofercie także własny system do CI. Dużą zaletą tego rozwiązania jest to, że repozytorium oraz środowisko uruchomieniowe znajdują się w jednym miejscu. Ponadto system posiada wiele zintegrowanych rozwiązań, które umożliwiają wdrażanie złożonych aplikacji. Rozbudowana integracja z Kubernetes oraz uruchomienie jego usług (np. helm) są wykorzystywane przede wszystkim przy aplikacjach opartych na mikroserwisach. GitLab Runner, serce całego narzędzia, umożliwia uruchamianie zadań z poziomu GitLab i odpowiada za bezpieczne przechowywanie danych wrażliwych. Może być skonfigurowany lokalnie, na serwerach GitLab, maszynach on-premise lub dostarczonych przez dostawcę chmury publicznej.

Konfiguracja GitLab CI odbywa się za pomocą pliku w katalogu głównym projektu o nazwie .gitlab-ci.yml. W pliku YAML definiowane są etapy działania pipeline oraz sekcje dotyczące m.in. obrazów dockerowych, poleceń oraz zmiennych. Ponadto wykorzystanie Dockera umożliwia budowanie, testy i deployment na środowiska nie tylko produkcyjne. GitLab CI zachęca do użytkowania łatwością konfiguracji, przejrzystością interfejsu oraz aktywnym wsparciem społeczności.

AWS CI

Dostawca największej chmury publicznej oferuje usługę AWS CodeBuild, jako narzędzie continuous integration do kompilacji kodu, uruchamiania testów i przygotowywania paczki do wdrożenia aplikacji. Rozwiązanie to eliminuje potrzebę udostępniania, zarządzania i skalowania własnych serwerów kompilacji, ponieważ zapewnia własną, w pełni zarządzaną usługę do kompilacji kodu źródłowego o nazwie CodeBuild. Ten dynamicznie utworzony serwer skaluje się w sposób ciągły i automatyczny, aby sprostać szczytowym żądaniom kompilacji. Inżynier DevOps konfigurujący AWS CodeBuild może skorzystać z gotowych środowisk kompilacji dla najpopularniejszych języków programowania (np. Apache, Maven), lub tworzyć niestandardowe środowiska, które korzystają z własnych narzędzi kompilacji.

Rozliczenie za CodeBuild odbywa się w modelu pay-as-you-go i płaci się za rzeczywiste wykorzystane zasoby obliczeniowe. Z narzędzia można korzystać na wiele sposobów. Amazon Web Services umożliwia użytkownikowi tworzenie i zarządzanie buildami za pomocą webowej konsoli AWS, AWS CLI, SDK oraz usługi AWS CodePipeline.

Diagram przedstawiający współpracę między Amazon Web Service CodePipeline a AWS CodeBuild

Źródło: Amazon

Buddy

Jest to polski produkt, który rozwija się bardzo dynamicznie na całym świecie. Główną zaletą tego narzędzia jest krótki czas konfiguracji procesu. Wynika to przede wszystkim z architektury Buddy, który z założenia miał być prosty i łatwy w obsłudze. Standardowy proces CI/CD można skonfigurować w ok. 10 minut. Pomaga w tym maksymalnie przyjazne UX, które pod tym względem bardzo wyróżnia się wśród konkurencji. Jednak prostota Buddy idzie w parze z jego ogromnymi możliwościami. Obecnie wspiera Dockera, Kubernetesa, najpopularniejsze języki i frameworki oraz integruje się z największymi dostawcami chmur publicznych.

Rola inżyniera DevOps w tym narzędziu niejako schodzi na dalszy plan, ponieważ Buddy posiada bogaty zestaw predefiniowanych akcji, umożliwiających konfigurację automatycznych kompilacji, testów i wdrożeń, bez konieczności pisania skryptów i wiedzy na temat języków skryptowych. Wskaż, kliknij oraz przeciągnij i upuść - to główne czynności podczas pracy z Buddy. Dodatkowo produkt posiada wiele gotowych rozwiązań (np. SSL Checker, PHP CodeSniffer, Image Compression), które potrzebują tylko kilku minut konfiguracji, podczas gdy w innych narzędziach zajęłoby to prawdopodobnie kilka godzin.

Gotowy pipeline continuous integration w narzędziu Buddy

Żródło: devstyle

Bamboo

Narzędzie firmy Atlassian zapewnia ciągłe dostarczanie od etapu pisania kodu do wdrożenia. Oprócz wbudowanej pełnej integracji z pozostałymi narzędziami producenta - Bitbucket i Jira Software - Bamboo wspiera wszystkie języki programowania i pozwala na integrację z technologiami takimi jak Docker, AWS CodeDeploy i Amazon S3. Praca z tym narzędziem składa się z konfiguracji elementów tj. plans, stages, jobs i tasks - wszystko za pomocą czytelnego i elastycznego UI. Do wykonywania tych procesów wykorzystywani są dedykowani lokalni i zdalni agenci, którzy posiadają określony zestaw możliwości. Ponadto Bamboo pozwala na realizację równolegle automatycznych testów oraz umożliwia release z wbudowanych aplikacji na wybrane środowiska testowe lub produkcyjne. Ze względu na swoją komercyjność, narzędzie zapewnia stabilność działania i posiada profesjonalny support 24/7.

Objaśnienie działania elementu plan w narzędziu Bamboo

Żródło: Atlassian

Narzędzia continuous integration - podsumowanie

Ciągła integracja jest istotnym elementem pracy inżynierów DevOps i zespołów programistycznych. Wpisuje się jako jeden z głównych aspektów procesu tworzenia oprogramowania i zarządzania projektami. Oprócz korzyści wynikających z automatyzacji procesów, wdrożenie CI prowadzi do lepszych wyników biznesowych. Organizacje, które stosują continuous integration efektywnie optymalizują zasoby ludzkie i oszczędzają pieniądze oraz czas, który można wykorzystać np. na planowanie strategii i rozwój pracowników.

3. Najlepsze praktyki zespołów programistycznych