{"id":28712,"date":"2024-08-28T10:39:59","date_gmt":"2024-08-28T08:39:59","guid":{"rendered":"https:\/\/nearshore-it.eu\/?p=28712"},"modified":"2024-09-30T06:55:50","modified_gmt":"2024-09-30T04:55:50","slug":"proces-dostarczania-oprogramowania-ci-cd","status":"publish","type":"post","link":"https:\/\/nearshore-it.eu\/pl\/artykuly\/proces-dostarczania-oprogramowania-ci-cd\/","title":{"rendered":"Jak wygl\u0105da proces dostarczania oprogramowania oparty na\u00a0CI\/CD?"},"content":{"rendered":"\n<p>Aby zobrazowa\u0107, jak CI dzia\u0142a w praktyce, mo\u017cna pos\u0142u\u017cy\u0107 si\u0119 przyk\u0142adem: kod \u017ar\u00f3d\u0142owy aplikacji zosta\u0142 zmieniony, poniewa\u017c powsta\u0142a nowa funkcjonalno\u015b\u0107. Praca rozpoczyna si\u0119 od utworzenia kopii g\u0142\u00f3wnego repozytorium kodu. System kontroli wersji przechowuje kod \u017ar\u00f3d\u0142owy w repozytorium. Aktualny stan aplikacji jest zwykle przechowywany w g\u0142\u00f3wnej ga\u0142\u0119zi repozytorium (zwanej tak\u017ce jako \u201emaster&#8221;). Programista, zaczynaj\u0105c prac\u0119 nad now\u0105 funkcjonalno\u015bci\u0105, tworzy lokalnie kopi\u0119 g\u0142\u00f3wnego repozytorium, kt\u00f3ra staje si\u0119 baz\u0105 do stworzenia nowej funkcjonalno\u015bci (a wi\u0119c dokonania zmian w kodzie \u017ar\u00f3d\u0142owym).&nbsp;&nbsp;&nbsp;<\/p>\n\n\n\n<div class=\"table-of-contents\">\n    <p class=\"title\">Przejd\u017a do:<\/p>\n    <ol>\n                    <li><a href=\"#Automatyzacja-i-testowanie\">1.  Automatyzacja i testowanie<\/a><\/li>\n                    <li><a href=\"#Integracja-i-aktualizacja-\">2.  Integracja i aktualizacja\u00a0<\/a><\/li>\n                    <li><a href=\"#Zarz\u0105dzanie-b\u0142\u0119dami-i-powiadomienia-\">3.  Zarz\u0105dzanie b\u0142\u0119dami i powiadomienia\u00a0<\/a><\/li>\n                    <li><a href=\"#Praktyka-DevOps-\">4.  Praktyka DevOps\u00a0<\/a><\/li>\n                    <li><a href=\"#Zalety-podej\u015bcia-DevOps\">5.  Zalety podej\u015bcia DevOps<\/a><\/li>\n                    <li><a href=\"#Automatyzacja-i-shift-left-testing-\">6.  Automatyzacja i shift-left testing\u00a0<\/a><\/li>\n                    <li><a href=\"#Projektowanie-ma\u0142ych-komponent\u00f3w-i-us\u0142ug-\">7.  Projektowanie ma\u0142ych komponent\u00f3w i us\u0142ug\u00a0<\/a><\/li>\n                    <li><a href=\"#Projektowanie-danych-testowych-wykorzystywanych-w-ci\u0105g\u0142ym-testowaniu-\">8.  Projektowanie danych testowych wykorzystywanych w ci\u0105g\u0142ym testowaniu\u00a0<\/a><\/li>\n                    <li><a href=\"#Rola-test\u00f3w-jednostkowych-w-ci\u0105g\u0142ym-testowaniu-\">9.  Rola test\u00f3w jednostkowych w ci\u0105g\u0142ym testowaniu\u00a0<\/a><\/li>\n                    <li><a href=\"#Jakie-narz\u0119dzia-wykorzystywane-s\u0105-w-procesie-dostarczania-oprogramowania-z-CI\/CD?-\">10.  Jakie narz\u0119dzia wykorzystywane s\u0105 w procesie dostarczania oprogramowania z CI\/CD?\u00a0<\/a><\/li>\n                    <li><a href=\"#Podsumowanie-\">11.  Podsumowanie\u00a0<\/a><\/li>\n            <\/ol>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"Automatyzacja-i-testowanie\">Automatyzacja i testowanie<\/h2>\n\n\n\n<p>Zmiany nie b\u0119d\u0105 dotyczy\u0142y tylko kodu samej aplikacji, ale te\u017c test\u00f3w (tworzenie test\u00f3w jednostkowych nowej funkcjonalno\u015bci). Jednym z kluczowych atrybut\u00f3w ci\u0105g\u0142ej integracji jest wysoki stopie\u0144 wykorzystania zautomatyzowanych test\u00f3w. Po zako\u0144czeniu wprowadzania zmian na lokalnym komputerze wykonywany jest zautomatyzowany proces kompilacji (build). W procesie tym pobierany jest kod \u017ar\u00f3d\u0142owy z lokalnego repozytorium, kt\u00f3ry jest nast\u0119pnie kompilowany, \u0142\u0105czony z plikiem wykonywalnym, a na ko\u0144cu przeprowadzane s\u0105 testy automatyczne. Build uznaje si\u0119 za prawid\u0142owy, gdy kompilacja oraz testy zako\u0144cz\u0105 si\u0119 poprawnie, bez b\u0142\u0119d\u00f3w.&nbsp;&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Integracja-i-aktualizacja\">Integracja i<strong> <\/strong>aktualizacja<\/h2>\n\n\n\n<p>Nast\u0119pnym krokiem jest zatwierdzenie zmian w repozytorium. Na tym etapie nale\u017cy uwzgl\u0119dni\u0107 zmiany wprowadzone przez innych cz\u0142onk\u00f3w w zespole, poniewa\u017c w mi\u0119dzyczasie zmiany innego programisty mog\u0142y zosta\u0107 ju\u017c zintegrowane z g\u0142\u00f3wnym repozytorium tworzonego oprogramowania. Nale\u017cy wi\u0119c najpierw zaktualizowa\u0107 lokaln\u0105 ga\u0142\u0105\u017a z kodem z g\u0142\u00f3wnej ga\u0142\u0119zi <strong>(master)<\/strong> i ponownie uruchomi\u0107 zautomatyzowan\u0105 kompilacj\u0119 <strong>(build).<\/strong> Je\u017celi w trakcie tego procesu pojawi\u0105 si\u0119 konflikty (zmiany w kodzie koliduj\u0105ce ze zmianami wprowadzonymi przez innych programist\u00f3w), nale\u017cy je rozwi\u0105za\u0107 i ponownie uruchomi\u0107 kompilacj\u0119. Gdy zako\u0144czy si\u0119 ona powodzeniem, zmiany mo\u017cna zatwierdzi\u0107 i zintegrowa\u0107 z g\u0142\u00f3wnym repozytorium.&nbsp;<\/p>\n\n\n\n<p>W tym momencie wykonywana jest ponowna kompilacja, lecz tym razem jest ona przeprowadzana na serwerze integracyjnym. Zdarza si\u0119, \u017ce podczas kompilacji na lokalnej stacji roboczej co\u015b mo\u017ce zosta\u0107 przeoczone, przez co g\u0142\u00f3wne repozytorium zostanie zaktualizowane w nieodpowiedni spos\u00f3b. Dopiero gdy zmiany w g\u0142\u00f3wnym repozytorium zbuduj\u0105 si\u0119 poprawnie na serwerze CI, mo\u017cna je b\u0119dzie uzna\u0107 za zako\u0144czone sukcesem.&nbsp;<\/p>\n\n\n\n<p>Je\u015bli dojdzie do konflikt\u00f3w w plikach zmienionych przez innych programist\u00f3w, zwykle b\u0119d\u0105 one wychwycone, gdy programista zatwierdzaj\u0105cy zmiany utworzy zaktualizowan\u0105 kopi\u0119 robocz\u0105, a sama kompilacja zako\u0144czy si\u0119 niepowodzeniem. B\u0142\u0105d jest szybko wy\u0142apany, a zadaniem programist\u00f3w jest zlokalizowanie \u017ar\u00f3d\u0142a b\u0142\u0119d\u00f3w i naprawienie ich. W \u015brodowisku CI nale\u017cy unika\u0107 sytuacji, w kt\u00f3rych przez d\u0142u\u017cszy czas kompilacje integracyjne ko\u0144cz\u0105 si\u0119 b\u0142\u0119dem \u2013 trzeba je naprawi\u0107 najszybciej, jak to mo\u017cliwe.&nbsp;<\/p>\n\n\n\n<p>Po pomy\u015blnej kompilacji na serwerze ci\u0105g\u0142ej integracji nowe zmiany mo\u017cna wprowadzi\u0107 na przyk\u0142ad na \u015brodowiska testowe, gdzie testerzy b\u0119d\u0105 mogli przeprowadza\u0107 testy na aktualnej wersji oprogramowania zawieraj\u0105cej najnowsze zmiany.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Zarz\u0105dzanie-b\u0142\u0119dami-i-powiadomienia\">Zarz\u0105dzanie b\u0142\u0119dami i powiadomienia<\/h2>\n\n\n\n<p>Na ka\u017cdym etapie procesu ci\u0105g\u0142ej integracji po stronie serwera, w razie niepowodzenia w budowaniu projektu, mo\u017cna zaimplementowa\u0107 narz\u0119dzia raportuj\u0105ce b\u0142\u0119dy. W ten spos\u00f3b, w przypadku wyst\u0105pienia b\u0142\u0119du w kt\u00f3rym\u015b kroku kompilacji \u2013 odpowiedni u\u017cytkownicy mog\u0105 zosta\u0107 powiadomieni, na przyk\u0142ad za pomoc\u0105 wiadomo\u015bci e-mail lub powiadomienia na firmowym czacie.&nbsp;<\/p>\n\n\n\n<p>Przyk\u0142adowy og\u00f3lny schemat procesu ci\u0105g\u0142ej integracji:&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"426\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/08\/blog_2024.05.16_graphic_2.png\" alt=\"chemat procesu ci\u0105g\u0142ej integracji CI\" class=\"wp-image-28713\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/08\/blog_2024.05.16_graphic_2.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/08\/blog_2024.05.16_graphic_2-300x168.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/08\/blog_2024.05.16_graphic_2-495x277.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"Praktyka-DevOps\">Praktyka DevOps<\/h2>\n\n\n\n<p>Termin DevOps pochodzi z po\u0142\u0105czenia dw\u00f3ch s\u0142\u00f3w: development i operations (programowanie i operacje). S\u0142u\u017cy do okre\u015blenia podej\u015bcia do rozwoju oprogramowania zak\u0142adaj\u0105cego zmniejszanie barier pomi\u0119dzy zespo\u0142ami deweloperskimi i operacyjnymi firmy. Celem DevOps jest skr\u00f3cenie czasu wprowadzenia produktu na rynek. Oznacza to przyj\u0119cie i wdro\u017cenie pewnych praktyk w celu skr\u00f3cenia czasu od identyfikacji nowego wymagania do momentu jego wdro\u017cenia dla klient\u00f3w. W podej\u015bciu tym wykorzystywana jest omawiana ci\u0105g\u0142a integracja i ci\u0105g\u0142e dostarczanie, kt\u00f3re pomagaj\u0105 skr\u00f3ci\u0107 czas wprowadzenia produktu na rynek i stworzy\u0107 oprogramowanie lepszej jako\u015bci.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Historia-i-rozw\u00f3j\">Historia i rozw\u00f3j<\/h3>\n\n\n\n<p>Celem DevOps jest skr\u00f3cenie czasu wprowadzenia produktu na rynek. Filozofia DevOps narodzi\u0142a si\u0119 w 2008 roku podczas konferencji Agile w Toronto, kiedy&nbsp; Patrick Debois wyg\u0142osi\u0142 wyk\u0142ad pod tytu\u0142em \u201eInfrastructure and Operations\u201c. Wyja\u015bni\u0142 w nim zastosowanie podej\u015bcia Agile do budowy infrastruktury, a na koniec zaproponowa\u0142 lepsz\u0105 metod\u0119 komunikacji oraz pomys\u0142y, dzi\u0119ki kt\u00f3rym programi\u015bci mogliby \u201e poszerza\u0107 swoje horyzonty\u201d, w sensie pog\u0142\u0119biania wiedzy systemowej niezb\u0119dnej do zapewnienia p\u0142ynniejszego procesu wydawania oprogramowania. Mija\u0142y lata, a podej\u015bcie DevOps stawa\u0142o si\u0119 coraz bardziej popularne, a w \u015blad za nim pojawi\u0142a si\u0119 nowa rola w \u015bwiecie IT \u2013 in\u017cynier DevOps.&nbsp;&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Rola-in\u017cyniera-DevOps\">Rola in\u017cyniera DevOps<\/h3>\n\n\n\n<p>In\u017cynier DevOps stanowi swego rodzaju pomost pomi\u0119dzy programistami a dzia\u0142em operacyjnym. W wi\u0119kszo\u015bci przypadk\u00f3w rola, jak\u0105 przyjmuje, jest ich mieszank\u0105 (in\u017cynierowie ci musz\u0105 posiada\u0107 wiedz\u0119 niezb\u0119dn\u0105 do doradzania i zarz\u0105dzania problemem z obu dyscyplin). W niekt\u00f3rych przypadkach odpowiedzialno\u015b\u0107 in\u017cyniera DevOps zwi\u0105zana jest z ci\u0105g\u0142\u0105 integracj\u0105 i dostarczaniem. Inne obowi\u0105zki obejmuj\u0105 zarz\u0105dzanie infrastruktur\u0105, zazwyczaj w postaci kodu (IaC) oraz pomoc we wdra\u017caniu optymalnych praktyk DevOps w ca\u0142ej firmie. Czasem in\u017cyniera DevOps postrzega si\u0119 go tak\u017ce jako osob\u0119 odpowiedzialn\u0105 g\u0142\u00f3wnie za utrzymanie oprogramowania w \u015brodowisku produkcyjnym i automatyzacj\u0119 proces\u00f3w, rozwi\u0105zywanie problem\u00f3w, administrowanie systemem.&nbsp; Rola in\u017cyniera DevOps jest zr\u00f3\u017cnicowana i mo\u017ce zmienia\u0107 si\u0119 w zale\u017cno\u015bci od firmy.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zalety podej\u015bcia DevOps<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Efektywno\u015b\u0107 i wsp\u00f3\u0142praca&nbsp;<\/h3>\n\n\n\n<p>Zespo\u0142y, kt\u00f3re wdra\u017caj\u0105 podej\u015bcie DevOps, staj\u0105 si\u0119 bardziej wydajne, dzi\u0119ki czemu tworzone oprogramowanie wydawane jest nie tylko szybciej, ale te\u017c jest bardziej stabilne. Lepsza wsp\u00f3\u0142praca i zwi\u0119kszona produktywno\u015b\u0107 pozwalaj\u0105 te\u017c osi\u0105ga\u0107 cele biznesowe, takie jak szybsze wprowadzenie produktu na rynek czy utrzymanie jego niezawodno\u015bci i stabilno\u015bci w ka\u017cdych warunkach. Zastosowanie metodyki DevOps nie tylko pozwala zautomatyzowa\u0107 i optymalizowa\u0107 procesy za pomoc\u0105 technologii. Jest to przede wszystkim zmiana kultury wewn\u0105trz organizacji i ludzi zaanga\u017cowanych w ten proces.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Wdro\u017cenie kultury DevOps wymaga g\u0142\u0119bokich zmian w dotychczasowym sposobie pracy zespo\u0142\u00f3w i przestrzegania okre\u015blonych zasad, jednak te zmiany pozwalaj\u0105 stworzy\u0107 \u015brodowisko pracy o wysokiej wydajno\u015bci.&nbsp;&nbsp; Cech\u0105 charakterystyczn\u0105 DevOps jest \u015bcis\u0142a wsp\u00f3\u0142praca mi\u0119dzy zespo\u0142ami. R\u00f3\u017cne zespo\u0142y, na przyk\u0142ad zespo\u0142y deweloper\u00f3w i odpowiedzialne za operacje, musz\u0105 dzieli\u0107 si\u0119 swoimi procesami, priorytetami i problemami. Musz\u0105 tak\u017ce wsp\u00f3lnie planowa\u0107 prac\u0119 oraz cele i \u015brodki zwi\u0105zane z ich osi\u0105gni\u0119ciem. W miar\u0119 jak zespo\u0142y dostosowuj\u0105 si\u0119 do nowej rzeczywisto\u015bci, obowi\u0105zki w poszczeg\u00f3lnych rolach r\u00f3wnie\u017c zaczynaj\u0105 si\u0119 poszerza\u0107. Na przyk\u0142ad deweloperzy staj\u0105 si\u0119 odpowiedzialni nie tylko za tworzenie aplikacji w fazie programowania, ale te\u017c za wydajno\u015b\u0107 i stabilno\u015b\u0107 w fazie dzia\u0142ania. Jednocze\u015bnie zesp\u00f3\u0142 operacji uwzgl\u0119dnia nadz\u00f3r, zabezpieczenia i zgodno\u015b\u0107 w fazach planowania i programowania.&nbsp;&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Elastyczno\u015b\u0107 i reaktywno\u015b\u0107&nbsp;<\/h3>\n\n\n\n<p>Elastyczno\u015b\u0107 zespo\u0142\u00f3w pozwala na wydawanie oprogramowania w kr\u00f3tszych cyklach. \u0141atwiej jest planowa\u0107 wdra\u017canie zmian i zarz\u0105dza\u0107 ryzykiem \u2013 to droga do stworzenia stabilnego produktu. Kr\u00f3tsze cykle wydawania nowych wersji pozwalaj\u0105 tak\u017ce sprawniej reagowa\u0107 na zmiany zachodz\u0105ce na rynku, dzi\u0119ki czemu mo\u017cna szybciej dostosowa\u0107 si\u0119 do zmian potrzeb klient\u00f3w i nie odstawa\u0107 od konkurencji. Podej\u015bcie DevOps stanowi state-of-the-art nowoczesnego tworzenia oprogramowania i jest dzi\u015b pierwszym wyborem wielu firm z tego powodu, \u017ce promuje najlepsze praktyki niezb\u0119dne do poprawy jako\u015bci oprogramowania. DevOps wymaga zmiany nie tylko w sposobie my\u015blenia o infrastrukturze, ale tak\u017ce w&nbsp; zakresie dobrego projektowania i organizowania wewn\u0119trznej infrastruktury firmy.&nbsp;&nbsp;&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ci\u0105g\u0142e testowanie&nbsp;<\/h3>\n\n\n\n<p>Ci\u0105g\u0142e testowanie (Continuous Testing, CT) to umiej\u0119tne wykorzystanie pewnych narz\u0119dzi i technik. Cytuj\u0105c <a href=\"https:\/\/sjsi.org\/ist-qb\/do-pobrania\/\" target=\"_blank\" rel=\"noreferrer noopener\">sylabus ISTQB<\/a>, ci\u0105g\u0142e testowanie to:&nbsp;&nbsp;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201ePodej\u015bcie obejmuj\u0105ce proces wczesnego, cz\u0119stego, szerokiego, automatycznego testowania w celu otrzymania mo\u017cliwie szybko informacji zwrotnej o poziomie ryzyka biznesowego zwi\u0105zanego z aplikacj\u0105 przed jej wydaniem\u201d.&nbsp;&nbsp;<\/p>\n<\/blockquote>\n\n\n\n<p><\/p>\n\n\n\n<p>Podej\u015bcie to znacznie skraca czas potrzebny do wykonania test\u00f3w manualnych.&nbsp;<\/p>\n\n\n\n<p>G\u0142\u00f3wnym celem wprowadzenia podej\u015bcia CI\/CD jest poprawa jako\u015bci wydawanego oprogramowania, a ci\u0105g\u0142e testowanie i kontrola powinny by\u0107 cz\u0119\u015bci\u0105 tego procesu.&nbsp; Celem ci\u0105g\u0142ego testowania jest zapewnienie, \u017ce wydawane oprogramowanie b\u0119dzie niezawodne.&nbsp; W tym celu tworzy si\u0119 r\u00f3\u017cnego rodzaju testy, kt\u00f3re mog\u0105 by\u0107 wykonywane automatycznie za ka\u017cdym razem, gdy oprogramowanie jest budowane.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Poziomy test\u00f3w w ci\u0105g\u0142ym testowaniu&nbsp;<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"320\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/08\/blog_2024.05.16_graphic_3.png\" alt=\"Poziomy test\u00f3w w ci\u0105g\u0142ym testowaniu\u00a0\" class=\"wp-image-28716\" style=\"width:1160px;height:auto\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/08\/blog_2024.05.16_graphic_3.png 762w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/08\/blog_2024.05.16_graphic_3-300x126.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/08\/blog_2024.05.16_graphic_3-495x208.png 495w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><\/figure>\n<\/div>\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Testy jednostkowe<\/strong> \u2013 baz\u0119 test\u00f3w automatycznych stanowi\u0105 testy jednostkowe. S\u0105 one wykonywane za ka\u017cdym razem, gdy oprogramowanie jest kompilowane i budowane.&nbsp;&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Testy integracyjne<\/strong> \u2013 kolejnym poziomem test\u00f3w, kt\u00f3ry nale\u017cy w\u0142\u0105czy\u0107, s\u0105 testy integracyjne. S\u0105 one przeprowadzane po testach jednostkowych i wykorzystuj\u0105 rzeczywiste dane. Testy integracyjne s\u0105 wa\u017cn\u0105 faz\u0105 w ci\u0105g\u0142ym testowaniu, poniewa\u017c odpowiadaj\u0105 za testowanie ca\u0142ego systemu, a nie tylko tworzonego kodu.&nbsp;&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Testy akceptacyjne (E2E)<\/strong> \u2013 ostatni\u0105 faz\u0105 s\u0105 testy akceptacyjne. W tej fazie wykonywane s\u0105 testy przygotowane przez zesp\u00f3\u0142 QA w celu przetestowania systemu z punktu widzenia u\u017cytkownika. Celem tej fazy jest weryfikacja wymaga\u0144 u\u017cytkownika i ich walidacja.&nbsp;<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Kontrola kodu&nbsp;<\/h3>\n\n\n\n<p>Opr\u00f3cz r\u00f3\u017cnych faz testowania, istnieje tak\u017ce faza kontroli kodu. Polega ona na sprawdzeniu kodu przy wykorzystaniu zestawu regu\u0142 wykorzystywanych do sporz\u0105dzenia raportu na temat samego oprogramowania. Mo\u017cna j\u0105 podzieli\u0107 na dwie fazy:&nbsp;&nbsp;<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Przegl\u0105d kodu&nbsp;<\/strong>wykonywany przez programist\u0119, kt\u00f3ry nie jest&nbsp; jego autorem. Przed integracj\u0105 z g\u0142\u00f3wn\u0105 ga\u0142\u0119zi\u0105 (master) kod musi zosta\u0107 zatwierdzony. Cz\u0142onkowie zespo\u0142u sprawdzaj\u0105 kod i dodaj\u0105 komentarze, je\u015bli jakie\u015b fragmenty wymagaj\u0105 zmian. W tym przypadku autor kodu dokonuje zmian na ich podstawie, a po sko\u0144czonej pracy kod ponownie trafia do przegl\u0105du. Je\u015bli nikt nie b\u0119dzie mia\u0142 zastrze\u017ce\u0144 \u2013 kod zostanie zaakceptowany i scalony z g\u0142\u00f3wn\u0105 ga\u0142\u0119zi\u0105.&nbsp;<\/li>\n\n\n\n<li><strong>Faza statycznej analizy<\/strong> jest wykonywana przez odpowiednie narz\u0119dzia. Kod mo\u017ce zosta\u0107 wtedy zweryfikowany przez pewne regu\u0142y, na przyk\u0142ad sprawdzaj\u0105ce z\u0142o\u017cono\u015b\u0107 metod.&nbsp;&nbsp;<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Automatyzacja i shift-left testing&nbsp;<\/h2>\n\n\n\n<p>Ci\u0105g\u0142e testowanie wykorzystuje podej\u015bcia automatyzacji do przyspieszenia testowania poprzez przyj\u0119cie podej\u015bcia shift-left testing, kt\u00f3re \u0142\u0105czy etapy wytwarzania oprogramowania i zapewniania jako\u015bci. Takie podej\u015bcie mo\u017ce obejmowa\u0107 zestaw przep\u0142yw\u00f3w pracy test\u00f3w automatycznych, kt\u00f3re mo\u017cna \u0142\u0105czy\u0107 z narz\u0119dziami raportuj\u0105cymi i metrykami w celu otrzymania jasnego obrazu jako\u015bci oprogramowania.&nbsp;<\/p>\n\n\n\n<p>Zapewnia to zespo\u0142om projektowym otrzymanie szybkiej informacji zwrotnej na temat jako\u015bci oprogramowania. Pozwala r\u00f3wnie\u017c testowa\u0107 na wcze\u015bniejszych etapach wytwarzania oprogramowania oraz zwi\u0119kszy\u0107 pokrycie testami, eliminuj\u0105c w\u0105skie gard\u0142a testowe, takie jak: dost\u0119p do wsp\u00f3\u0142dzielonych \u015brodowisk testowych czy oczekiwanie na stabilny interfejs u\u017cytkownika.&nbsp;<\/p>\n\n\n\n<p><strong>Ci\u0105g\u0142e testowanie niesie ze sob\u0105 szereg korzy\u015bci, takich jak:<\/strong>&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Integrowanie zespo\u0142\u00f3w testowych, deweloperskich i operacyjnych na ka\u017cdym etapie cyklu \u017cycia oprogramowania.&nbsp;<\/li>\n\n\n\n<li>Pozwala na wdro\u017cenie test\u00f3w automatycznych w takim zakresie, jak to tylko mo\u017cliwe, aby stale testowa\u0107 kluczowe funkcje.&nbsp;<\/li>\n\n\n\n<li>Szybkie i ci\u0105g\u0142e informacje zwrotne, kt\u00f3re s\u0105 istotne r\u00f3wnie\u017c dla biznesu.&nbsp;<\/li>\n\n\n\n<li>Usuni\u0119cie w\u0105skich garde\u0142 w kwestii dost\u0119pno\u015bci \u015brodowisk testowych, kt\u00f3re mog\u0105 by\u0107 stale dost\u0119pne.&nbsp;<\/li>\n\n\n\n<li>Pozwala na sta\u0142e i aktywne zarz\u0105dzanie jako\u015bci\u0105 w ca\u0142ym etapie dostarczania oprogramowania.\u202f&nbsp;<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Fundamenty ci\u0105g\u0142ego testowania&nbsp;<\/h3>\n\n\n\n<p>Ci\u0105g\u0142e testowanie opiera si\u0119 na kombinacji okre\u015blonych narz\u0119dzi i technik. Odpowiednie ich wdro\u017cenie tworzy system, dzi\u0119ki kt\u00f3remu znacz\u0105co mo\u017cna ograniczy\u0107 liczb\u0119 b\u0142\u0119d\u00f3w przedostaj\u0105cych si\u0119 na \u015brodowiska rozwojowe lub produkcyjne. Wi\u0119kszo\u015b\u0107 b\u0142\u0119d\u00f3w ma bardzo kr\u00f3tk\u0105 \u017cywotno\u015b\u0107, poniewa\u017c s\u0105 one wy\u0142apywane przez testy. Odpowiednie zaimplementowanie tego podej\u015bcia powinno rozpoczyna\u0107 si\u0119 na jak najwcze\u015bniejszym etapie cyklu \u017cycia oprogramowania, aby m\u00f3c je odpowiednio budowa\u0107, aktualizowa\u0107 i (w razie potrzeby) refaktoryzowa\u0107. Sama budowa i dzia\u0142anie zale\u017c\u0105 w g\u0142\u00f3wnej mierze od potrzeb projektowych \u2013 inne testy i techniki b\u0119d\u0105 wykorzystywane do testowania sklepu internetowego, inne do testowania system\u00f3w w bran\u017cy automotive. Lecz niezale\u017cnie od przypadku, cel pozostanie ten sam \u2013 uzyskanie jak najszybciej informacji zwrotnej w przypadku wyst\u0105pienia b\u0142\u0119du.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Projektowanie ma\u0142ych komponent\u00f3w i us\u0142ug&nbsp;<\/h2>\n\n\n\n<p>Idea ci\u0105g\u0142ego testowania polega na maksymalnym zautomatyzowaniu proces\u00f3w testowania i wdra\u017cania oraz zapewnieniu, \u017ce ka\u017cdy komponent aplikacji mo\u017ce zosta\u0107 poddany testom, gdy tylko zostanie opracowany. Przyk\u0142ady, kt\u00f3re mog\u0105 u\u0142atwi\u0107 implementacj\u0119 tego podej\u015bcia to: projektowanie ma\u0142ych komponent\u00f3w i us\u0142ug oraz projektowanie danych testowych wykorzystywanych w ci\u0105g\u0142ym testowaniu.&nbsp;<\/p>\n\n\n\n<p>Projektowanie ma\u0142ych komponent\u00f3w i us\u0142ug \u2013 nowe komponenty powinny nie tylko spe\u0142nia\u0107 okre\u015blone funkcje w trakcie dzia\u0142ania programu, ale r\u00f3wnie\u017c by\u0107 w pe\u0142ni testowalne niezale\u017cnie od innych komponent\u00f3w. Celem jest zapewnienie, \u017ce ka\u017cda w pe\u0142ni przetestowana us\u0142uga b\u0119dzie spe\u0142nia\u0142a swoje zadania zgodnie z za\u0142o\u017ceniami, aby w trakcie ich \u0142\u0105czenia i przej\u015bcia do etapu test\u00f3w integracyjnych komponenty bezproblemowo wsp\u00f3\u0142pracowa\u0142y ze sob\u0105.. Nale\u017cy wi\u0119c ju\u017c na etapie projektowania odpowiednio przygotowa\u0107 architektur\u0119 i ograniczy\u0107 sprz\u0119\u017cenie komponent\u00f3w tak bardzo, jak to mo\u017cliwe. W efekcie zyskamy komponenty bardziej stabilne, kt\u00f3re zmniejsza ryzyko, \u017ce jakakolwiek zmiana dokonana w komponencie \u201eA&#8221; spowoduje nieoczekiwan\u0105 zmian\u0119 zachowania w innych komponentach. Ograniczenie po\u0142\u0105cze\u0144 mi\u0119dzy nimi upraszcza proces testowania, rozwi\u0105zywania problem\u00f3w oraz konserwacji. Dodatkowo w \u0142atwiejszy spos\u00f3b mo\u017cna izolowa\u0107 ewentualne problemy \u2013 analizie zostanie poddany konkretny komponent, bez potrzeby przeszukiwania ich grup i zale\u017cno\u015bci mi\u0119dzy nimi.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Projektowanie danych testowych wykorzystywanych w ci\u0105g\u0142ym testowaniu&nbsp;<\/h2>\n\n\n\n<p>Posiadanie w pe\u0142ni zautomatyzowanego rozwi\u0105zania do zarz\u0105dzania danymi testowymi jest niezb\u0119dne do solidnego wdro\u017cenia ci\u0105g\u0142ego testowania. Z\u0142ym podej\u015bciem by\u0142oby na przyk\u0142ad kopiowanie produkcyjnej bazy danych w celu utworzenia danych testowych, nie anonimizuj\u0105c uprzednio wra\u017cliwych danych. Tworzenie nowych zestaw\u00f3w danych testowych od zera dla ka\u017cdej serii test\u00f3w r\u00f3wnie\u017c nie jest dobrym pomys\u0142em ze wzgl\u0119du na bardzo s\u0142ab\u0105 efektywno\u015b\u0107, zw\u0142aszcza gdy nie s\u0105 generowane automatycznie.&nbsp;<\/p>\n\n\n\n<p>Jak zatem stworzy\u0107 skuteczne rozwi\u0105zania do generowania i zarz\u0105dzania danymi testowymi? Z pomoc\u0105 przychodz\u0105 pewne charakterystyki, do kt\u00f3rych mo\u017cna zaliczy\u0107 na przyk\u0142ad:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tworzenie i generowanie danych testowych&nbsp;<\/strong><br>Daje mo\u017cliwo\u015b\u0107 tworzenia nowych, zbiorczych zestaw\u00f3w danych uwzgl\u0119dniaj\u0105cych zale\u017cno\u015bci, tak jakby pochodzi\u0142y ze \u015brodowiska produkcyjnego.&nbsp;<\/li>\n\n\n\n<li><strong>Mo\u017cliwo\u015b\u0107 pobrania pewnego podzbioru danych produkcyjnych&nbsp;<\/strong><br>Na podstawie okre\u015blonych kryteri\u00f3w, maskowania wra\u017cliwych p\u00f3l i umieszczania ich w \u015brodowisku testowym, zachowuj\u0105c ich integralno\u015b\u0107 referencyjn\u0105. Najtrudniejsza w realizacji jest ostatnia cz\u0119\u015b\u0107: wra\u017cliwe pola musz\u0105 by\u0107 zamaskowane w taki spos\u00f3b, aby zachowa\u0107 oryginalne powi\u0105zania mi\u0119dzy danymi. Przyk\u0142adowo, je\u015bli warto\u015b\u0107 numeru PESEL musi zosta\u0107 zamaskowana i zast\u0105piona niepowi\u0105zan\u0105 warto\u015bci\u0105, ka\u017cde odwo\u0142anie do tego numeru PESEL w bazie danych musi zosta\u0107 zamaskowane t\u0105 sam\u0105 warto\u015bci\u0105.&nbsp;<\/li>\n\n\n\n<li><strong>Mo\u017cliwo\u015b\u0107 maskowania i transformacji danych&nbsp;<\/strong><br>Rozwi\u0105zanie powinno te\u017c zapewni\u0107 mo\u017cliwo\u015b\u0107 automatycznego por\u00f3wnania danych wst\u0119pnie zamaskowanych, aby upewni\u0107 si\u0119, \u017ce nie dosz\u0142o do ich utraty i \u017ce proces maskowania nie spowodowa\u0142 b\u0142\u0119d\u00f3w w ich integralno\u015bci.&nbsp;<\/li>\n\n\n\n<li><strong>Mo\u017cliwo\u015b\u0107 przesy\u0142ania danych&nbsp;<\/strong><br>Proces polegaj\u0105cy na przesy\u0142aniu wyodr\u0119bnionych, zamaskowanych danych na \u015brodowiska testowe, z zachowaniem integralno\u015bci. Proces ten powinien obejmowa\u0107 funkcje dodawania, edytowania, aktualizacji i usuwania.&nbsp;<\/li>\n\n\n\n<li><strong>Mo\u017cliwo\u015b\u0107 od\u015bwie\u017cania danych&nbsp;<\/strong><br>Polega na okresowym przegl\u0105dzie i usuwaniu starych pakiet\u00f3w danych testowych oraz zamienianiu ich na nowy zestaw.&nbsp;<\/li>\n\n\n\n<li><strong>Ekstrakcja danych i tworzenie ich podzbior\u00f3w&nbsp;<\/strong><br>Pozwala na tworzenie mniejszych kopii danych produkcyjnych zdefiniowanych za pomoc\u0105 okre\u015blonych kryteri\u00f3w.&nbsp;<\/li>\n\n\n\n<li><strong>\u201ePostarzanie&#8221; danych&nbsp;<\/strong><br>Technika, w kt\u00f3rej dane s\u0105 zmieniane w celu dopasowania ich do okre\u015blonych, specyficznych warunk\u00f3w i wykorzystania ich w pewnych procesach (na przyk\u0142ad symulacji okre\u015blonej godziny lub daty).&nbsp;<\/li>\n\n\n\n<li><strong>Mo\u017cliwo\u015b\u0107 tworzenia i wyodr\u0119bniania danych testowych&nbsp;<\/strong><\/li>\n\n\n\n<li><strong>Zarz\u0105dzanie zbiorami danych&nbsp;<\/strong><\/li>\n\n\n\n<li>Wykorzystanie narz\u0119dzi, kt\u00f3re umo\u017cliwiaj\u0105 nie tylko zarz\u0105dzanie wieloma zbiorami danych, ale tak\u017ce ich archiwizacj\u0119 i wersjonowanie.\u202f&nbsp;<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Rola test\u00f3w jednostkowych w ci\u0105g\u0142ym testowaniu&nbsp;<\/h2>\n\n\n\n<p>Podstaw\u0119 test\u00f3w w podej\u015bciu ci\u0105g\u0142ego testowania, zgodnie z piramid\u0105 test\u00f3w, stanowi\u0105 testy jednostkowe. S\u0105 one najszybsze w wykonaniu i sprawdzaj\u0105 dzia\u0142anie oprogramowania we wczesnej fazie jego wytwarzania. Powinno ich wi\u0119c by\u0107 jak najwi\u0119cej (przy zachowaniu odpowiedniego stosunku liczby do jako\u015bci \u2013 nie jest prawd\u0105, \u017ce wi\u0119ksza liczba test\u00f3w stanowi o jako\u015bci).&nbsp;&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Projektowanie test\u00f3w jednostkowych&nbsp;<\/h3>\n\n\n\n<p>Zdarza si\u0119, \u017ce testy jednostkowe s\u0105 \u017ale zaprojektowane i zamiast jednostek testuj\u0105 kompletne przypadki u\u017cycia (wywo\u0142anie metod, asercje, wywo\u0142anie wi\u0119kszej liczby metod i tworzenie wi\u0119kszej liczby asercji). Takie testy s\u0105 zwykle niestabilne, a b\u0142\u0119dy wykryte w jednej cz\u0119\u015bci kodu mog\u0105 maskowa\u0107 inne b\u0142\u0119dy i utrudnia\u0107 ich wykrycie. Aby temu zapobiec, nale\u017cy przeanalizowa\u0107 takie testy, wyodr\u0119bni\u0107 z nich poszczeg\u00f3lne, testowane funkcjonalno\u015bci i asercje i rozbi\u0107 je na mniejsze testy sprawdzaj\u0105ce ka\u017cd\u0105 funkcjonalno\u015b\u0107 z osobna.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Implementacja test\u00f3w na r\u00f3\u017cnych poziomach&nbsp;<\/h3>\n\n\n\n<p>Testowanie bardziej z\u0142o\u017conych \u015bcie\u017cek, dajmy na to przypadk\u00f3w u\u017cycia, powinno zosta\u0107 zaimplementowane na przyk\u0142ad w testach akceptacyjnych. W ci\u0105g\u0142ym testowaniu mo\u017cna wykonywa\u0107 wszystkie rodzaje test\u00f3w, lecz im wy\u017cszy poziom test\u00f3w, tym liczba przypadk\u00f3w testowych powinna by\u0107 mniejsza (s\u0105 one mniej stabilne, czas ich wykonywania jest d\u0142u\u017cszy, wykrywaj\u0105 b\u0142\u0119dy w p\u00f3\u017aniejszych etapach, przez co wyd\u0142u\u017ca si\u0119 czas naprawy, a koszt ro\u015bnie).&nbsp;<\/p>\n\n\n\n<p>Dotyczy to zw\u0142aszcza test\u00f3w UI (User Interface), gdy testowana jest logika biznesowa i zachowanie interfejsu u\u017cytkownika. Mo\u017ce tu doj\u015b\u0107 do wielu wsp\u00f3\u0142zale\u017cnych awarii. Oddzielenie warstwy interfejsu od systemu bazowego, aby logika biznesowa mog\u0142a zosta\u0107 opatrzona za\u015blepkami (mock) jest istotn\u0105 zmian\u0105 zbli\u017caj\u0105c\u0105 nas do wi\u0119kszej stabilno\u015bci test\u00f3w.&nbsp;<\/p>\n\n\n\n<p>Jednym z podej\u015b\u0107 jest uruchamianie test\u00f3w jednostkowych w spos\u00f3b ci\u0105g\u0142y, a test\u00f3w wy\u017cszych poziom\u00f3w \u2013 na \u017c\u0105danie (nie musz\u0105 one by\u0107 uruchamiane automatycznie w trakcie budowy projektu w narz\u0119dziu ci\u0105g\u0142ej integracji \u2013 zamiast tego, istnieje mo\u017cliwo\u015b\u0107 uruchomienia ich w spos\u00f3b manualny, gdy potrzeba).&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rola podej\u015bcia TDD&nbsp;<\/h3>\n\n\n\n<p>Praktykowanie podej\u015bcia TDD (Test-Driven Development) w wytwarzaniu oprogramowania u\u0142atwia zrozumienie i wdro\u017cenie ci\u0105g\u0142ego testowania. W TDD testy tworzone s\u0105 przed implementacj\u0105 funkcjonalno\u015bci. Najpierw tworzony jest ma\u0142y test, po kt\u00f3rym nast\u0119puje implementowanie powi\u0105zanego fragmentu ca\u0142ej funkcjonalno\u015bci. Nast\u0119pnie dokonuje si\u0119 refaktoryzacji w celu ulepszenia kodu i wyeliminowania ewentualnych powiele\u0144. Dzi\u0119ki ci\u0105g\u0142emu testowaniu otrzymujemy natychmiastow\u0105 informacj\u0119 zwrotn\u0105 na ka\u017cdym z tych krok\u00f3w. Nie tylko z tego jednego testu, kt\u00f3ry jest w danym momencie pisany, lecz ze wszystkich powi\u0105zanych test\u00f3w, bez dodatkowego wysi\u0142ku i zaanga\u017cowania ze strony programisty. Dzi\u0119ki temu mo\u017ce on skupi\u0107 si\u0119 w pe\u0142ni na projektowaniu i pisaniu kodu, zamiast rozprasza\u0107 si\u0119 konieczno\u015bci\u0105 uruchamiania test\u00f3w.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cel ci\u0105g\u0142ego testowania&nbsp;<\/h3>\n\n\n\n<p>Zar\u00f3wno w podej\u015bciu TDD, jak i w ci\u0105g\u0142ym testowaniu, celem jest jak najszybsze uzyskanie informacji zwrotnej. Pod wieloma wzgl\u0119dami naturalnym rezultatem skutecznego stosowania TDD jest dobrej jako\u015bci zestaw test\u00f3w. R\u00f3\u017cnica polega na tym, \u017ce stosuj\u0105c ci\u0105g\u0142e testowanie, zyskuje si\u0119 dodatkowe \u017ar\u00f3d\u0142a informacji zwrotnych. Stary aksjomat podej\u015bcia TDD m\u00f3wi, \u017ce testy sprawdzaj\u0105 poprawno\u015b\u0107 kodu, z kolei kod weryfikuje poprawno\u015b\u0107 test\u00f3w. Testy sprawdzaj\u0105 r\u00f3wnie\u017c projekt kodu \u2013 \u017ale zaprojektowany kod jest trudny do przetestowania.\u202f&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jakie narz\u0119dzia wykorzystywane s\u0105 w procesie dostarczania oprogramowania z CI\/CD?&nbsp;<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Jenkins&nbsp;<\/h3>\n\n\n\n<p>Jenkins to serwer ci\u0105g\u0142ej integracji (CI) typu open source.&nbsp; Kontroluje kilka etap\u00f3w procesu dostarczania oprogramowania, takie jak testowanie, kompilacja i wdra\u017canie. Popularno\u015b\u0107 tego narz\u0119dzia wynika mi\u0119dzy innymi z jego mo\u017cliwo\u015bci \u015bledzenia i monitorowania powtarzalnych dzia\u0142a\u0144 pojawiaj\u0105cych si\u0119 w trakcie prac nad projektem. Ka\u017cda zmiana w aplikacji jest kompilowana i testowana, a w razie wykrycia b\u0142\u0119du Jenkins ostrze\u017ce zesp\u00f3\u0142 o problemach.&nbsp;<\/p>\n\n\n\n<p><strong>Wdro\u017cenie kodu na produkcj\u0119<\/strong>&nbsp;<\/p>\n\n\n\n<p>Jednym z podstawowych zastosowa\u0144 Jenkinsa jest mo\u017cliwo\u015b\u0107 wdra\u017cania kodu na produkcj\u0119. Je\u015bli wszystkie testy opracowane dla danej funkcji lub releasu zako\u0144cz\u0105 si\u0119 powodzeniem, Jenkins mo\u017ce automatycznie opublikowa\u0107 kod na \u015brodowisku staging lub produkcyjnym (jest to w\u0142a\u015bnie przyk\u0142ad Continuous Deployment opisanego w poprzednim artykule).&nbsp;<\/p>\n\n\n\n<p><strong>A<\/strong><strong>ut<\/strong><strong>o<\/strong><strong>matyzacja <\/strong><strong>w<\/strong><strong>orkflow<\/strong><strong> i r\u00f3\u017cnych zada\u0144<\/strong><strong><\/strong>&nbsp;<\/p>\n\n\n\n<p>Innym przypadkiem, w kt\u00f3rym mo\u017cna u\u017cy\u0107 Jenkinsa, jest m.in. automatyzacja workflow. Na przyk\u0142ad, gdy programista pracuje na kilku \u015brodowiskach, w pewnym momencie zajdzie konieczno\u015b\u0107 instalacji lub aktualizacji pewnych komponent\u00f3w na ka\u017cdym z nich. Je\u015bli instalacja lub aktualizacja wymaga wykonania wielu krok\u00f3w, przeprowadzenie jej r\u0119cznie mo\u017ce skutkowa\u0107 pojawieniem si\u0119 b\u0142\u0119d\u00f3w, a dodatkowo b\u0119dzie czasoch\u0142onne. Zamiast tego wszystkie kroki potrzebne do finalizacji mo\u017cna odpowiednio skonfigurowa\u0107 w Jenkinsie. Dzi\u0119ki temu ca\u0142y proces b\u0119dzie stabilny i szybki, bo te\u017c zawsze b\u0119dzie wykonywany identycznie.&nbsp;<\/p>\n\n\n\n<p><strong>Konfiguracja zada\u0144<\/strong>&nbsp;<\/p>\n\n\n\n<p>Jenkins umo\u017cliwia tworzenie zada\u0144 (Jenkins Jobs) na r\u00f3\u017cne sposoby. Konfiguracj\u0119 mo\u017cna stworzy\u0107 ca\u0142kowicie przez UI, przeklikuj\u0105c odpowiednie opcje, lecz lepszym wyborem jest utworzenie pliku konfiguracyjnego i zdefiniowanie w nim wszystkich niezb\u0119dnych krok\u00f3w. W Jenkinsie wykorzystuje si\u0119 w tym celu skrypty pisane w j\u0119zyku Groovy. Zalet\u0105 w stosowaniu tej opcji jest dodatkowo to, \u017ce plik konfiguracyjny mo\u017cna przechowywa\u0107 wraz z kodem dotycz\u0105cej go aplikacji. Dzi\u0119ki temu mamy zapewnione wersjonowanie zmian i powstaje kopia zapasowa, przydatna w przypadku wyst\u0105pienia awarii.&nbsp;<\/p>\n\n\n\n<p><strong>Rozszerzalno\u015b\u0107 poprzez pluginy<\/strong>&nbsp;<\/p>\n\n\n\n<p>Mo\u017cliwo\u015bci Jenkinsa mo\u017cna rozszerza\u0107 dzi\u0119ki wielu pluginom dost\u0119pnym na stronie https:\/\/plugins.jenkins.io\/. Ich liczba pozwala na dowolne skonfigurowanie serwera pod konkretne potrzeby, pocz\u0105wszy od zmiany wygl\u0105du element\u00f3w interfejsu u\u017cytkownika po mo\u017cliwo\u015b\u0107 integracji z zewn\u0119trznymi serwisami lub aplikacjami czy modyfikuj\u0105ce kroki w tworzonych jobach.<strong>\u202f<\/strong>&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">GitLab&nbsp;<\/h3>\n\n\n\n<p>Innym narz\u0119dziem, o kt\u00f3rym warto wspomnie\u0107, jest GitLab. Serwis ten nie tylko pozwala na tworzenie i przechowywanie repozytori\u00f3w kodu, ale tak\u017ce udost\u0119pnia narz\u0119dzia do wersjonowania oprogramowania, zarz\u0105dzania zadaniami oraz procesami CI\/CD. Pozwala on wszystkim cz\u0142onkom zespo\u0142u wsp\u00f3\u0142pracowa\u0107 na wszystkich etapach projektu, upraszczaj\u0105c tworzenie oprogramowania.&nbsp;<\/p>\n\n\n\n<p><strong>Funkcjonalno\u015bci GitLaba<\/strong>&nbsp;<\/p>\n\n\n\n<p>GitLab to internetowe repozytorium Git, kt\u00f3re umo\u017cliwia zespo\u0142om programist\u00f3w planowanie, kodowanie, testowanie, wdra\u017canie i monitorowanie zmian tworzonego oprogramowania w jednym miejscu. Natomiast Git to dobrze wszystkim znany system kontroli wersji.&nbsp;<\/p>\n\n\n\n<p>Jedn\u0105 z istotnych mo\u017cliwo\u015bci jest \u015bledzenie b\u0142\u0119d\u00f3w: GitLab posiada wbudowany system umo\u017cliwiaj\u0105cy zespo\u0142om tworzenie, przypisywanie i \u015bledzenie b\u0142\u0119d\u00f3w. Zapewnia tak\u017ce tablic\u0119 zarz\u0105dzania projektami z konfigurowalnymi przep\u0142ywami pracy (workflow) w celu wizualizacji zada\u0144 i post\u0119p\u00f3w.&nbsp;<\/p>\n\n\n\n<p>Inn\u0105 kluczow\u0105 funkcjonalno\u015bci\u0105 GitLaba s\u0105 zintegrowane potoki CI\/CD (pipelines). Dzi\u0119ki temu mo\u017cna \u0142atwo zautomatyzowa\u0107 procesy testowania, budowania i wdra\u017cania, zapewniaj\u0105c dok\u0142adne testowanie zmian w kodzie przed po\u0142\u0105czeniem z g\u0142\u00f3wn\u0105 baz\u0105 kodu i wdro\u017ceniem w \u015brodowisku produkcyjnym.&nbsp;<\/p>\n\n\n\n<p>GitLab posiada tak\u017ce wewn\u0119trzny system wiki, umo\u017cliwiaj\u0105cy zespo\u0142om tworzenie i utrzymywanie dokumentacji projektowej.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie&nbsp;<\/h2>\n\n\n\n<p>Podej\u015bcie Continuous Integration wraz z Continuous Development i Continuous Testing stanowi\u0105 komplementarne praktyki. Continuous Development umo\u017cliwia obserwowanie wdra\u017canych zmian w czasie rzeczywistym i jednocze\u015bnie eliminuje proces r\u0119cznego \u015bledzenia zmian. B\u0142\u0119dy znalezione na jak najwcze\u015bniejszym etapie s\u0105 najszybsze i najta\u0144sze w naprawie.&nbsp;<\/p>\n\n\n\n<p>Budowanie aplikacji wraz z przeprowadzeniem test\u00f3w na lokalnym \u015brodowisku mo\u017ce zaj\u0105\u0107 kilka minut, a ich przeprowadzenie daje pewno\u015b\u0107, \u017ce wprowadzone zmiany b\u0119d\u0105 przygotowane do integracji z g\u0142\u00f3wn\u0105 ga\u0142\u0119zi\u0105 repozytorium. Czasem zmiany mog\u0105 budzi\u0107 szczeg\u00f3lne w\u0105tpliwo\u015bci \u2013&nbsp;&nbsp; na przyk\u0142ad, gdy modyfikacji wymagaj\u0105 pliki konfiguracyjne. W takim przypadku mo\u017cna wykona\u0107 pe\u0142n\u0105 kompilacj\u0119 i uruchomi\u0107 wszystkie testy, aby mie\u0107 pewno\u015b\u0107, \u017ce zmiana nie spowodowa\u0142a b\u0142\u0119d\u00f3w w innych obszarach aplikacji, a kod jest bezpieczny i mo\u017ce zosta\u0107 dodany do g\u0142\u00f3wnego repozytorium.&nbsp;<\/p>\n\n\n\n<p>Ci\u0105g\u0142a integracja ma na celu identyfikowanie problem\u00f3w, ale mo\u017ce r\u00f3wnie\u017c pos\u0142u\u017cy\u0107 jako narz\u0119dzie do zmniejszania koszt\u00f3w uruchamiania test\u00f3w wy\u017cszego poziomu \u2013 wykrycie b\u0142\u0119d\u00f3w na etapie test\u00f3w jednostkowych sprawi, \u017ce testy z pozosta\u0142ych poziom\u00f3w b\u0119d\u0105 bardziej stabilne, co daje dodatkow\u0105 pewno\u015b\u0107 co do jako\u015bci.&nbsp;at the capabilities are within the connectivity management framework. At Inetum, we are a partner of Cumulocity IoT, which has a network of partners providing platform-compatible devices with substantial connectivity capabilities.<\/p>\n\n\n\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>G\u0142\u00f3wna korzy\u015b\u0107 z\u00a0CI\u00a0to\u00a0wczesne wykrywanie b\u0142\u0119d\u00f3w, co\u00a0prowadzi do\u00a0szybszego wdra\u017cania nowych funkcji, wi\u0119kszej stabilno\u015bci oprogramowania i\u00a0lepszej wsp\u00f3\u0142pracy mi\u0119dzy programistami.<\/p>\n","protected":false},"author":143,"featured_media":28720,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"iawp_total_views":62,"footnotes":""},"categories":[1,402,582],"tags":[576,566],"offering":[513],"class_list":["post-28712","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykuly","category-articles","category-technologie","tag-cloud-engineering","tag-devops","offering-application-development"],"acf":[],"_links":{"self":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/28712","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/users\/143"}],"replies":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/comments?post=28712"}],"version-history":[{"count":4,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/28712\/revisions"}],"predecessor-version":[{"id":32950,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/28712\/revisions\/32950"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media\/28720"}],"wp:attachment":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media?parent=28712"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/categories?post=28712"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/tags?post=28712"},{"taxonomy":"offering","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/offering?post=28712"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}