<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	 xmlns:media="http://search.yahoo.com/mrss/" >

<channel>
	<title>DevOps &#8211; Nearshore Software Development Company &#8211; IT Outsourcing Services</title>
	<atom:link href="https://nearshore-it.eu/pl/tag/devops/feed/" rel="self" type="application/rss+xml" />
	<link>https://nearshore-it.eu/pl/</link>
	<description>We are Nearshore Software Development Company with 14years of experience in delivering a large scale IT projects in the areas of PHP, JAVA, .NET, BI and MDM.</description>
	<lastBuildDate>Thu, 07 Nov 2024 13:15:43 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://nearshore-it.eu/wp-content/uploads/2023/01/cropped-inetum-favicon-300x300-1-32x32.png</url>
	<title>DevOps &#8211; Nearshore Software Development Company &#8211; IT Outsourcing Services</title>
	<link>https://nearshore-it.eu/pl/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Jak wygląda proces dostarczania oprogramowania oparty na CI/CD?</title>
		<link>https://nearshore-it.eu/pl/artykuly/proces-dostarczania-oprogramowania-ci-cd/</link>
					<comments>https://nearshore-it.eu/pl/artykuly/proces-dostarczania-oprogramowania-ci-cd/#respond</comments>
		
		<dc:creator><![CDATA[Mateusz Mirecki]]></dc:creator>
		<pubDate>Wed, 28 Aug 2024 08:39:59 +0000</pubDate>
				<category><![CDATA[Artykuły]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Cloud engineering]]></category>
		<category><![CDATA[DevOps]]></category>
		<guid isPermaLink="false">https://nearshore-it.eu/?p=28712</guid>

					<description><![CDATA[Główna korzyść z CI to wczesne wykrywanie błędów, co prowadzi do szybszego wdrażania nowych funkcji, większej stabilności oprogramowania i lepszej współpracy między programistami.]]></description>
										<content:encoded><![CDATA[
<p>Aby zobrazować, jak CI działa w praktyce, można posłużyć się przykładem: kod źródłowy aplikacji został zmieniony, ponieważ powstała nowa funkcjonalność. Praca rozpoczyna się od utworzenia kopii głównego repozytorium kodu. System kontroli wersji przechowuje kod źródłowy w repozytorium. Aktualny stan aplikacji jest zwykle przechowywany w głównej gałęzi repozytorium (zwanej także jako „master&#8221;). Programista, zaczynając pracę nad nową funkcjonalnością, tworzy lokalnie kopię głównego repozytorium, która staje się bazą do stworzenia nowej funkcjonalności (a więc dokonania zmian w kodzie źródłowym).&nbsp;&nbsp;&nbsp;</p>



<div class="table-of-contents">
    <p class="title">Przejdź do:</p>
    <ol>
                    <li><a href="#Automatyzacja-i-testowanie">1.  Automatyzacja i testowanie</a></li>
                    <li><a href="#Integracja-i-aktualizacja-">2.  Integracja i aktualizacja </a></li>
                    <li><a href="#Zarządzanie-błędami-i-powiadomienia-">3.  Zarządzanie błędami i powiadomienia </a></li>
                    <li><a href="#Praktyka-DevOps-">4.  Praktyka DevOps </a></li>
                    <li><a href="#Zalety-podejścia-DevOps">5.  Zalety podejścia DevOps</a></li>
                    <li><a href="#Automatyzacja-i-shift-left-testing-">6.  Automatyzacja i shift-left testing </a></li>
                    <li><a href="#Projektowanie-małych-komponentów-i-usług-">7.  Projektowanie małych komponentów i usług </a></li>
                    <li><a href="#Projektowanie-danych-testowych-wykorzystywanych-w-ciągłym-testowaniu-">8.  Projektowanie danych testowych wykorzystywanych w ciągłym testowaniu </a></li>
                    <li><a href="#Rola-testów-jednostkowych-w-ciągłym-testowaniu-">9.  Rola testów jednostkowych w ciągłym testowaniu </a></li>
                    <li><a href="#Jakie-narzędzia-wykorzystywane-są-w-procesie-dostarczania-oprogramowania-z-CI/CD?-">10.  Jakie narzędzia wykorzystywane są w procesie dostarczania oprogramowania z CI/CD? </a></li>
                    <li><a href="#Podsumowanie-">11.  Podsumowanie </a></li>
            </ol>
</div>


<h2 class="wp-block-heading" id="Automatyzacja-i-testowanie">Automatyzacja i testowanie</h2>



<p>Zmiany nie będą dotyczyły tylko kodu samej aplikacji, ale też testów (tworzenie testów jednostkowych nowej funkcjonalności). Jednym z kluczowych atrybutów ciągłej integracji jest wysoki stopień wykorzystania zautomatyzowanych testów. Po zakończeniu wprowadzania zmian na lokalnym komputerze wykonywany jest zautomatyzowany proces kompilacji (build). W procesie tym pobierany jest kod źródłowy z lokalnego repozytorium, który jest następnie kompilowany, łączony z plikiem wykonywalnym, a na końcu przeprowadzane są testy automatyczne. Build uznaje się za prawidłowy, gdy kompilacja oraz testy zakończą się poprawnie, bez błędów.&nbsp;&nbsp;</p>



<h2 class="wp-block-heading" id="Integracja-i-aktualizacja">Integracja i<strong> </strong>aktualizacja</h2>



<p>Następnym krokiem jest zatwierdzenie zmian w repozytorium. Na tym etapie należy uwzględnić zmiany wprowadzone przez innych członków w zespole, ponieważ w międzyczasie zmiany innego programisty mogły zostać już zintegrowane z głównym repozytorium tworzonego oprogramowania. Należy więc najpierw zaktualizować lokalną gałąź z kodem z głównej gałęzi <strong>(master)</strong> i ponownie uruchomić zautomatyzowaną kompilację <strong>(build).</strong> Jeżeli w trakcie tego procesu pojawią się konflikty (zmiany w kodzie kolidujące ze zmianami wprowadzonymi przez innych programistów), należy je rozwiązać i ponownie uruchomić kompilację. Gdy zakończy się ona powodzeniem, zmiany można zatwierdzić i zintegrować z głównym repozytorium.&nbsp;</p>



<p>W tym momencie wykonywana jest ponowna kompilacja, lecz tym razem jest ona przeprowadzana na serwerze integracyjnym. Zdarza się, że podczas kompilacji na lokalnej stacji roboczej coś może zostać przeoczone, przez co główne repozytorium zostanie zaktualizowane w nieodpowiedni sposób. Dopiero gdy zmiany w głównym repozytorium zbudują się poprawnie na serwerze CI, można je będzie uznać za zakończone sukcesem.&nbsp;</p>



<p>Jeśli dojdzie do konfliktów w plikach zmienionych przez innych programistów, zwykle będą one wychwycone, gdy programista zatwierdzający zmiany utworzy zaktualizowaną kopię roboczą, a sama kompilacja zakończy się niepowodzeniem. Błąd jest szybko wyłapany, a zadaniem programistów jest zlokalizowanie źródła błędów i naprawienie ich. W środowisku CI należy unikać sytuacji, w których przez dłuższy czas kompilacje integracyjne kończą się błędem – trzeba je naprawić najszybciej, jak to możliwe.&nbsp;</p>



<p>Po pomyślnej kompilacji na serwerze ciągłej integracji nowe zmiany można wprowadzić na przykład na środowiska testowe, gdzie testerzy będą mogli przeprowadzać testy na aktualnej wersji oprogramowania zawierającej najnowsze zmiany.&nbsp;</p>



<h2 class="wp-block-heading" id="Zarządzanie-błędami-i-powiadomienia">Zarządzanie błędami i powiadomienia</h2>



<p>Na każdym etapie procesu ciągłej integracji po stronie serwera, w razie niepowodzenia w budowaniu projektu, można zaimplementować narzędzia raportujące błędy. W ten sposób, w przypadku wystąpienia błędu w którymś kroku kompilacji – odpowiedni użytkownicy mogą zostać powiadomieni, na przykład za pomocą wiadomości e-mail lub powiadomienia na firmowym czacie.&nbsp;</p>



<p>Przykładowy ogólny schemat procesu ciągłej integracji:&nbsp;</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" 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ągłej integracji CI" class="wp-image-28713" title="Jak wygląda proces dostarczania oprogramowania oparty na CI/CD? 1" 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="(max-width: 762px) 100vw, 762px" /></figure></div>


<h2 class="wp-block-heading" id="Praktyka-DevOps">Praktyka DevOps</h2>



<p>Termin DevOps pochodzi z połączenia dwóch słów: development i operations (programowanie i operacje). Służy do określenia podejścia do rozwoju oprogramowania zakładającego zmniejszanie barier pomiędzy zespołami deweloperskimi i operacyjnymi firmy. Celem DevOps jest skrócenie czasu wprowadzenia produktu na rynek. Oznacza to przyjęcie i wdrożenie pewnych praktyk w celu skrócenia czasu od identyfikacji nowego wymagania do momentu jego wdrożenia dla klientów. W podejściu tym wykorzystywana jest omawiana ciągła integracja i ciągłe dostarczanie, które pomagają skrócić czas wprowadzenia produktu na rynek i stworzyć oprogramowanie lepszej jakości.&nbsp;</p>



<h3 class="wp-block-heading" id="Historia-i-rozwój">Historia i rozwój</h3>



<p>Celem DevOps jest skrócenie czasu wprowadzenia produktu na rynek. Filozofia DevOps narodziła się w 2008 roku podczas konferencji Agile w Toronto, kiedy&nbsp; Patrick Debois wygłosił wykład pod tytułem „Infrastructure and Operations“. Wyjaśnił w nim zastosowanie podejścia Agile do budowy infrastruktury, a na koniec zaproponował lepszą metodę komunikacji oraz pomysły, dzięki którym programiści mogliby „ poszerzać swoje horyzonty”, w sensie pogłębiania wiedzy systemowej niezbędnej do zapewnienia płynniejszego procesu wydawania oprogramowania. Mijały lata, a podejście DevOps stawało się coraz bardziej popularne, a w ślad za nim pojawiła się nowa rola w świecie IT – inżynier DevOps.&nbsp;&nbsp;</p>



<h3 class="wp-block-heading" id="Rola-inżyniera-DevOps">Rola inżyniera DevOps</h3>



<p>Inżynier DevOps stanowi swego rodzaju pomost pomiędzy programistami a działem operacyjnym. W większości przypadków rola, jaką przyjmuje, jest ich mieszanką (inżynierowie ci muszą posiadać wiedzę niezbędną do doradzania i zarządzania problemem z obu dyscyplin). W niektórych przypadkach odpowiedzialność inżyniera DevOps związana jest z ciągłą integracją i dostarczaniem. Inne obowiązki obejmują zarządzanie infrastrukturą, zazwyczaj w postaci kodu (IaC) oraz pomoc we wdrażaniu optymalnych praktyk DevOps w całej firmie. Czasem inżyniera DevOps postrzega się go także jako osobę odpowiedzialną głównie za utrzymanie oprogramowania w środowisku produkcyjnym i automatyzację procesów, rozwiązywanie problemów, administrowanie systemem.&nbsp; Rola inżyniera DevOps jest zróżnicowana i może zmieniać się w zależności od firmy.&nbsp;</p>



<h2 class="wp-block-heading">Zalety podejścia DevOps</h2>



<h3 class="wp-block-heading">Efektywność i współpraca&nbsp;</h3>



<p>Zespoły, które wdrażają podejście DevOps, stają się bardziej wydajne, dzięki czemu tworzone oprogramowanie wydawane jest nie tylko szybciej, ale też jest bardziej stabilne. Lepsza współpraca i zwiększona produktywność pozwalają też osiągać cele biznesowe, takie jak szybsze wprowadzenie produktu na rynek czy utrzymanie jego niezawodności i stabilności w każdych warunkach. Zastosowanie metodyki DevOps nie tylko pozwala zautomatyzować i optymalizować procesy za pomocą technologii. Jest to przede wszystkim zmiana kultury wewnątrz organizacji i ludzi zaangażowanych w ten proces.&nbsp;&nbsp;</p>



<p>Wdrożenie kultury DevOps wymaga głębokich zmian w dotychczasowym sposobie pracy zespołów i przestrzegania określonych zasad, jednak te zmiany pozwalają stworzyć środowisko pracy o wysokiej wydajności.&nbsp;&nbsp; Cechą charakterystyczną DevOps jest ścisła współpraca między zespołami. Różne zespoły, na przykład zespoły deweloperów i odpowiedzialne za operacje, muszą dzielić się swoimi procesami, priorytetami i problemami. Muszą także wspólnie planować pracę oraz cele i środki związane z ich osiągnięciem. W miarę jak zespoły dostosowują się do nowej rzeczywistości, obowiązki w poszczególnych rolach również zaczynają się poszerzać. Na przykład deweloperzy stają się odpowiedzialni nie tylko za tworzenie aplikacji w fazie programowania, ale też za wydajność i stabilność w fazie działania. Jednocześnie zespół operacji uwzględnia nadzór, zabezpieczenia i zgodność w fazach planowania i programowania.&nbsp;&nbsp;</p>



<h3 class="wp-block-heading">Elastyczność i reaktywność&nbsp;</h3>



<p>Elastyczność zespołów pozwala na wydawanie oprogramowania w krótszych cyklach. Łatwiej jest planować wdrażanie zmian i zarządzać ryzykiem – to droga do stworzenia stabilnego produktu. Krótsze cykle wydawania nowych wersji pozwalają także sprawniej reagować na zmiany zachodzące na rynku, dzięki czemu można szybciej dostosować się do zmian potrzeb klientów i nie odstawać od konkurencji. Podejście DevOps stanowi state-of-the-art nowoczesnego tworzenia oprogramowania i jest dziś pierwszym wyborem wielu firm z tego powodu, że promuje najlepsze praktyki niezbędne do poprawy jakości oprogramowania. DevOps wymaga zmiany nie tylko w sposobie myślenia o infrastrukturze, ale także w&nbsp; zakresie dobrego projektowania i organizowania wewnętrznej infrastruktury firmy.&nbsp;&nbsp;&nbsp;</p>



<h3 class="wp-block-heading">Ciągłe testowanie&nbsp;</h3>



<p>Ciągłe testowanie (Continuous Testing, CT) to umiejętne wykorzystanie pewnych narzędzi i technik. Cytując <a href="https://sjsi.org/ist-qb/do-pobrania/" target="_blank" rel="noreferrer noopener">sylabus ISTQB</a>, ciągłe testowanie to:&nbsp;&nbsp;</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>„Podejście obejmujące proces wczesnego, częstego, szerokiego, automatycznego testowania w celu otrzymania możliwie szybko informacji zwrotnej o poziomie ryzyka biznesowego związanego z aplikacją przed jej wydaniem”.&nbsp;&nbsp;</p>
</blockquote>



<p></p>



<p>Podejście to znacznie skraca czas potrzebny do wykonania testów manualnych.&nbsp;</p>



<p>Głównym celem wprowadzenia podejścia CI/CD jest poprawa jakości wydawanego oprogramowania, a ciągłe testowanie i kontrola powinny być częścią tego procesu.&nbsp; Celem ciągłego testowania jest zapewnienie, że wydawane oprogramowanie będzie niezawodne.&nbsp; W tym celu tworzy się różnego rodzaju testy, które mogą być wykonywane automatycznie za każdym razem, gdy oprogramowanie jest budowane.&nbsp;</p>



<h3 class="wp-block-heading">Poziomy testów w ciągłym testowaniu&nbsp;</h3>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img 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ów w ciągłym testowaniu " class="wp-image-28716" style="width:1160px;height:auto" title="Jak wygląda proces dostarczania oprogramowania oparty na CI/CD? 2" 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="(max-width: 762px) 100vw, 762px" /></figure></div>


<ol start="1" class="wp-block-list">
<li><strong>Testy jednostkowe</strong> – bazę testów automatycznych stanowią testy jednostkowe. Są one wykonywane za każdym razem, gdy oprogramowanie jest kompilowane i budowane.&nbsp;&nbsp;</li>
</ol>



<ol start="2" class="wp-block-list">
<li><strong>Testy integracyjne</strong> – kolejnym poziomem testów, który należy włączyć, są testy integracyjne. Są one przeprowadzane po testach jednostkowych i wykorzystują rzeczywiste dane. Testy integracyjne są ważną fazą w ciągłym testowaniu, ponieważ odpowiadają za testowanie całego systemu, a nie tylko tworzonego kodu.&nbsp;&nbsp;</li>
</ol>



<ol start="3" class="wp-block-list">
<li><strong>Testy akceptacyjne (E2E)</strong> – ostatnią fazą są testy akceptacyjne. W tej fazie wykonywane są testy przygotowane przez zespół QA w celu przetestowania systemu z punktu widzenia użytkownika. Celem tej fazy jest weryfikacja wymagań użytkownika i ich walidacja.&nbsp;</li>
</ol>



<h3 class="wp-block-heading">Kontrola kodu&nbsp;</h3>



<p>Oprócz różnych faz testowania, istnieje także faza kontroli kodu. Polega ona na sprawdzeniu kodu przy wykorzystaniu zestawu reguł wykorzystywanych do sporządzenia raportu na temat samego oprogramowania. Można ją podzielić na dwie fazy:&nbsp;&nbsp;</p>



<ol start="1" class="wp-block-list">
<li><strong>Przegląd kodu&nbsp;</strong>wykonywany przez programistę, który nie jest&nbsp; jego autorem. Przed integracją z główną gałęzią (master) kod musi zostać zatwierdzony. Członkowie zespołu sprawdzają kod i dodają komentarze, jeśli jakieś fragmenty wymagają zmian. W tym przypadku autor kodu dokonuje zmian na ich podstawie, a po skończonej pracy kod ponownie trafia do przeglądu. Jeśli nikt nie będzie miał zastrzeżeń – kod zostanie zaakceptowany i scalony z główną gałęzią.&nbsp;</li>



<li><strong>Faza statycznej analizy</strong> jest wykonywana przez odpowiednie narzędzia. Kod może zostać wtedy zweryfikowany przez pewne reguły, na przykład sprawdzające złożoność metod.&nbsp;&nbsp;</li>
</ol>



<p></p>



<h2 class="wp-block-heading">Automatyzacja i shift-left testing&nbsp;</h2>



<p>Ciągłe testowanie wykorzystuje podejścia automatyzacji do przyspieszenia testowania poprzez przyjęcie podejścia shift-left testing, które łączy etapy wytwarzania oprogramowania i zapewniania jakości. Takie podejście może obejmować zestaw przepływów pracy testów automatycznych, które można łączyć z narzędziami raportującymi i metrykami w celu otrzymania jasnego obrazu jakości oprogramowania.&nbsp;</p>



<p>Zapewnia to zespołom projektowym otrzymanie szybkiej informacji zwrotnej na temat jakości oprogramowania. Pozwala również testować na wcześniejszych etapach wytwarzania oprogramowania oraz zwiększyć pokrycie testami, eliminując wąskie gardła testowe, takie jak: dostęp do współdzielonych środowisk testowych czy oczekiwanie na stabilny interfejs użytkownika.&nbsp;</p>



<p><strong>Ciągłe testowanie niesie ze sobą szereg korzyści, takich jak:</strong>&nbsp;</p>



<p></p>



<ul class="wp-block-list">
<li>Integrowanie zespołów testowych, deweloperskich i operacyjnych na każdym etapie cyklu życia oprogramowania.&nbsp;</li>



<li>Pozwala na wdrożenie testów automatycznych w takim zakresie, jak to tylko możliwe, aby stale testować kluczowe funkcje.&nbsp;</li>



<li>Szybkie i ciągłe informacje zwrotne, które są istotne również dla biznesu.&nbsp;</li>



<li>Usunięcie wąskich gardeł w kwestii dostępności środowisk testowych, które mogą być stale dostępne.&nbsp;</li>



<li>Pozwala na stałe i aktywne zarządzanie jakością w całym etapie dostarczania oprogramowania. &nbsp;</li>
</ul>



<h3 class="wp-block-heading">Fundamenty ciągłego testowania&nbsp;</h3>



<p>Ciągłe testowanie opiera się na kombinacji określonych narzędzi i technik. Odpowiednie ich wdrożenie tworzy system, dzięki któremu znacząco można ograniczyć liczbę błędów przedostających się na środowiska rozwojowe lub produkcyjne. Większość błędów ma bardzo krótką żywotność, ponieważ są one wyłapywane przez testy. Odpowiednie zaimplementowanie tego podejścia powinno rozpoczynać się na jak najwcześniejszym etapie cyklu życia oprogramowania, aby móc je odpowiednio budować, aktualizować i (w razie potrzeby) refaktoryzować. Sama budowa i działanie zależą w głównej mierze od potrzeb projektowych – inne testy i techniki będą wykorzystywane do testowania sklepu internetowego, inne do testowania systemów w branży automotive. Lecz niezależnie od przypadku, cel pozostanie ten sam – uzyskanie jak najszybciej informacji zwrotnej w przypadku wystąpienia błędu.&nbsp;</p>



<h2 class="wp-block-heading">Projektowanie małych komponentów i usług&nbsp;</h2>



<p>Idea ciągłego testowania polega na maksymalnym zautomatyzowaniu procesów testowania i wdrażania oraz zapewnieniu, że każdy komponent aplikacji może zostać poddany testom, gdy tylko zostanie opracowany. Przykłady, które mogą ułatwić implementację tego podejścia to: projektowanie małych komponentów i usług oraz projektowanie danych testowych wykorzystywanych w ciągłym testowaniu.&nbsp;</p>



<p>Projektowanie małych komponentów i usług – nowe komponenty powinny nie tylko spełniać określone funkcje w trakcie działania programu, ale również być w pełni testowalne niezależnie od innych komponentów. Celem jest zapewnienie, że każda w pełni przetestowana usługa będzie spełniała swoje zadania zgodnie z założeniami, aby w trakcie ich łączenia i przejścia do etapu testów integracyjnych komponenty bezproblemowo współpracowały ze sobą.. Należy więc już na etapie projektowania odpowiednio przygotować architekturę i ograniczyć sprzężenie komponentów tak bardzo, jak to możliwe. W efekcie zyskamy komponenty bardziej stabilne, które zmniejsza ryzyko, że jakakolwiek zmiana dokonana w komponencie „A&#8221; spowoduje nieoczekiwaną zmianę zachowania w innych komponentach. Ograniczenie połączeń między nimi upraszcza proces testowania, rozwiązywania problemów oraz konserwacji. Dodatkowo w łatwiejszy sposób można izolować ewentualne problemy – analizie zostanie poddany konkretny komponent, bez potrzeby przeszukiwania ich grup i zależności między nimi.&nbsp;</p>



<h2 class="wp-block-heading">Projektowanie danych testowych wykorzystywanych w ciągłym testowaniu&nbsp;</h2>



<p>Posiadanie w pełni zautomatyzowanego rozwiązania do zarządzania danymi testowymi jest niezbędne do solidnego wdrożenia ciągłego testowania. Złym podejściem byłoby na przykład kopiowanie produkcyjnej bazy danych w celu utworzenia danych testowych, nie anonimizując uprzednio wrażliwych danych. Tworzenie nowych zestawów danych testowych od zera dla każdej serii testów również nie jest dobrym pomysłem ze względu na bardzo słabą efektywność, zwłaszcza gdy nie są generowane automatycznie.&nbsp;</p>



<p>Jak zatem stworzyć skuteczne rozwiązania do generowania i zarządzania danymi testowymi? Z pomocą przychodzą pewne charakterystyki, do których można zaliczyć na przykład:&nbsp;</p>



<ul class="wp-block-list">
<li><strong>Tworzenie i generowanie danych testowych&nbsp;</strong><br>Daje możliwość tworzenia nowych, zbiorczych zestawów danych uwzględniających zależności, tak jakby pochodziły ze środowiska produkcyjnego.&nbsp;</li>



<li><strong>Możliwość pobrania pewnego podzbioru danych produkcyjnych&nbsp;</strong><br>Na podstawie określonych kryteriów, maskowania wrażliwych pól i umieszczania ich w środowisku testowym, zachowując ich integralność referencyjną. Najtrudniejsza w realizacji jest ostatnia część: wrażliwe pola muszą być zamaskowane w taki sposób, aby zachować oryginalne powiązania między danymi. Przykładowo, jeśli wartość numeru PESEL musi zostać zamaskowana i zastąpiona niepowiązaną wartością, każde odwołanie do tego numeru PESEL w bazie danych musi zostać zamaskowane tą samą wartością.&nbsp;</li>



<li><strong>Możliwość maskowania i transformacji danych&nbsp;</strong><br>Rozwiązanie powinno też zapewnić możliwość automatycznego porównania danych wstępnie zamaskowanych, aby upewnić się, że nie doszło do ich utraty i że proces maskowania nie spowodował błędów w ich integralności.&nbsp;</li>



<li><strong>Możliwość przesyłania danych&nbsp;</strong><br>Proces polegający na przesyłaniu wyodrębnionych, zamaskowanych danych na środowiska testowe, z zachowaniem integralności. Proces ten powinien obejmować funkcje dodawania, edytowania, aktualizacji i usuwania.&nbsp;</li>



<li><strong>Możliwość odświeżania danych&nbsp;</strong><br>Polega na okresowym przeglądzie i usuwaniu starych pakietów danych testowych oraz zamienianiu ich na nowy zestaw.&nbsp;</li>



<li><strong>Ekstrakcja danych i tworzenie ich podzbiorów&nbsp;</strong><br>Pozwala na tworzenie mniejszych kopii danych produkcyjnych zdefiniowanych za pomocą określonych kryteriów.&nbsp;</li>



<li><strong>„Postarzanie&#8221; danych&nbsp;</strong><br>Technika, w której dane są zmieniane w celu dopasowania ich do określonych, specyficznych warunków i wykorzystania ich w pewnych procesach (na przykład symulacji określonej godziny lub daty).&nbsp;</li>



<li><strong>Możliwość tworzenia i wyodrębniania danych testowych&nbsp;</strong></li>



<li><strong>Zarządzanie zbiorami danych&nbsp;</strong></li>



<li>Wykorzystanie narzędzi, które umożliwiają nie tylko zarządzanie wieloma zbiorami danych, ale także ich archiwizację i wersjonowanie. &nbsp;</li>
</ul>



<h2 class="wp-block-heading">Rola testów jednostkowych w ciągłym testowaniu&nbsp;</h2>



<p>Podstawę testów w podejściu ciągłego testowania, zgodnie z piramidą testów, stanowią testy jednostkowe. Są one najszybsze w wykonaniu i sprawdzają działanie oprogramowania we wczesnej fazie jego wytwarzania. Powinno ich więc być jak najwięcej (przy zachowaniu odpowiedniego stosunku liczby do jakości – nie jest prawdą, że większa liczba testów stanowi o jakości).&nbsp;&nbsp;</p>



<h3 class="wp-block-heading">Projektowanie testów jednostkowych&nbsp;</h3>



<p>Zdarza się, że testy jednostkowe są źle zaprojektowane i zamiast jednostek testują kompletne przypadki użycia (wywołanie metod, asercje, wywołanie większej liczby metod i tworzenie większej liczby asercji). Takie testy są zwykle niestabilne, a błędy wykryte w jednej części kodu mogą maskować inne błędy i utrudniać ich wykrycie. Aby temu zapobiec, należy przeanalizować takie testy, wyodrębnić z nich poszczególne, testowane funkcjonalności i asercje i rozbić je na mniejsze testy sprawdzające każdą funkcjonalność z osobna.&nbsp;</p>



<h3 class="wp-block-heading">Implementacja testów na różnych poziomach&nbsp;</h3>



<p>Testowanie bardziej złożonych ścieżek, dajmy na to przypadków użycia, powinno zostać zaimplementowane na przykład w testach akceptacyjnych. W ciągłym testowaniu można wykonywać wszystkie rodzaje testów, lecz im wyższy poziom testów, tym liczba przypadków testowych powinna być mniejsza (są one mniej stabilne, czas ich wykonywania jest dłuższy, wykrywają błędy w późniejszych etapach, przez co wydłuża się czas naprawy, a koszt rośnie).&nbsp;</p>



<p>Dotyczy to zwłaszcza testów UI (User Interface), gdy testowana jest logika biznesowa i zachowanie interfejsu użytkownika. Może tu dojść do wielu współzależnych awarii. Oddzielenie warstwy interfejsu od systemu bazowego, aby logika biznesowa mogła zostać opatrzona zaślepkami (mock) jest istotną zmianą zbliżającą nas do większej stabilności testów.&nbsp;</p>



<p>Jednym z podejść jest uruchamianie testów jednostkowych w sposób ciągły, a testów wyższych poziomów – na żądanie (nie muszą one być uruchamiane automatycznie w trakcie budowy projektu w narzędziu ciągłej integracji – zamiast tego, istnieje możliwość uruchomienia ich w sposób manualny, gdy potrzeba).&nbsp;</p>



<h3 class="wp-block-heading">Rola podejścia TDD&nbsp;</h3>



<p>Praktykowanie podejścia TDD (Test-Driven Development) w wytwarzaniu oprogramowania ułatwia zrozumienie i wdrożenie ciągłego testowania. W TDD testy tworzone są przed implementacją funkcjonalności. Najpierw tworzony jest mały test, po którym następuje implementowanie powiązanego fragmentu całej funkcjonalności. Następnie dokonuje się refaktoryzacji w celu ulepszenia kodu i wyeliminowania ewentualnych powieleń. Dzięki ciągłemu testowaniu otrzymujemy natychmiastową informację zwrotną na każdym z tych kroków. Nie tylko z tego jednego testu, który jest w danym momencie pisany, lecz ze wszystkich powiązanych testów, bez dodatkowego wysiłku i zaangażowania ze strony programisty. Dzięki temu może on skupić się w pełni na projektowaniu i pisaniu kodu, zamiast rozpraszać się koniecznością uruchamiania testów.&nbsp;</p>



<h3 class="wp-block-heading">Cel ciągłego testowania&nbsp;</h3>



<p>Zarówno w podejściu TDD, jak i w ciągłym testowaniu, celem jest jak najszybsze uzyskanie informacji zwrotnej. Pod wieloma względami naturalnym rezultatem skutecznego stosowania TDD jest dobrej jakości zestaw testów. Różnica polega na tym, że stosując ciągłe testowanie, zyskuje się dodatkowe źródła informacji zwrotnych. Stary aksjomat podejścia TDD mówi, że testy sprawdzają poprawność kodu, z kolei kod weryfikuje poprawność testów. Testy sprawdzają również projekt kodu – źle zaprojektowany kod jest trudny do przetestowania. &nbsp;</p>



<h2 class="wp-block-heading">Jakie narzędzia wykorzystywane są w procesie dostarczania oprogramowania z CI/CD?&nbsp;</h2>



<h3 class="wp-block-heading">Jenkins&nbsp;</h3>



<p>Jenkins to serwer ciągłej integracji (CI) typu open source.&nbsp; Kontroluje kilka etapów procesu dostarczania oprogramowania, takie jak testowanie, kompilacja i wdrażanie. Popularność tego narzędzia wynika między innymi z jego możliwości śledzenia i monitorowania powtarzalnych działań pojawiających się w trakcie prac nad projektem. Każda zmiana w aplikacji jest kompilowana i testowana, a w razie wykrycia błędu Jenkins ostrzeże zespół o problemach.&nbsp;</p>



<p><strong>Wdrożenie kodu na produkcję</strong>&nbsp;</p>



<p>Jednym z podstawowych zastosowań Jenkinsa jest możliwość wdrażania kodu na produkcję. Jeśli wszystkie testy opracowane dla danej funkcji lub releasu zakończą się powodzeniem, Jenkins może automatycznie opublikować kod na środowisku staging lub produkcyjnym (jest to właśnie przykład Continuous Deployment opisanego w poprzednim artykule).&nbsp;</p>



<p><strong>A</strong><strong>ut</strong><strong>o</strong><strong>matyzacja </strong><strong>w</strong><strong>orkflow</strong><strong> i różnych zadań</strong><strong></strong>&nbsp;</p>



<p>Innym przypadkiem, w którym można użyć Jenkinsa, jest m.in. automatyzacja workflow. Na przykład, gdy programista pracuje na kilku środowiskach, w pewnym momencie zajdzie konieczność instalacji lub aktualizacji pewnych komponentów na każdym z nich. Jeśli instalacja lub aktualizacja wymaga wykonania wielu kroków, przeprowadzenie jej ręcznie może skutkować pojawieniem się błędów, a dodatkowo będzie czasochłonne. Zamiast tego wszystkie kroki potrzebne do finalizacji można odpowiednio skonfigurować w Jenkinsie. Dzięki temu cały proces będzie stabilny i szybki, bo też zawsze będzie wykonywany identycznie.&nbsp;</p>



<p><strong>Konfiguracja zadań</strong>&nbsp;</p>



<p>Jenkins umożliwia tworzenie zadań (Jenkins Jobs) na różne sposoby. Konfigurację można stworzyć całkowicie przez UI, przeklikując odpowiednie opcje, lecz lepszym wyborem jest utworzenie pliku konfiguracyjnego i zdefiniowanie w nim wszystkich niezbędnych kroków. W Jenkinsie wykorzystuje się w tym celu skrypty pisane w języku Groovy. Zaletą w stosowaniu tej opcji jest dodatkowo to, że plik konfiguracyjny można przechowywać wraz z kodem dotyczącej go aplikacji. Dzięki temu mamy zapewnione wersjonowanie zmian i powstaje kopia zapasowa, przydatna w przypadku wystąpienia awarii.&nbsp;</p>



<p><strong>Rozszerzalność poprzez pluginy</strong>&nbsp;</p>



<p>Możliwości Jenkinsa można rozszerzać dzięki wielu pluginom dostępnym na stronie https://plugins.jenkins.io/. Ich liczba pozwala na dowolne skonfigurowanie serwera pod konkretne potrzeby, począwszy od zmiany wyglądu elementów interfejsu użytkownika po możliwość integracji z zewnętrznymi serwisami lub aplikacjami czy modyfikujące kroki w tworzonych jobach.<strong> </strong>&nbsp;</p>



<h3 class="wp-block-heading">GitLab&nbsp;</h3>



<p>Innym narzędziem, o którym warto wspomnieć, jest GitLab. Serwis ten nie tylko pozwala na tworzenie i przechowywanie repozytoriów kodu, ale także udostępnia narzędzia do wersjonowania oprogramowania, zarządzania zadaniami oraz procesami CI/CD. Pozwala on wszystkim członkom zespołu współpracować na wszystkich etapach projektu, upraszczając tworzenie oprogramowania.&nbsp;</p>



<p><strong>Funkcjonalności GitLaba</strong>&nbsp;</p>



<p>GitLab to internetowe repozytorium Git, które umożliwia zespołom programistów planowanie, kodowanie, testowanie, wdrażanie i monitorowanie zmian tworzonego oprogramowania w jednym miejscu. Natomiast Git to dobrze wszystkim znany system kontroli wersji.&nbsp;</p>



<p>Jedną z istotnych możliwości jest śledzenie błędów: GitLab posiada wbudowany system umożliwiający zespołom tworzenie, przypisywanie i śledzenie błędów. Zapewnia także tablicę zarządzania projektami z konfigurowalnymi przepływami pracy (workflow) w celu wizualizacji zadań i postępów.&nbsp;</p>



<p>Inną kluczową funkcjonalnością GitLaba są zintegrowane potoki CI/CD (pipelines). Dzięki temu można łatwo zautomatyzować procesy testowania, budowania i wdrażania, zapewniając dokładne testowanie zmian w kodzie przed połączeniem z główną bazą kodu i wdrożeniem w środowisku produkcyjnym.&nbsp;</p>



<p>GitLab posiada także wewnętrzny system wiki, umożliwiający zespołom tworzenie i utrzymywanie dokumentacji projektowej.&nbsp;</p>



<h2 class="wp-block-heading">Podsumowanie&nbsp;</h2>



<p>Podejście Continuous Integration wraz z Continuous Development i Continuous Testing stanowią komplementarne praktyki. Continuous Development umożliwia obserwowanie wdrażanych zmian w czasie rzeczywistym i jednocześnie eliminuje proces ręcznego śledzenia zmian. Błędy znalezione na jak najwcześniejszym etapie są najszybsze i najtańsze w naprawie.&nbsp;</p>



<p>Budowanie aplikacji wraz z przeprowadzeniem testów na lokalnym środowisku może zająć kilka minut, a ich przeprowadzenie daje pewność, że wprowadzone zmiany będą przygotowane do integracji z główną gałęzią repozytorium. Czasem zmiany mogą budzić szczególne wątpliwości –&nbsp;&nbsp; na przykład, gdy modyfikacji wymagają pliki konfiguracyjne. W takim przypadku można wykonać pełną kompilację i uruchomić wszystkie testy, aby mieć pewność, że zmiana nie spowodowała błędów w innych obszarach aplikacji, a kod jest bezpieczny i może zostać dodany do głównego repozytorium.&nbsp;</p>



<p>Ciągła integracja ma na celu identyfikowanie problemów, ale może również posłużyć jako narzędzie do zmniejszania kosztów uruchamiania testów wyższego poziomu – wykrycie błędów na etapie testów jednostkowych sprawi, że testy z pozostałych poziomów będą bardziej stabilne, co daje dodatkową pewność co do jakości.&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>



<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nearshore-it.eu/pl/artykuly/proces-dostarczania-oprogramowania-ci-cd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Dostarczanie wydajnego oprogramowania: automatyzacja CI/CD </title>
		<link>https://nearshore-it.eu/pl/artykuly/automatyzacja-ci-cd/</link>
					<comments>https://nearshore-it.eu/pl/artykuly/automatyzacja-ci-cd/#respond</comments>
		
		<dc:creator><![CDATA[Mateusz Mirecki]]></dc:creator>
		<pubDate>Fri, 24 May 2024 05:28:58 +0000</pubDate>
				<category><![CDATA[Artykuły]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[DevOps]]></category>
		<guid isPermaLink="false">https://nearshore-it.eu/artykuly/automatyzacja-ci-cd/</guid>

					<description><![CDATA[Continuous Integration, Delivery and Deployment sprowadzają się do automatyzacji procesu testowania i wdrażania, minimalizacji (lub całkowitego eliminowania) potrzeby ingerencji człowieka, redukcji ryzyka wystąpienia błędów oraz ułatwienia tworzenia i wdrażania oprogramowania.]]></description>
										<content:encoded><![CDATA[
<div class="table-of-contents">
    <p class="title">Przejdź do: </p>
    <ol>
                    <li><a href="#Definicja-Continuous-Integration-(CI)-oraz-Continuous-Delivery-(CD)">1.  Definicja Continuous Integration (CI) oraz Continuous Delivery (CD)</a></li>
                    <li><a href="#Wyzwania-CI/-CD">2.  Wyzwania CI/ CD</a></li>
                    <li><a href="#Czym-jest-ciągłe-dostarczanie-i-automatyzacja-CI/CD">3.  Czym jest ciągłe dostarczanie i automatyzacja CI/CD?</a></li>
                    <li><a href="#Continuous-Delivery-(CD)-">4.  Continuous Delivery (CD) </a></li>
                    <li><a href="#Korzyści-ciągłego-dostarczania-(CD)-">5.  Korzyści ciągłego dostarczania (CD)</a></li>
                    <li><a href="#Automatyzacja-vs-manualne-wdrazanie">6.  Automatyzacja vs. manualne wdrażanie</a></li>
                    <li><a href="#Podsumowanie">7.  Podsumowanie</a></li>
            </ol>
</div>


<p><em>Continuous Integration, Delivery and Deployment</em> to praktyki rozwoju oprogramowania, które w ostatnich latach zdobyły dużą popularność. Gdybyśmy mieli je podsumować jednym słowem, brzmiałoby to: automatyzacja. Wszystkie te trzy praktyki sprowadzają się do automatyzacji procesu testowania i wdrażania, minimalizacji (lub całkowitego eliminowania) potrzeby ingerencji człowieka, redukcji ryzyka wystąpienia błędów oraz ułatwienia tworzenia i wdrażania oprogramowania do tego stopnia, że może to zrobić każdy programista w zespole. Poznaj kluczowe praktyki i korzyści w zakresie automatyzacji CI/CD.  </p>



<h2 class="wp-block-heading" id="Definicja-Continuous-Integration-(CI)-oraz-Continuous-Delivery-(CD)">Definicja Continuous Integration (CI) oraz Continuous Delivery (CD)</h2>



<h3 class="wp-block-heading">Ciągła integracja</h3>



<p>Continuous Integration, CI jest praktyką stosowaną w procesie wytwarzania oprogramowania polegającą na częstym, regularnym integrowaniu bieżących zmian w kodzie do głównego repozytorium aplikacji. Zwykle programiści włączają swoje zmiany co najmniej raz dziennie, co przy zespole składającym się z kilku lub kilkunastu osób skutkuje wieloma integracjami wykonywanymi każdego dnia. Każda integracja jest weryfikowana przez zastosowanie automatyzacji w projekcie (włączając również testy automatyczne) w celu jak najszybszego wykrycia ewentualnych błędów integrowanego kodu. Stosowanie tego podejścia prowadzi do znacznego zmniejszenia liczby problemów związanych z integracją i umożliwia szybsze tworzenie spójnego oprogramowania.</p>



<h3 class="wp-block-heading">Ciągłe dostarczanie</h3>



<p>Continuous Delivery, CD – jest praktyką inżynierii oprogramowania polegającą na regularnym wydawaniu kolejnych wersji oprogramowania w krótkich cyklach. Oznacza to, że z każdą kompilacją budowana jest nowa wersja całego tworzonego oprogramowania. Nie znaczy to jednak, że oprogramowanie jest od razu wypuszczane na środowisko produkcyjne. Nic jednak nie stoi na przeszkodzie, aby to zrobić, gdyby zaszła taka potrzeba. Ta nieznaczna różnica dotycząca automatycznego wdrażania zmian bezpośrednio na środowisku produkcyjnym odróżnia ciągłe dostarczanie od ciągłego wdrażania (Continuous Deployment) – w którym to każda kompilacja całego oprogramowania kończy się wydaniem kolejnej wersji na środowisku produkcyjnym. Zespoły developerskie dbają o to, aby nowe funkcje były dodawane w małych pakietach, dzięki czemu ewentualne wydanie nowej wersji oprogramowania może nastąpić szybko i w dowolnym momencie. W praktyce maksymalizuje to możliwość uzyskania szybkiej informacji zwrotnej na temat oprogramowania zarówno z perspektywy biznesu, jak i technicznej.</p>



<h2 class="wp-block-heading" id="Wyzwania-CI/-CD">Wyzwania CI/CD</h2>



<p>O ciągłej integracji po raz pierwszy napisał Kent Beck w swojej książce pod tytułem „Extreme Programming Explained&#8221;, wydanej po raz pierwszy w 1999 roku. Ideą CI było: jeżeli regularna integracja kodu jest dobra – dlaczego nie wykonywać jej przez cały czas? „Cały czas&#8221; oznacza: za każdym razem, gdy ktoś wprowadza zmianę w systemie kontroli wersji.</p>



<p>Problem z ciągłą integracją, dostarczaniem i wdrażaniem polega jednak na tym, że konfiguracja nie należy do najprostszych czynności i zajmuje dużo czasu, zwłaszcza jeśli zespół ma z nią do czynienia po raz pierwszy lub postanowiono wdrożyć proces do istniejącego już projektu.</p>



<p>Jednak korzyści płynące z wprowadzenia tych praktyk są warte poświęconego czasu. Przejawi się to w mniejszej liczbie błędów, ułatwieniu ich identyfikacji i naprawy, a ostatecznie w stworzeniu oprogramowania lepszej jakości.</p>



<h2 class="wp-block-heading" id="Czym-jest-ciągłe-dostarczanie-i-automatyzacja-CI/CD">Czym jest ciągłe dostarczanie i automatyzacja CI/CD?</h2>



<h3 class="wp-block-heading">Ciągła integracja (CI).</h3>



<h3 class="wp-block-heading">Kluczowe aspekty skutecznej ciągłej integracji</h3>



<p>Przyjrzyjmy się CI jeszcze bliżej. Ciągła integracja na przestrzeni ostatnich kilku lat stała się w zasadzie standardem w zwinnych metodykach wytwarzania oprogramowania. Początkowo, w połączeniu z uruchamianiem automatycznych testów jednostkowych na lokalnym środowisku programisty, miała na celu zapewnienie, że programista nie włączy kodu, który mógłby powodować błędy w aplikacji. Z biegiem czasu metoda ta ewoluowała.</p>



<p>Obecnie kompilacje uruchamiane są na serwerach ciągłej integracji, które budują projekt oraz uruchamiają zautomatyzowane testy – automatycznie, przy każdej zmianie dodanej przez programistów, lub okresowo. Wynik (w postaci raportów, logów) generowany jest po zakończeniu procesu budowania. Obecnie podejście ciągłej integracji jest wykorzystywane nie tylko w metodykach zwinnych, ale również w innych metodykach wytwarzania oprogramowania.</p>



<p>Oprócz przeprowadzania testów jednostkowych i integracyjnych można też uruchamiać testy statyczne i dynamiczne, mierzyć i profilować wydajność, tworzyć dokumentację bazującą na kodzie źródłowym oraz upraszczać manualne procesy zapewnienia jakości. W ten sposób ciągła integracja zapewnia również ciągłą kontrolę jakości oprogramowania.</p>



<p>Dobrze funkcjonująca ciągła integracja opiera się na spełnieniu pewnych warunków wstępnych, a także przestrzeganiu kilku podstawowych praktyk. Przy jej wdrażaniu należy zadbać przede wszystkim o trzy rzeczy:</p>





<ol class="wp-block-list">
<li><strong>Narzędzie kontroli wersji</strong><br>Wszystko w projekcie musi być ewidencjonowane w jednym narzędziu kontroli wersji: kod, skrypty, bazy danych, skrypty kompilacji i wdrażania oraz wszystko inne, co jest niezbędne do tworzenia, instalowania, uruchamiania i testowania aplikacji.</li>



<li><strong>Narzędzie do zautomatyzowanej kompilacji</strong><br>Należy mieć możliwość uruchomienia kompilacji za pomocą wiersza poleceń. Podstawowym narzędziem może być prosty program wiersza poleceń, który skompiluje tworzony program, a następnie uruchomi testy. Może to być też złożona kolekcja skryptów kompilacji, które wywołują się nawzajem w odpowiedniej kolejności. Niezależnie od mechanizmu, osoba lub komputer musi mieć możliwość uruchomienia kompilacji, budowania, uruchamiania testów i wdrażania w sposób zautomatyzowany za pomocą wiersza poleceń. Skrypty powinny być traktowane jak kod – muszą być testowane i stale refaktoryzowane, aby były stabilne, uporządkowane i łatwe do zrozumienia.</li>



<li><strong>Zgoda całego zespołu</strong><br>Ciągła integracja jest praktyką, a nie narzędziem. Wymaga od zespołu programistycznego dyscypliny i zaangażowania. Każdy w zespole musi często wprowadzać swoje zmiany do repozytorium i przyjąć założenie, że najważniejszym zadaniem w trakcie pracy nad projektem jest naprawa wszelkich zmian, które psują aplikację. Jeśli zespół nie będzie przestrzegał tych zasad, poprawne wdrożenie ciągłej integracji może nie być efektywne i nie doprowadzi do satysfakcjonującej poprawy jakości wytwarzania oprogramowania.</li>
</ol>



<h3 class="wp-block-heading">Zalety ciągłej integracji w porównaniu z podejściem tradycyjnym</h3>



<p>W porównaniu do tradycyjnego podejścia, gdzie zmiany wprowadzane w kodzie źródłowym są kompilowane, testowane i integrowane raz na jakiś czas (raz w tygodniu lub rzadziej), wykorzystanie podejścia ciągłej integracji zapewnia wiele korzyści:</p>



<ul class="wp-block-list">
<li>wcześniejsze wykrywanie problemów kompilacji/integracji, dzięki czemu są naprawiane w sposób ciągły, a nie w ostatniej chwili, tuż zanim główna wersja oprogramowania zostanie przygotowana do wydania, </li>



<li>zespół otrzymuje natychmiastową informację zwrotną na temat jakości, funkcjonalności oraz wpływu pisanego kodu na cały system, </li>



<li>w ramach tego procesu wykonywane są zautomatyzowane testy. Dzięki nim możliwa jest natychmiastowa kontrola poprawności architektury projektu i jakości kodu – są one wykonywane w ramach procesów kompilacji, budowania i wdrażania zmian (deployment) na różne środowiska, </li>



<li>wczesny dostęp do aktualnej wersji oprogramowania (przed oficjalnym wydaniem) do celów testowych lub demonstracyjnych. </li>
</ul>



<h3 class="wp-block-heading">Kluczowe praktyki w procesie ciągłej integracji</h3>



<p>Optymalne korzyści z procesu ciągłej integracji można uzyskać, gdy przestrzega się ustalonych w zespole procedur, co wymaga dyscypliny, jak wspomniałem wcześniej. Istnieją też sprawdzone, dobre praktyki, których przestrzeganie znacząco zwiększy sukces we wdrożeniu tego procesu. Składają się na nie poniższe aspekty: </p>





<ol class="wp-block-list">
<li><strong>Częsta integracja kodu</strong> – najważniejsza praktyka w ciągłej integracji. Kod powinno się integrować przynajmniej kilka razy dziennie. Regularne wysyłanie zmian niesie ze sobą inne korzyści – zmiany są przesyłane w mniejszych pakietach, co zmniejsza prawdopodobieństwo błędu w kompilacji, a także ułatwia poszukiwanie ewentualnych zmian (mniejsza liczba plików do przeszukiwania). To minimalizuje też prawdopodobieństwo wystąpienia konfliktów z kodem innych programistów w przypadku pracy wymagającej zmiany w wielu plikach. W przypadku awarii lokalnej stacji roboczej, która spowodowałyby utratę lokalnych zmian w kodzie – programista nie musi pisać wszystkiego od początku, lecz może zacząć od etapu zmian wprowadzonych w ostatniej integracji.</li>



<li><strong>Zarządzanie obszarem roboczym</strong> – ważne jest, aby środowisko programistyczne było starannie zarządzane – przede wszystkim zwiększa to produktywność. Deweloperzy powinni zawsze rozpoczynać nową pracę od aktualnej, działającej wersji kodu z głównej gałęzi repozytorium. Powinni móc uruchomić kompilację, testy i być w stanie wdrożyć aplikację w swoim lokalnym środowisku. Uruchamianie aplikacji w środowisku lokalnym powinno wykorzystywać te same zautomatyzowane procesy, co w serwerach ciągłej integracji.</li>



<li><strong>Kompleksowy zestaw testów automatycznych</strong> – konieczne jest posiadanie zestawu testów automatycznych, aby mieć pewność, że aplikacja działa poprawnie. Najważniejsze z punktu widzenia ciągłej integracji są testy: jednostkowe, integracyjne oraz akceptacyjne. Ich kombinacja powinna zapewnić bardzo wysoki poziom pewności co do tego, że żadna z wprowadzonych zmian nie naruszyła stabilności aplikacji.   </li>



<li><strong>Krótki proces budowania i testowania projektu </strong>– kompilacja, budowanie i wykonanie testów nie powinny trwać dłużej niż 5-10 minut. Jeśli z jakiegoś powodu proces ten zajmuje zbyt dużo czasu, mogą wystąpić problemy takie jak: 
<ul class="wp-block-list">
<li>niecierpliwość programistów – mogą oni przestać wykonywać pełną procedurę (na przykład pomijać etap testów), co będzie powodować więcej błędów kompilacji na serwerze ciągłej integracji. </li>



<li>proces ciągłej integracji może trwać tak długo, że do czasu ponownego uruchomienia kompilacji może zostać zintegrowanych wiele zmian – znalezienie tej, która powoduje błędy, może być bardzo czasochłonne. </li>



<li>rzadsza integracja zmian przez programistów z powodu czasochłonności procesu – czekanie kilku godzin na zakończenie kompilacji i testów jest stratą czasu i zasobów. </li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading" id="Continuous-Delivery-(CD)-">Continuous Delivery (CD) </h2>



<p>Ciągła integracja stanowi podstawę solidnego, nowoczesnego wytwarzania oprogramowania. Jest to czynnik umożliwiający wdrożenie jeszcze bardziej zaawansowanych technik. W ciągłej integracji, gdy wszystkie testy zakończą się pomyślnie, zyskujemy pewność, że oprogramowanie działa. Jednakże – w jaki sposób upewnić się, że oprogramowanie będzie działało w środowisku docelowym? Czy będzie współpracowało z innymi aplikacjami? Wreszcie – jak dostarczyć je do użytkowników końcowych? Z pomocą przychodzi podejście ciągłego dostarczania (Continuous Delivery, CD).&nbsp;</p>



<p>W swej istocie ciągłe dostarczanie polega na minimalizowaniu czasu potrzebnego do wprowadzenia zmian w aplikacji oraz minimalizowaniu ryzyka wystąpienia problemów, które także mogą pojawić się w trakcie tego procesu. Może składać się z kilku faz, takich jak: </p>



<ul class="wp-block-list">
<li><strong>Odkrywanie</strong> – w której analizuje się pomysły, ogólne działanie, funkcjonalności – aby uzyskać szersze zrozumienie przestrzeni problemu i zastanowić się nad potencjalnymi rozwiązaniami. </li>



<li><strong>Definiowanie</strong> – gdzie formalne kryteria akceptacji i prace projektowe stanowią bazę do dalszych prac rozwojowych. </li>



<li><strong>Rozwój</strong> – w której produkt jest budowany i testowany funkcjonalnie. </li>



<li><strong>Akceptacja</strong> – w tej fazie przeprowadzane są testy akceptacyjne wysokiego poziomu i uzyskuje się potwierdzenia od akcjonariuszy. </li>



<li><strong>Wdrożenie</strong> – zmiana jest wprowadzana na produkcję. </li>



<li><strong>Weryfikacja</strong> – w ramach której, na podstawie wszelkich danych, analizuje się zmiany, aby upewnić się, że osiągnęły one zamierzony wpływ. </li>
</ul>



<p>Każda faza stanowi swego rodzaju listę kontrolną określającą, co jest potrzebne, aby zmiany szły naprzód. Czasem przywołane fazy wysokiego poziomu są podzielone na bardziej szczegółowe. Na przykład, faza rozwoju może mieć wyszczególnione podfazy:  </p>



<ul class="wp-block-list">
<li>architektury technicznej,  </li>



<li>budowania lub kompilacji,  </li>



<li>i przeglądu kodu.  </li>
</ul>



<p>Niezależnie od złożoności poszczególnych faz, zadania związane z pracą nad nimi mogą być podejmowane przez wiele osób o różnych umiejętnościach. Zadania mogą być więc wykonywane równolegle, lecz powinny zachować niezależność.&nbsp;</p>



<p>Continuous Delivery automatyzuje proces wdrażania oprogramowania na różne środowiska w projekcie. Niektóre z nich można wykorzystać do przeprowadzania różnych testów automatycznych, takich jak:  </p>



<ul class="wp-block-list">
<li>testy integracyjne,  </li>



<li>testy akceptacyjne,  </li>



<li>czy też testy niefunkcjonalne, jak na przykład testy wydajnościowe lub penetracyjne.  </li>
</ul>



<p>Nie należy również zapominać o przeprowadzeniu testów manualnych, które mogą wykryć nowe klasy defektów, których automatyczne testy zwykle nie są w stanie wychwycić. </p>



<h2 class="wp-block-heading" id="Korzyści-ciągłego-dostarczania-(CD)-">Korzyści ciągłego dostarczania (CD) </h2>



<p>Wdrożenie podejścia ciągłego dostarczania niesie wiele korzyści, do których należą:</p>



<h3 class="wp-block-heading">#1. Oszczędność czasu</h3>



<p>W średnich i dużych firmach programy oraz ich infrastruktura są zwykle tworzone i obsługiwane przez wiele oddzielnych zespołów. Każde wdrożenie nowej wersji aplikacji musi być skoordynowane między nimi. Należy ustalić między zespołami datę wprowadzenia nowej zmiany, takiej, która obu zespołom będzie odpowiadała.</p>



<p>Ponadto należy rozpowszechnić informację na temat nowej wersji (na przykład: jakie obszary aplikacji zostaną poddane zmianom, czy jest wymagana nowa konfiguracja, zmiany w integracji itp.). Dodatkowo zespoły muszą udostępnić niezbędne pliki, i tak dalej – procedury mogą się różnić w zależności od stopnia formalności i dojrzałości procesów w organizacji.</p>



<p>Generalnie wszystkie niezbędne działania z pewnością będą trwały kilka godzin, czasem nawet kilka dni. Często procesowi temu towarzyszą również przestoje spowodowane różnymi czynnikami. A ponieważ przestojów należy unikać w godzinach pracy, zdarza się, że wdrożenia odbywają się w nocy lub w weekend. Może to działać demotywująco na zespoły operacyjne odpowiedzialne za wdrożenie, a stąd już tylko krok do popełniania błędów. Wprowadzenie ciągłego wdrażania poprzez automatyzację zadań może zaoszczędzić wiele czasu i skrócić proces z kilku dni do nawet kilku minut oraz oszczędzić nerwów ludziom z zespołów operacyjnych. Dobrze skonfigurowane narzędzie pozwoli na praktycznie bezobsługowe wdrożenie, koordynowane przez jedną lub kilka osób bez potrzeby angażowania całych zespołów.</p>



<h3 class="wp-block-heading">#2. Krótsze cykle wdrożeń</h3>



<p>Firmy wykonujące wydania i wdrożenia manualnie robią to zwykle raz w tygodniu lub nawet rzadziej. Rzadkie wydania doprowadzają do przedłużających się procesów rozwoju, a w ostateczności spowolnienia czasu wprowadzenia produktu na rynek. Jeżeli na przykład oprogramowanie jest aktualizowane raz na kwartał, wprowadzenie nowej, małej funkcji lub istotnej poprawki może niepotrzebnie rozciągnąć się w czasie i spowodować odpływ klientów. Na przykład właściciel sklepu internetowego, w którym pewien etap procesu zakupowego został źle zaprojektowany (co powoduje trudności w zakupach) będzie musiał czekać 3 miesiące, zanim poprawka zostanie wdrożona. W tym czasie sklep może stracić ogromną liczbę klientów, a co za tym idzie – realne pieniądze. Automatyczne wdrażanie może całkowicie wyeliminować ten rodzaj problemów.</p>



<h3 class="wp-block-heading">#3. Krótszy czas otrzymania informacji zwrotnej (feedback)</h3>



<p>Najlepszym sposobem na uzyskanie wartościowych opinii na temat produktu jest wdrożenie go na środowisko produkcyjne, gdzie będzie ono używane przez prawdziwych użytkowników. Dzięki temu można mierzyć ich zaangażowanie w różnych częściach systemu. Użytkownicy często wyrażają również opinie na temat aplikacji i sugerują zmiany.</p>



<p>Niestety, zadanie to nie jest takie proste, gdy tworzy się na przykład narzędzia do użytku wewnętrznego w firmie. Można wtedy poprosić kilka osób, aby przetestowały je na jednym ze środowisk testowych, lecz to rodzi wyzwania. Potrzeba na to wykorzystania ich roboczogodzin, środowisko testowe musi być w pełni przygotowane i skonfigurowane z wszystkimi niezbędnymi danymi, które na końcu i tak zostaną usunięte. Jest to proces czasochłonny i skomplikowany.</p>



<p>Przy ręcznych wydaniach, co często idzie w parze z nieczęstym okresem wdrażania, cykl otrzymania feedbacku jest bardzo powolny, co jest sprzeczne z całą ideą zwinnego procesu wytwarzania oprogramowania. Komunikacja między ludźmi również nie zawsze jest idealna – praca w grupie to zawsze ryzyko nieporozumień. Zdarza się, że pierwsza implementacja funkcjonalności nie spełnia pierwotnych oczekiwań. W takiej sytuacji dyskusje (a więc informacja zwrotna) są nieuniknione. Powolne cykle wdrożeniowe prowadzą zatem do spowolnienia rozwoju aplikacji, frustrując nie tylko zespół, ale także interesariuszy. Użytkownicy docelowi, zdając sobie sprawę z czasu trwania wdrażania kolejnych aktualizacji, mogą nawet nie prosić o poprawki lub nie sugerować różnych udogodnień – prędzej przeniosą się do aplikacji konkurencyjnej, której autorzy lepiej dbają o ten aspekt. Na dłuższą metę powolne cykle wdrożeniowe przekładają się na utratę jakości aplikacji i odpływ użytkowników.</p>



<h3 class="wp-block-heading">#4. Niezawodność wydań</h3>



<p>Manualne wdrażanie zazwyczaj nie odbywa się często. To oznacza, że każde wydanie zawiera dużo zmian, co z kolei zwiększa ryzyko niepowodzenia. Gdy duże aktualizacje są źródłem zbyt wielu problemów, inżynierowie i managerowie szukają sposobów na poprawę stabilności kolejnego wydania, niejednokrotnie poprzez tworzenie kolejnych procedur i list kontrolnych.</p>



<p>Tworzy to błędne koło, ponieważ więcej procesów wymaga włożenia jeszcze większego wysiłku w kolejne wydania, a co za tym idzie – więcej czasu. Sprawia to, że cykle wydawania oprogramowania są jeszcze dłuższe, co z kolei rodzi potrzebę zmiany procedur, aby… ten czas skrócić. Sposobem na wyjście z tego błędnego koła jest automatyzacja etapów lub nawet całego procesu wydawania. Gdy więc proces ten stanie się niezawodny i szybszy, nic nie będzie stało na przeszkodzie, aby zwiększyć liczbę wydań, które jednorazowo będą zawierały mniejsze zmiany. Czas zaoszczędzony dzięki automatyzacji uwalnia zasoby, które można wykorzystać, aby jeszcze bardziej usprawnić zautomatyzowany proces wydawania.</p>



<h3 class="wp-block-heading">#5. Mniejsze pakiety ułatwiają znalezienie źródła problemu</h3>



<p>Kiedy wdrożenie spowoduje błąd w oprogramowaniu (a zawierało ono tylko jedną lub dwie nowe funkcje lub same poprawki błędów), dość łatwo można ustalić, która ze zmian stanowi źródło błędu. Duże pakiety, gdzie na jedno wydanie przypada wiele zmian w różnych częściach aplikacji, utrudniają znalezienie źródła problemów i wydłużają czas poszukiwań oraz naprawy. Ta, ze względu na wiele zmian zawartych w wydaniu (poziom skomplikowania pakietu przez różne zależności) trwa dłużej.</p>



<h3 class="wp-block-heading">#6. Swoboda architektoniczna</h3>



<p>Obecne trendy w inżynierii oprogramowania odchodzą od monolitycznych aplikacji na rzecz systemów rozproszonych, składających się z małych komponentów (mikroserwisów). Mniejsze aplikacje lub usługi są łatwiejsze w utrzymaniu, a wymagania dotyczące skalowalności wymuszają, aby działały na różnych urządzeniach, często na wielu jednocześnie. Ręczne wydawanie poszczególnych mikroserwisów, w przypadku gdy są ich setki, wydaje się być niemożliwe do przeprowadzenia w sposób bezawaryjny w satysfakcjonującym czasie. Automatyzacja wdrożeń pozwala konfigurować wydawanie aplikacji w sposób optymalny, tak, aby zapewnić niezawodność działania oprogramowania.</p>



<h3 class="wp-block-heading">#7. Zaawansowane techniki zapewnienia jakości</h3>



<p>Wyobraźmy sobie wyszukiwarkę wycieczek, której właściciel chce ulepszyć algorytm wyszukiwania. Można wdrożyć zarówno starą, jak i nową wersję silnika jednocześnie i uruchamiać zapytania na obu. Definiując przy tym odpowiednie metryki, można w prosty sposób oceniać działanie nowego algorytmu. Dzięki nim, w przypadku, gdy stary silnik będzie zwracał na przykład lepsze wyniki na niektóre zapytania – można wykorzystać te dane w celu ulepszenia nowego. Automatyczne wdrażanie nie jest samo w sobie gwarantem zapewnienia jakości, ale stanowi bazę do zastosowania zaawansowanych technik w celu jego osiągnięcia.</p>



<h2 class="wp-block-heading" id="Automatyzacja-vs-manualne-wdrazanie">Automatyzacja vs. manualne wdrażanie</h2>



<p>Główne praktyki stosowane w obu podejściach (Continuous Integration i Continuous Deployment) są jednakowe. Różnicę stanowi etap zastosowania automatyzacji wdrożenia do środowiska produkcyjnego, co obrazuje poniższy rysunek.  </p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2024.05.16_graphic_1-1.png" alt="CI/CD diagram pokazujący proces automatyczny i proces manualny" class="wp-image-14832" title="Dostarczanie wydajnego oprogramowania: automatyzacja CI/CD  3"></figure></div>


<p>Jak już wspomniałem, celem podejścia Continuous Delivery jest automatyzacja każdego etapu cyklu wdrażania do ostatniego środowiska przedprodukcyjnego, dzięki czemu zmiany można wprowadzić na docelowe środowisko w dowolnym momencie. W Continuous Deployment zmiany są dostarczane bezpośrednio na środowisko produkcyjne. Różnica to sposób wdrażania – automatyczny lub manualny.</p>



<p>Praktyka ciągłego wdrażania jest skomplikowana, procesy wykorzystywane w ciągłej integracji nie są w stanie pokryć wszystkich niezbędnych etapów koniecznych do jej poprawnego zaimplementowania w projekcie. Niezbędne jest użycie dodatkowych narzędzi, pozwalających na testowanie i kontrolowanie różnych części systemu (na przykład wydajności, gotowości do działania, weryfikacja poprawności integracji itp.).</p>



<h2 class="wp-block-heading" id="Podsumowanie">Podsumowanie</h2>



<p>Dziś bez praktyk CI/CD trudno wyobrazić sobie jakikolwiek nowoczesny projekt IT. Automatyzacja procesów ciągłej integracji i ciągłego dostarczania pozwala nam skrócić czas wdrażania zmian, wydawać oprogramowanie częściej i w sposób niezawodny. Dodatkowo szybciej uzyskujemy feedback od użytkowników. Już teraz zachęcam was do lektury drugiej części artykułu. Przyjrzę się w nim bliżej procesowi dostarczania oprogramowania z wykorzystaniem CI/CD i omówię konkretne praktyki testerskie wraz z przeglądem najlepszych narzędzi CI/CD.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nearshore-it.eu/pl/artykuly/automatyzacja-ci-cd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Usługa Azure Active Directory w aplikacjach multi-tenant</title>
		<link>https://nearshore-it.eu/pl/artykuly/usluga-azure-active-directory/</link>
					<comments>https://nearshore-it.eu/pl/artykuly/usluga-azure-active-directory/#respond</comments>
		
		<dc:creator><![CDATA[Adam Sosinski]]></dc:creator>
		<pubDate>Thu, 22 Jun 2023 11:24:13 +0000</pubDate>
				<category><![CDATA[Artykuły]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Cloud engineering]]></category>
		<category><![CDATA[DevOps]]></category>
		<guid isPermaLink="false">https://nearshore-it.eu/artykuly/usluga-azure-active-directory/</guid>

					<description><![CDATA[Budowanie systemu do zarządzania poświadczeniami od podstaw jest bardzo trudnym zadaniem i wymaga ogromnej wiedzy z zakresu bezpieczeństwa. Na szczęście na rynku dostępne są gotowe rozwiązania, takie jak np. Azure Active Directory (AAD).]]></description>
										<content:encoded><![CDATA[
<div class="table-of-contents">
    <p class="title">PRZEJDŹ DO:</p>
    <ol>
                    <li><a href="#Active-Directory?-">1.  Czym jest usługa Azure Active Directory? </a></li>
                    <li><a href="#-multi-tenant?-">2.  Czym jest aplikacja multi-tenant? </a></li>
                    <li><a href="#ługą-Azure-AD">3.  Rozpocznij pracę z usługą Azure AD </a></li>
                    <li><a href="#Rejestrowanie-aplikacji-multi-tenant-">4.  Rejestrowanie aplikacji multi-tenant </a></li>
                    <li><a href="#Logowanie-do-aplikacji-jako-użytkownik-zewnętrznyu002du002d">5.  Logowanie do aplikacji jako użytkownik zewnętrzny  </a></li>
                    <li><a href="#Aplikacja-multi-tenant-wywołująca-wewnętrzne-API-">6.  Aplikacja multi-tenant wywołująca wewnętrzne API </a></li>
                    <li><a href="#Zarządzanie-tożsamościami-–-ograniczanie-dostępu-do-aplikacji-">7.  Zarządzanie tożsamościami – ograniczanie dostępu do aplikacji </a></li>
                    <li><a href="#Usługa-Azure-AD-od-Microsoft-–-podsumowanie-">8.  Usługa Azure AD od Microsoft – podsumowanie </a></li>
            </ol>
</div>


<p>Zarządzanie dostępami do aplikacji jest zagadnieniem poruszanym w przypadku niemal każdego systemu. Dbając o odpowiednie uwierzytelnianie, nie tylko ograniczamy możliwości pozyskania czy modyfikowania wrażliwych danych, ale mamy również większą elastyczność w przypadku tzw. User Experience, poprzez definiowanie ról czy właściwości związanych z danym użytkownikiem.&nbsp;</p>



<h2 class="wp-block-heading" id="Active-Directory?-">Czym jest usługa Azure Active Directory?&nbsp;</h2>



<p><strong>Azure Active Directory (AAD)</strong> jest serwisem chmurowym firmy Microsoft pozwalającym na zarządzanie dostępami i tożsamościami. Korzystając z tego rozwiązania, możemy również rejestrować nasze aplikacje i określać zasady dostępności. Przy czym rozważamy tutaj zarówno dostępy użytkowników, jak i innych aplikacji. Do zarejestrowanego rozwiązania w danej dzierżawie (<strong>z ang. tenant</strong> ) dostęp mogą mieć wszystkie obiekty (użytkownicy, aplikacje) ją współdzielące. AAD pozwala również na „udostępnianie” aplikacji innym najemcom, dzięki czemu nie musimy martwić się o zarządzanie użytkownikami zewnętrznymi naszej aplikacji. Tak skonfigurowane rozwiązanie nazywamy <a href="https://nearshore-it.eu/pl/artykuly/multi-tenant-czy-single-tenant/" target="_blank" rel="noreferrer noopener">multi-tenantowym.</a>&nbsp;</p>



<h2 class="wp-block-heading" id="-multi-tenant?-">Czym jest aplikacja multi-tenant?&nbsp;</h2>



<p>Aplikacja typu multi-tenant<strong> pozwala obsługiwać wielu dzierżawców poprzez jedną instancję</strong>. Przy tego typu rozwiązaniach istotne jest, aby klient nie miał dostępu do danych należących do innych najemców. Jest to najczęściej rozwiązywane poprzez logikę biznesową lub rozdzielenie baz danych tak, aby każdy klient miał własną.&nbsp;</p>



<p>Aplikacja wielodostępowa zarejestrowana w Azure Active Directory pozwala przenieść zarządzanie użytkownikami i określanie poziomu dostępu do rozwiązania na barki administratora danego dzierżawcy. Zmniejsza to koszty związane z utrzymywaniem użytkowników po stronie dostawcy usługi.&nbsp;&nbsp;</p>



<p>Należy jednak pamiętać, że kwestia dostępu do poszczególnych elementów aplikacji jest dalej rozwiązywana przez programistów poprzez definiowanie odpowiednich polityk w kodzie.&nbsp;</p>



<h2 class="wp-block-heading" id="ługą-Azure-AD">Rozpocznij pracę z usługą Azure AD</h2>



<p>Firma Microsoft udostępnia administratorom materiały niezbędne do zarządzania usługami w Azure Portalu.&nbsp; Dokumentacja zawiera też odpowiedzi na często zadawane pytania. Wszelkie informacje są dostępne na stronie <a href="https://learn.microsoft.com/en-us/azure/active-directory/fundamentals/active-directory-whatis" target="_blank" rel="noreferrer noopener">Microsoft Azure Active Directory,</a>  gdzie można się dowiedzieć wszystkiego na temat zarządzania tożsamością i dostępami w chmurze. Jeżeli jeszcze nie korzystasz z usług Microsoft Azure, warto zacząć właśnie w tym miejscu.&nbsp;&nbsp;&nbsp;</p>



<h2 class="wp-block-heading" id="Rejestrowanie-aplikacji-multi-tenant-">Rejestrowanie aplikacji multi-tenant&nbsp;</h2>



<p>Podczas rejestracji nowej aplikacji jesteśmy zobligowani do wybrania, jakiego rodzaju konta chcemy wspierać. Wybierając opcję zaznaczoną poniżej, dajemy możliwość dostępu innym dzierżawcom. Jeżeli mamy wątpliwości, którą opcję wybrać, pod sekcją znajduje się link z krótkim opisem, na co zezwala każda z nich.&nbsp;</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.31_graphic_1.png" alt="azure active directory " class="wp-image-8744" title="Usługa Azure Active Directory w aplikacjach multi-tenant 4"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Zarejestrowanie obiektu aplikacji powoduje utworzenie aplikacji biznesowej, a dokładniej jednostki usługi (z ang. Service Principal). To właśnie do jednostki usługi są podpinane dostępy użytkownika do aplikacji. Dokładnie ten sam mechanizm jest wykorzystywany w przypadku zewnętrznych klientów.&nbsp;</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.31_graphic_2.png" alt="azure active directory " class="wp-image-8746" title="Usługa Azure Active Directory w aplikacjach multi-tenant 5"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading" id="Logowanie-do-aplikacji-jako-użytkownik-zewnętrzny--">Logowanie do aplikacji jako użytkownik zewnętrzny&nbsp;&nbsp;</h2>



<p>Przy pierwszej próbie logowania do aplikacji jesteśmy poproszeni o udzielenie zgody dla danej aplikacji. W zależności od ustawień dzierżawcy będziemy mogli sami jej udzielić lub będzie ona wymagała zatwierdzenia przez administratora.&nbsp;&nbsp;</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.31_graphic_3-1.png" alt="azure active directory" class="wp-image-8751" style="width:762px;height:573px" title="Usługa Azure Active Directory w aplikacjach multi-tenant 6"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Warto nadmienić, że administrator udziela zgody dla wszystkich użytkowników, przez co tylko pierwsze logowanie do aplikacji jakimkolwiek użytkownikiem będzie wywoływać prośbę o udzielenie uprawnień.&nbsp;&nbsp;</p>



<p>Przy samoakceptacji (<strong>self-consent</strong>) będzie ona wywoływana indywidualnie dla każdego użytkownika przy pierwszej próbie logowania.&nbsp;</p>



<p>Tu u niektórych z was mogą pojawić się obawy: czy zezwalając na dostęp do danych użytkownika, przydzielamy go dostawcy, u którego aplikacja została zarejestrowana? Spokojnie, nie do końca tak jest. Podobnie jak w przypadku dzierżawcy pierwotnego tworzona jest jednostka usługi jako aplikacja biznesowa, i to w zależności od ustawionych dostępów względem niej nasze rozwiązanie pozyskuje informacje o aktualnie zalogowanym użytkowniku.&nbsp;</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.31_graphic_4.png" alt="azure active directory " class="wp-image-8759" title="Usługa Azure Active Directory w aplikacjach multi-tenant 7"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Gdy DevOps lub inżynier rejestruje aplikację i chce, aby logowano się do niej przez Microsoft, docelowa aplikacja z docelowymi dostępami używanymi przy logowaniu utworzy się automatycznie podczas rejestracji. Nie ma wówczas potrzeby, by użytkownicy wyrażali zgodę dla aplikacji w tej dzierżawie.&nbsp;</p>



<p><strong>Przeczytaj także: </strong><a href="https://nearshore-it.eu/pl/artykuly/wprowadzenie-do-swiata-azure-iot/">Czym jest Azure IoT? Jakie daje możliwości? Jaki jest koszt usług i gdzie zdobyć niezbędną wiedzę?</a></p>



<h2 class="wp-block-heading" id="Aplikacja-multi-tenant-wywołująca-wewnętrzne-API-">Aplikacja multi-tenant wywołująca wewnętrzne API&nbsp;</h2>



<p>Często, zwłaszcza w przypadku mikroserwisów, zdarza się, że nasza aplikacja komunikuje się z inną poprzez jej API. Kiedy dzieje się to<strong> w modelu serwis do serwisu</strong>, wystarczy, że zagwarantujemy dostęp w dzierżawie dostawcy. Sytuacja komplikuje się, kiedy chcemy aby aplikacja komunikowała się poprzez API w imieniu zalogowanego użytkownika.&nbsp;</p>



<p>Dla rozwiązania multi-tenantowego musimy zagwarantować, że API ma swojego reprezentanta u najemcy w postaci jednostki usługi, co <strong>wymusza publiczną dostępność szablonu API</strong>. Wszystko za sprawą mechanizmu weryfikacji dostępów, który tak naprawdę ma miejsce ramach tenanta, tj. dzierżawcy użytkownika.&nbsp;Dlatego należy dokładnie przemyśleć model komunikacji między aplikacjami.&nbsp;</p>



<p>Istotne jest, aby w zarejestrowanym obiekcie aplikacji API zdefiniować aplikację webową jako jedną ze zautoryzowanych – dzięki temu klient będzie mógł zezwolić na dostęp do API, a tym samym jednostka usługi zostanie zarejestrowana w jego dzierżawie.&nbsp;</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.31_graphic_5.png" alt="azure active directory " class="wp-image-8760" title="Usługa Azure Active Directory w aplikacjach multi-tenant 8"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading" id="Zarządzanie-tożsamościami-–-ograniczanie-dostępu-do-aplikacji-">Zarządzanie tożsamościami – ograniczanie dostępu do aplikacji&nbsp;</h2>



<p>Jak już wspomniałem, w momencie pojawienia się aplikacji biznesowej u danego dzierżawcy każdy użytkownik ma do niej dostęp. Możemy jednak to ograniczyć.&nbsp;&nbsp;</p>



<p>Jeżeli chcemy, aby tylko określeni użytkownicy czy też grupa użytkowników miała dostęp, musimy ustawić naszą jednostkę usługi w taki sposób, żeby wymagała przypisania.&nbsp;</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.31_graphic_6.png" alt="azure active directory " class="wp-image-8761" title="Usługa Azure Active Directory w aplikacjach multi-tenant 9"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Wtedy, aby użytkownik bądź grupa miała dostęp, aplikacja musi widnieć w przypisanych do użytkownika lub grupy.&nbsp;</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.31_graphic_7.png" alt="azure active directory " class="wp-image-8762" title="Usługa Azure Active Directory w aplikacjach multi-tenant 10"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Innym sposobem na modyfikowanie dostępów do aplikacji jest dostęp warunkowy, który pozwala wymuszać pewne zachowania bądź blokować dostęp w zależności od ustawionych scenariuszy. Opcja ta jest jednak dostępna w wersji Premium Azure Active Directory.&nbsp;Informacje o planach cenowych i dostępnych usługach znajdziesz na stronie<a href="https://azure.microsoft.com/pl-pl/pricing/details/active-directory/" target="_blank" rel="noreferrer noopener"> Microsoft Azure.</a>&nbsp;</p>



<h2 class="wp-block-heading" id="Usługa-Azure-AD-od-Microsoft-–-podsumowanie-">Usługa Azure AD od Microsoft – podsumowanie&nbsp;</h2>



<p>Aplikacja wielodostępowa pozwala zredukować koszty poprzez współdzielenie jednej instancji przez wielu klientów. Zastosowanie Azure Active Directory do zarejestrowania takiego rozwiązania ogranicza dodatkowo koszty związane z utrzymywaniem użytkowników, gdyż niejako korzystamy z tych należących do najemcy. To od administratora dzierżawcy, który chce mieć dostęp, zależy, komu i w jakim zakresie chce go przydzielić.&nbsp;</p>



<p>Niestety ograniczamy się wtedy tylko do klientów Microsoft, przez co możemy być mniej konkurencyjni. Jeżeli chcielibyśmy mieć rozwiązanie dostępne dla klientów niezależnie od dostawcy poświadczeń którego używają, ciekawą opcją jest <strong>Azure Active Directory B2C z Single Sign-On</strong>.&nbsp;&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nearshore-it.eu/pl/artykuly/usluga-azure-active-directory/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Jak postawić serwer TCP (Transmission Control Protocol) na platformie Azure – krok po kroku</title>
		<link>https://nearshore-it.eu/pl/artykuly/jak-postawic-serwer-tcp-na-azure/</link>
					<comments>https://nearshore-it.eu/pl/artykuly/jak-postawic-serwer-tcp-na-azure/#respond</comments>
		
		<dc:creator><![CDATA[Adam Sosinski]]></dc:creator>
		<pubDate>Wed, 08 Feb 2023 14:18:36 +0000</pubDate>
				<category><![CDATA[Artykuły]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Cloud engineering]]></category>
		<category><![CDATA[DevOps]]></category>
		<guid isPermaLink="false">https://nearshore-it.eu/artykuly/jak-postawic-serwer-tcp-na-azure/</guid>

					<description><![CDATA[Gdy rozwijamy aplikację, często zachodzi potrzeba integrowania jej z zewnętrznymi systemami. Zdarza się, że komunikacja z nimi jest niestabilna albo sama konfiguracja wymusza posiadanie fizycznych urządzeń, aby developer na etapie programowania mógł całościowo przetestować rozwiązanie. Programując pod kątem komunikacji z urządzeniem (gdy np. w kodzie jest jego adres IP), jesteśmy zależni od jego funkcjonalności i dostępności. Dobrą praktyką jest wtedy pewnego rodzaju odizolowanie naszego systemu, aby warunki zewnętrzne nie wpływały na codzienną pracę nad oprogramowaniem. Z tego artykułu dowiesz się, jak odpowiedzieliśmy na to wyzwanie, wdrażając komunikację po TCP z wykorzystaniem Azure. Jeżeli kiedykolwiek stanąłbyś przed zadaniem postawienia serwera TCP z wykorzystaniem Microsoft Azure, ten materiał przeprowadzi cię przez ten proces krok po kroku.]]></description>
										<content:encoded><![CDATA[
<div class="table-of-contents">
    <p class="title">Przejdź do:</p>
    <ol>
                    <li><a href="#Serwer-TCP-na-platformie-Azure-–-ale-po-co?">1.  Serwer TCP na platformie Azure – ale po co?</a></li>
                    <li><a href="#Komunikacja-po-TCP-–-jakie-są-opcje?">2.  Komunikacja po TCP – jakie są opcje? </a></li>
                    <li><a href="#Konfigurujemy-Azure-Container-Instances">3.  Konfigurujemy Azure Container Instances </a></li>
                    <li><a href="#Czas-na-testy">4.  Testy</a></li>
                    <li><a href="#Problem-zmiany-adresu-IP-po-przeładowaniu…">5.  Problem zmiany adresu IP po przeładowaniu&#8230;   </a></li>
                    <li><a href="#Container-Apps-z-TCP-jako-kolejny-etap-ewolucji">6.  Container Apps z TCP jako kolejny etap ewolucji </a></li>
                    <li><a href="#Podsumowanie">7.  Podsumowanie</a></li>
            </ol>
</div>


<h2 class="wp-block-heading" id="Serwer-TCP-na-platformie-Azure-–-ale-po-co?">Serwer TCP (Transmission Control Protocol) na platformie Azure – ale po co?</h2>



<p>W naszym projekcie, pracując nad rozwiązaniem pozwalającym systemom POS (ang. point of sale) na obsługiwanie płatności, musieliśmy <strong>zintegrować je z systemem obsługującym komunikację z terminalami płatniczymi</strong>. Wiązało się to z posiadaniem fizycznego urządzenia, w tym przypadku terminala, do celów testowych. Pracując w trybie zdalnym, z zespołem rozproszonym po kilku miastach w Polsce, niemożliwe było współdzielenie jednego takiego urządzenia. Zdecydowaliśmy, że do testów i na etapie pracy nad kodem będziemy <strong>używać stuba </strong>(czyt. staba) – aplikacji, która będzie zwracała predefiniowane odpowiedzi).</p>



<p>Lista wymagań wobec naszego zamiennika była bardzo krótka:</p>



<ul class="wp-block-list">
<li><strong>Komunikacja musi odbywać się po TCP</strong></li>



<li><strong>Żądanie musi zwracać oczekiwaną odpowiedź</strong></li>



<li><strong>Serwer musi być w stanie obsłużyć równoległe żądania</strong></li>
</ul>



<p>Gotowe rozwiązanie w .NET było przygotowane tak, aby można je było uruchomić lokalnie na Dockerze.</p>



<p>Po upewnieniu się, że stub spełnia nasze oczekiwania i bez ryzyka może zastąpić rzeczywistą integrację, postanowiliśmy użyć go do testów E2E (ang. end to end), które są elementem pipeline’u <a href="https://nearshore-it.eu/pl/artykuly/kim-jest-devops-i-jak-wspiera-projekty-it" data-type="URL" data-id="https://nearshore-it.eu/pl/artykuly/kim-jest-devops-i-jak-wspiera-projekty-it" target="_blank" rel="noreferrer noopener">DevOps</a>. W tym celu trzeba było aplikację umieścić gdzieś na platformie Azure, z której korzystaliśmy.</p>


<div class="image-with-text">
    <div class="container">
        <div class="tiles latest-news-once">
            <div class="tile" style="max-height: unset; height: 350">
                <div class="tile-image">
                                            <img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/2021.11.03_jpro_cover-3_min_c-1.jpg" alt="2021.11.03 jpro cover 3 min c 1" title="Jak postawić serwer TCP (Transmission Control Protocol) na platformie Azure – krok po kroku 11">
                                    </div>
                <div class="tile-content fadeIn wow">
                    <h3>Azure Serverless workflow orchestration</h3>
<p>Automatyzacja procesów biznesowych jest naturalną transformacją. Poznaj rozwiązanie oparte na Azure Durable Function, które pozwoli ci przejść gładko przez ten proces.</p>
<p><a href="https://nearshore-it.eu/pl/artykuly/azure-serverless-workflow-orchestration/" class="btn btn-red btn-arrow">Przeczytaj artykuł</a></p>
                </div>
            </div>
        </div>
    </div>
</div>


<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading" id="Komunikacja-po-TCP-–-jakie-są-opcje?">Komunikacja po TCP – jakie są opcje?</h2>



<p>Największą trudnością w znalezieniu odpowiedniego zasobu okazał się wymagany rodzaj protokołu, niewspierany przez serwisy bazujące głównie na komunikacji po HTTP. Jakie mieliśmy opcje?</p>



<ol class="wp-block-list">
<li><strong>Maszyna wirtualna</strong> – można postawić maszynę wirtualną i na niej uruchomić aplikację, ale wymagałoby to dodatkowej konfiguracji dostępu do maszyny oraz utrudniało monitorowanie samej aplikacji.</li>



<li><strong>Azure Kubernetes Services</strong> – kolejną opcją jest AKS, który daje sporą elastyczność w kwestii automatyzacji zarządzania infrastrukturą, jednak na potrzeby prostego stuba jest to nadmiarowe rozwiązanie (wymagałoby odpowiedniej konfiguracji, a i tak nie wykorzystalibyśmy wielu opcji, jakie oferuje).</li>



<li><strong>Azure Container Instances </strong>– przeglądając portfolio usług Azure, natrafiłem na informację, że protokół TCP jest dostępny dla Azure Container Instances. Wyglądało to na idealne rozwiązanie, które można byłoby w prosty sposób uruchomić. Dodatkowym atutem była łatwość monitorowania i fakt, że lokalnie stub działał na kontenerze dockerowym.</li>
</ol>



<p><strong>Obejrzyj także wideo z&nbsp;serii BiteIT:</strong></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="BiteIT #58: Let`s secure your App Service on Azure | Marcin Niesyn" width="500" height="281" src="https://www.youtube.com/embed/fDSI_-OCCU8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading" id="Konfigurujemy-Azure-Container-Instances">Konfigurujemy Azure Container Instances</h2>



<p>Na potrzeby tego artykułu przygotowałem uproszczoną wersję docelowego rozwiązania. Działa ono jak echo, zwracając otrzymane żądanie do nadawcy, i to właśnie tę aplikację będę starał się udostępnić poprzez Azure Container Instances.</p>



<p>Poniżej fragment kodu serwera odpowiedzialny za obsługę żądań.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">private void Echo(IAsyncResult result) 

{ 

var listener = (TcpListener)result.AsynState!; 
	 

if (!_active) 

     { 

          return 

 
     } 
 
     var client = listener.EndAcceptTcpClient(result); 

     _logger.LogInformation(“Client connected from: {ip}”, 
     client.Client.RemoteEndPoint); 
     _allDone.Set(); 

     Task.Run(async () => 

     { 

          using (var stream = client.GetStream()) 

          var buffer = _array.Pool.Rent(256); 

         Array.Pool.Return(await stream.Echo(buffer), clearArray: true); 
     } 

     client. Close(); 

     }); 

 
} </pre>



<p>Jako osoby zajmujące się wytwarzaniem oprogramowania powinniśmy <strong>dążyć do automatyzowania powtarzalnych czynności</strong>, dlatego całą konfigurację zasobów umieściłem <strong>w plikach Bicep</strong>. Takie rozwiązanie pozwala używać raz zdefiniowanej konfiguracji wielokrotnie podczas wdrażania jej na platformie Azure.</p>



<p>Podstawowa konfiguracja Azure Container Instances wymaga zdefiniowania:</p>



<p>1. Zasobów, z jakich może korzystać skonteneryzowana aplikacja.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">resources: { 

     requests: {  

          cpu: 1  

          memoryInGB: 1  
     } 
} </pre>



<p>2. Lokalizacji obrazu, na podstawie którego będzie budowany kontener, wraz ze zdefiniowanymi portami zewnętrznymi.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">image: '${containerRegistryName}/tcp-server:latest’ 

ports: [  

{ 

port: port 

protocol 'TCP' 

} 

] </pre>



<p>3. Dostępu do rejestru, na którym znajduje się obraz.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">imageRegistryCredentials: [ 

{ 

server: containerRegistryName 

username: registryUserName 

password: registryPassword 

} 

] </pre>



<p>4. Konfiguracji adresu IP.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">IpAddress: { 

type: ‘Public’ 

ports: [  

    {  

port: port 

protocol: ‘TCP’  

    } 

          ] 

} </pre>



<p><strong>Najważniejsza rzecz, o której trzeba pamiętać, to aby wewnętrzny port odpowiadał portowi zewnętrznemu, inaczej komunikacja po TCP nie będzie działać.</strong></p>



<p>Poniżej cały plik Bicep dla konfiguracji Azure Container Instances:</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/TCP_01-762.png" alt="plik Bicep dla konfiguracji Azure Container Instances:" class="wp-image-8861" title="Jak postawić serwer TCP (Transmission Control Protocol) na platformie Azure – krok po kroku 12"></figure>



<h2 class="wp-block-heading" id="Czas-na-testy">Czas na testy</h2>



<p>Po wdrożeniu na środowisko Azure mogliśmy upewnić się, że aplikacja działa i nasłuchuje na żądania.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.02.08_graphic_1.png" alt="Protokół tcp zapewnia usługi połączeniowe" class="wp-image-69569" title="Jak postawić serwer TCP (Transmission Control Protocol) na platformie Azure – krok po kroku 13"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.02.08_graphic_2.png" alt="Segment tcp zawiera sumę kontrolną" class="wp-image-69571" title="Jak postawić serwer TCP (Transmission Control Protocol) na platformie Azure – krok po kroku 14"></figure></div>


<p>Do celów testowych napisałem prostego klienta TCP jako test w xUnit.&nbsp;</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[Fact]  

public void MakeSingleCall() 

{ 

var buffer = _arrayPool.Rent(256); 

try 

{ 

using var client = GetClient(); 

using var stream = client.GetStream(); 

stream.Write(Encoding.UTF8.GetBytes(TestMessage)); 

 

          while (!stream.DataAvailable) 

          { 

               Thread.Sleep(1000); 

          } 

 

          StringBuilder sb = new(); 

          while (Stream.DataAvailable) 

         { 

         var readBytes = stream. Read(buffer); 

         Sb.Append(Encoding.UTF8.GetString(buffer[...readBytes])); 

         } 

         Assert.Equal(TestMessage, sb.ToString()); 

    } 

    finally   

    { 

           _arrayPoolReturn(buffer); 

    } 


} </pre>



<p>Do nawiązywania połączenia służy prywatna metoda GetClient.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">private static TcpClient GetClient() 

{  

var socketException = new SocketException(); 

ushort attempts = 0; 

while (attempts &lt; RetryAttempt) 

{ 

try  

{ 

TcpClient client = new (HostName, Port); 

return client; 

          } 

          catch (socketException  ex  

          { 

          socketException = ex; 

                attempts++; 

                Thread.Sleap(TimeSpan.FromSeconds(Math.Pow(2,  attempts))); 

                continue;   

 

          } 

     } 

     throw SocketException; 

} </pre>



<p>Jak widać, test zakończył się sukcesem, a w logach kontenera mamy informację o nawiązaniu połączenia.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.02.08_graphic_3.png" alt="TCP  pozwala przesyłać i odebrać dane między procesami " class="wp-image-69573" title="Jak postawić serwer TCP (Transmission Control Protocol) na platformie Azure – krok po kroku 15"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.02.08_graphic_4.png" alt=" IP to identyfikator liczbowy" class="wp-image-69577" title="Jak postawić serwer TCP (Transmission Control Protocol) na platformie Azure – krok po kroku 16"></figure></div>


<h2 class="wp-block-heading" id="Problem-zmiany-adresu-IP-po-przeładowaniu…">Problem zmiany adresu IP po przeładowaniu…</h2>



<p>Mógłbym w tym momencie przejść do podsumowania, jako że mamy działającą aplikację w Azure pozwalającą na komunikację po TCP. Niestety <a href="https://learn.microsoft.com/en-us/azure/container-instances/container-instances-stop-start" data-type="URL" data-id="https://learn.microsoft.com/en-us/azure/container-instances/container-instances-stop-start" target="_blank" rel="noreferrer noopener">w dokumentacji Azure Container Instances</a> jest informacja, że <strong>adres IP może się zmienić w przypadku przeładowania zasobu</strong>, co z kolei jest wymagane, aby pobrać najnowszą wersję obrazu aplikacji. Ryzyko zmiany adresu stuba sprawiało, że testy E2E nie mogły być częścią pipeline’u, ponieważ istniała możliwość, że będą fałszywie negatywne.</p>



<h3 class="wp-block-heading">…i rozwiązanie tego problemu</h3>



<p>Żeby nie wymuszać na kliencie serwera TCP pilnowania i zmieniania adresu IP po przeładowaniu zasobu, należy ten problem „schować” i obsłużyć wewnętrznie poprzez infrastrukturę. Na szczęście Azure zapewnia rozwiązania pozwalające to zrobić.</p>



<p>Docelowa architektura prezentuje się następująco:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.02.08_graphic_5.png" alt=" Czy Container Apps  z TCP może być nowym najczęściej stosowanym rozwiązaniem?" class="wp-image-69579" title="Jak postawić serwer TCP (Transmission Control Protocol) na platformie Azure – krok po kroku 17"></figure></div>


<p>I składa się z:</p>



<ul class="wp-block-list">
<li><strong>Publicznego IP</strong></li>



<li><strong>Load balancera</strong></li>



<li><strong>Sieci wirtualnej (VNet)</strong></li>



<li><strong>Container registry</strong></li>



<li><strong>Container instances</strong></li>
</ul>



<p>Konfigurację w plikach Bicep podzieliłem na moduły per typ zasobu oraz jeden plik główny jako punkt startowy do postawienia wszystkich niezbędnych elementów.</p>



<p>Aby zmniejszyć liczbę adresów IP, jakie mogą zostać przydzielone do kontenera, zdefiniowana podsieć ma tylko 8 adresów, z czego 5 jest na wewnętrzne potrzeby Azure, co zostawia nas z 3 dostępnymi adresami.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">resource virtualNetwork ‘Microsoft.Network/virtualNetworks@2022-05-01'  existing = { 

name:shared-vnet' 

} 

 

resource subnet ‘Microsoft.Network/virtualNetworks/subnets@2022-05-01' = { 

   name’tcp-server-sub' 

   parent: virtualNetwork 

   properties: { 

 	   	addressPrefix: ‘10.1.2.0/29 

delegations: [ 

   { 

name: ACIDelegationService’  

properties: {  

   serviceName: ‘Microsoft.ContainerInstance/containerGroups’  

type: ‘Microsoft.Network/virtualNetworks/subnets/delegations’ 

   } 

] 

privateEndpointNetworkPolicies: ‘Disabled’ 

privateLinkServiceNetworkPolicies: ‘Enabled’  

   } 

   	} 

 
output subnetId string = subnet.id </pre>



<p>Konfigurując load balancer, należy ustawić pulę dla dostępu do wewnętrznego zasobu.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">backendAddressPools: [  

     {  

     name: ‘tcp-server-be' 

     properties: {  

     loadBalancerBackendAddresses: [  

     { 

     name: ‘tcp-server’ 

         properties: { 

         ipAddress: backendPrivateIPAddress 

  	     virtualNetwork: { 

         id:virtualNetworkId 

         } 

         } 

      } 

   ] 

 } 

 } 

] </pre>



<p>Gdzie „ipAddress” jest adresem dla Container Instances wewnątrz podsieci.</p>



<p>Dodatkowo zdefiniowałem sprawdzanie żywotności kontenera poprzez próbkowanie.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">probes: [ 

{ 

name: ‘tcp-server-hc' 

properties: {  

   protocol: ‘Tcp’  

   port: tcpPort 

   intervalInSeconds: 5  

   numberOfProbes: 1  

          } 

     } 

]  </pre>



<p>Wszystkie te ustawienia są niezbędne do ustalenia reguł przekierowywania ruchu z publicznego adresu IP na wewnętrzne.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">loadBalancingRules: [ 

   { 

name:  ‘tcp-server-lb-rule' 

   properties: { 

frontendPort: tcpPort 

   protocol: ‘Tcp’ 

   backendPort: tcpPort 

   disableOutboundSnat: true 

   frontendIPConfiguration: { 

id: resourceId( ‘Microsoft.Network/loadBalancers/frontendIPConfigurations’, ‘tcp-server-lb', ‘tcp-server-fe' ) 

} 

backendAddressPool: { 

id: resourceId( ‘Microsoft.Network/loadBalancers/backendAddressPools’, ‘tcp-server-lb', ‘tcp-server-be' ) 

} 

probe: { 

   	id: resourceId(‘ Microsoft.Network/loadBalancers/probes’, ‘tcp-server-lb', ‘tcp-server-hc' ) 

     } 

    } 

 } 

] </pre>



<p>Jedyna zmiana w konfiguracji Container Instances dotyczy ustawień adresu IP, który teraz jest prywatny i przydzielony z podsieci.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ipAddress: {  

type: ‘Private’  

ports: [ 

   { 

port: port  

protocol : ‘TCP’ 

        } 

     ] 

} 

subnetIds:[ 

          {  

id: subnetId 

} 

]     </pre>



<p>Taka konfiguracja dalej wymaga pilnowania adresu IP po restarcie kontenera i upewniania się, że jest taki sam jak ustawiony na load balancerze, ale staje się to problemem wewnętrznym.</p>


<div class="wp-block-image size-full">
<figure class="aligncenter"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.02.08_graphic_6.png" alt=" class=" class="wp-image-69581" title="Jak postawić serwer TCP (Transmission Control Protocol) na platformie Azure – krok po kroku 18"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image size-full">
<figure class="aligncenter"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.02.08_graphic_7.png" alt=" class=" class="wp-image-69583" title="Jak postawić serwer TCP (Transmission Control Protocol) na platformie Azure – krok po kroku 19"></figure></div>


<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading" id="Container-Apps-z-TCP-jako-kolejny-etap-ewolucji">Container Apps z TCP jako kolejny etap ewolucji</h2>



<p>Pod koniec 2022 roku Azure dał możliwość <a href="https://learn.microsoft.com/en-us/azure/container-apps/ingress?tabs=bash#tcp" data-type="URL" data-id="https://learn.microsoft.com/en-us/azure/container-apps/ingress?tabs=bash#tcp" target="_blank" rel="noreferrer noopener">skonfigurowania Container Apps </a>dla komunikacji po TCP w wersji zapoznawczej.</p>



<p>Ponieważ Azure Container Apps ułatwia skalowanie oraz pozwala zautomatyzować podnoszenie wersji aplikacji po pojawieniu się nowego obrazu w rejestrze, postanowiłem się temu przyjrzeć.</p>



<p>Zgodnie z dokumentacją należy umieścić środowisko zarządzane wewnątrz podsieci. Istotne jest skonfigurowanie poprawnego zakresu CIDR – minimum /23.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">resource virtualNetwork ‘Microsoft.Network/virtualNetworks@2055-05-01' existing = { 

name: ‘shared-vnet’ 

     } 

     resource subnet ‘Microsoft.Network/virtualNetworks/subnets@2022-05-01 = { 

         name: ‘tcp-server-ca-sub' 

         parent: virtualNetwork 

         properties: {  

          addressPrefix: ‘10.1.0.0/23’ 

           } 

      } 

output subnetId string = subnet.id  </pre>



<p>Container Apps wymagają zdefiniowanego środowiska zarządzanego. Jak już wspomniałem, należy je umieścić wewnątrz podsieci, pamiętając o ustawieniu właściwości „<strong>internal</strong>” na false, aby aplikacja była dostępna z zewnątrz.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">vnetConfiguration: { 

infrastructureSubnetId: subnetId 

internal: false 

} </pre>



<p>Sama konfiguracja Container Apps wymaga zdefiniowania:</p>



<p>1. Szablonu dla rewizji, którą chcemy uruchomić.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">template: {  

containers: [  

{ 

          env: [ 

          { 

          name: ‘TcpServer_Port’ 

value: ‘${port}’ 

      } 

    ] 

    image: ‘${containerRegistryName}/tcp-server:latest’ 

    name: ‘tcp-server’ 

    probes: [ 

     { 

     periodseconds: 10 

     successThreshold: 1  

          tcpSocket: { 

         port: port 

     } 

     type: ‘Liveness’ 

    } 

] 

resources: { 

cpu: json(‘0.25’) 

memory: ‘0.5Gi’ 

} 
} 

] 

revisionSuffix: guid(‘tcp-server') 

}   </pre>



<p>        Dodałem, oczywiście, próbkowanie żywotności kontenera.</p>



<p>2. Punktu wejścia dla komunikacji zewnętrznej.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ingress: { 

allowInsecure: false 

     exposedPort: port 

     external: true 

     targetPort: port 

     transport: ‘tcp’ 

} </pre>



<p>3. Dostępu do Azure Container Registry, na którym znajduje się obraz aplikacji.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">registries: [  

   {  

server: ascoding.azurecr.io’ 

username: registryUsername 

passwordSecretRef:  registryPasswordSecretId 

   } 

] 

secrets: [  

   { 

name: registryPasswordSecretId 

value: registryPassword 

  } 

]  </pre>



<p>Przydatnym dodatkiem jest możliwość przechowywania informacji wrażliwych wewnątrz zasobu, <strong>bez konieczności podłączania zewnętrznego Key Vaulta.</strong></p>



<p>Po zakończonym wdrożeniu okazało się, że rozwiązanie Azure jest bardzo podobne do mojego.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/11/blog_2023.02.08_graphic_8.png" alt="blog 2023.02.08 graphic 8" title="Jak postawić serwer TCP (Transmission Control Protocol) na platformie Azure – krok po kroku 20"></figure></div>


<p>I również działa.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/11/blog_2023.02.08_graphic_9.png" alt="blog 2023.02.08 graphic 9" title="Jak postawić serwer TCP (Transmission Control Protocol) na platformie Azure – krok po kroku 21"></figure></div>


<h2 class="wp-block-heading" id="Podsumowanie">Podsumowanie</h2>



<p>Azure Container Instances pozwala na <strong>szybkie uruchamianie skonteneryzowanych aplikacji,</strong> które umożliwia zewnętrzną komunikację po TCP. Niestety, nie jest to rozwiązanie pozbawione wad (przypomnijmy: zmieniające się IP, brak skalowania), które utrudniają skonfigurowanie środowiska i w przypadku prostych aplikacji mogą być powodem do jego odrzucenia.&nbsp;</p>



<p>Na szczęście Azure wyszedł naprzeciw potrzebom użytkowników z nową usługą, jaką jest <strong>Container Apps, </strong>która jest relatywnie <strong>prosta do skonfigurowania i pozbawiona problemów, </strong>na jakie trafimy korzystając z Container Instances. Warto mieć to rozwiązanie na uwadze i śledzić nowe możliwości, jakie zespół developerów chmury Microsoft Azure będzie do niego dodawał.&nbsp;&nbsp;</p>



<p><strong>Przeczytaj także:</strong> <a href="https://nearshore-it.eu/pl/artykuly/big-data-azure/">Big Data w chmurze Azure</a></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://nearshore-it.eu/pl/artykuly/jak-postawic-serwer-tcp-na-azure/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<media:content url="https://www.youtube.com/embed/fDSI_-OCCU8" medium="video" width="1280" height="720">
			<media:player url="https://www.youtube.com/embed/fDSI_-OCCU8" />
			<media:title type="plain">BiteIT #58: Let`s secure your App Service on Azure | Marcin Niesyn</media:title>
			<media:description type="html"><![CDATA[Let`s secure your App Service on AzurePodczas webinaru Marcin poruszy tematy zabezpieczenia aplikacji webowej na platformie Azure przed typowymi atakami zdef...]]></media:description>
			<media:thumbnail url="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.02.08_cover.jpg" />
			<media:rating scheme="urn:simple">nonadult</media:rating>
		</media:content>
	</item>
		<item>
		<title>DevOps Azure – jak zacząć karierę?</title>
		<link>https://nearshore-it.eu/pl/artykuly/azure-devops/</link>
					<comments>https://nearshore-it.eu/pl/artykuly/azure-devops/#respond</comments>
		
		<dc:creator><![CDATA[Kamil Niewęgłowski]]></dc:creator>
		<pubDate>Wed, 28 Dec 2022 10:30:13 +0000</pubDate>
				<category><![CDATA[Artykuły]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Cloud engineering]]></category>
		<category><![CDATA[DevOps]]></category>
		<guid isPermaLink="false">https://nearshore-it.eu/artykuly/azure-devops/</guid>

					<description><![CDATA[Rola DevOpsa jest jedną z bardziej złożonych i trudniejszych do sprecyzowania w branży IT. Nie chodzi tutaj o technologie, ale o samo określenie zakresu obowiązków – w każdej firmie można znaleźć jakieś różnice w tym obszarze. Przyznam, że początkowo sam miałem problem z określeniem, kim lub czym tak właściwie jest DevOps. Po kilku latach pracy na tym stanowisku mogę z pewnością stwierdzić, że DevOps to nie stanowisko – to kultura pracy, zbiór praktyk, narzędzi i procesów, które są od siebie zależne, a efektem ich stosowania jest dostarczanie skalowalnego, zautomatyzowanego rozwiązania. Czy można się zatem tego nauczyć tak, jak programowania w danym języku? Jak przejść od roli programisty do roli DevOpsa i z jakich źródeł czerpać wiedzę? Postaram się na to pytanie odpowiedzieć na przykładzie chmury Azure, z którą na co dzień pracuję. Zaczynajmy!]]></description>
										<content:encoded><![CDATA[
<div class="table-of-contents">
    <p class="title">Spis treści</p>
    <ol>
                    <li><a href="#Od-programisty-do-DevOpsa">1.  Od programisty do DevOpsa </a></li>
                    <li><a href="#Błądzenie-w-chmurze-–-czyli-od-czego-zacząć?">2.  Błądzenie w chmurze – czyli od czego zacząć? </a></li>
                    <li><a href="#Narzędzia-DevOps">3.  Narzędzia DevOps </a></li>
                    <li><a href="#Zasoby-–-platforma-Microsoft-Learn">4.  Zasoby – platforma Microsoft Learn </a></li>
                    <li><a href="#A-jak-poznać-proces-DevOps?">5.  A jak poznać proces DevOps? </a></li>
                    <li><a href="#CI/CD-(Continuous-Integration-/-Continuous-Delivery)">6.  CI/CD (Continuous Integration / Continuous Delivery) </a></li>
                    <li><a href="#IaaC-(Infrastructure-as-a-Code)">7.  IaaC (Infrastructure-as-a-Code) </a></li>
                    <li><a href="#Podsumowanie">8.  Podsumowanie </a></li>
            </ol>
</div>


<h2 class="wp-block-heading" id="Od-programisty-do-DevOpsa">Od programisty do DevOpsa</h2>



<p>W przypadku programowania wybierasz język, który wydaje się najbardziej interesujący i dostosowany do tego, co chcesz robić, albo… prosty w nauce. Kiedy poznasz podstawy składni, jedyne, co cię ogranicza, to twoja własna wyobraźnia. Na początku zastanawiasz się: „Co by tu napisać?”. Może kalkulator, może kółko i krzyżyk albo coś bardziej zaawansowanego z obsługą bazy danych lub zewnętrznych bibliotek?</p>



<p>Im więcej zrealizowanych projektów, tym więcej napotkanych wyzwań, a twoje umiejętności rosną z każdą kolejną linią kodu. Czujesz się biegle w składni, korzystasz już z zewnętrznych bibliotek, a na rozmowach o pracę możesz pochwalić się owocem swojej dotychczasowej nauki w postaci działających programów. Na kolejnym etapie zaczynasz obracać się w bardziej zaawansowanych projektach, które wymagają zastosowania i znajomości różnych podejść. Pojawiają się procesy, większy nacisk kładziony jest na jakość kodu, jego elastyczność, a z tym wiąże się nauka wzorców.</p>





<h2 class="wp-block-heading" id="Błądzenie-w-chmurze-–-czyli-od-czego-zacząć?">Błądzenie w chmurze – czyli od czego zacząć?</h2>



<p>A jak to wygląda w przypadku chmury? Zarówno przy programowaniu, jak i tutaj możemy wyróżnić dwa główne etapy nauki. Pierwszym z nich jest<strong> nauka narzędzia </strong>(Azure), a drugim – <strong>wzorców i procesów</strong>. Jest to oczywiście uproszczenie, bo zarówno narzędzia, jak i wzorce można jeszcze precyzyjniej skategoryzować, ale wszystko to zależy od poszczególnych projektów i ich wymagań.</p>



<h2 class="wp-block-heading" id="Narzędzia-DevOps">Usługa Azure DevOps &#8211; narzędzia</h2>



<p>Zaczęliśmy od narzędzi i tutaj wybór może paść na dowolną chmurę: Microsoft Azure, AWS, GCP – to najwięksi obecnie dostawcy na rynku. To, którą chmurę wybierzesz, nie ma wielkiego znaczenia, gdyż oferują one podobne usługi i w większości przypadków rozwiązanie jednej firmy ma swój odpowiednik w rozwiązaniu oferowanym przez inną. </p>



<h2 class="wp-block-heading">Od czego rozpocząć? Czyli &#8222;pakiet startowy&#8221; Azure DevOps</h2>



<p>To, od czego możesz zacząć i co pozwoli ci rozwinąć skrzydła, to poznanie samej chmury i tego, co oferuje. Przykładami takich zasobów, które warto poznać w ramach Azure, mogą być np.:</p>


<div class="special-content-box style-1">
    <div class="box">
                <div class="content">
                                </div>
    </div>
</div>



<p>Nie bez powodu podałem akurat te. Chciałem w ten sposób pokazać, że zasoby, poza realizowanymi przez nie odpowiedzialnościami, są również w pewien sposób od siebie zależne i ze sobą powiązane.</p>



<p>Na powyższym przykładzie możemy to zobrazować tak, że Virtual Machine należy do podsieci zdefiniowanej w Virtual Network, a dostęp do niej zdefiniowany jest poprzez skonfigurowany Network Security Group.</p>





<h2 class="wp-block-heading" id="Zasoby-–-platforma-Microsoft-Learn">Zasoby Azure DevOps – usługa Microsoft Learn&nbsp;</h2>



<p>Kiedy poznasz poszczególne zasoby oferowane przez chmurę, będziesz już mieć świadomość tego, w jakich przypadkach możesz je wykorzystać i jak się ze sobą komunikują. A z pomocą w nauce przyjdzie ci platforma <a href="https://learn.microsoft.com/en-us/" data-type="URL" data-id="https://learn.microsoft.com/en-us/" target="_blank" rel="noreferrer noopener">Microsoft Learn</a>. Ma ona trzy ważne zalety, o których chciałbym wspomnieć.</p>



<h5 class="wp-block-heading">1. Wybór ścieżki&nbsp;</h5>



<p>Po pierwsze, pozwala na wybór ścieżki, w której chcesz się kształcić. Może to być jedna z wielu, np.: </p>


<div class="special-content-box style-1">
    <div class="box">
                <div class="content">
                                </div>
    </div>
</div>



<div style="height:34px" aria-hidden="true" class="wp-block-spacer"></div>



<p>W zależności od tego, którą ścieżkę obierzesz, będziesz mieć dostęp do modułów, które zapoznają cię z poszczególnymi zagadnieniami potrzebnymi w pracy na danym stanowisku. Zaletą takiego rozwiązania jest to, że nie musisz się zastanawiać, na czym spośród wielu możliwości się skupić, i możesz od razu zająć się zagadnieniami, które są ze sobą powiązane. Poznasz w ten sposób również charakter pracy w danej roli, dowiesz, czy jest to praca bardziej administracyjna, koncepcyjna lub developerska.</p>





<div style="height:34px" aria-hidden="true" class="wp-block-spacer"></div>



<h5 class="wp-block-heading"><strong>   2. Certyfikacja&nbsp;</strong></h5>



<p>Po drugie – certyfikacja. Microsoft w zakresie wszystkich swoich rozwiązań oferuje ścieżkę certyfikacji. Nie jest ona darmowa, nie jest też prosta, a w wielu przypadkach wręcz można na niej pobłądzić. Jest to jednak<strong> najbardziej rozpoznawalne i uznawane potwierdzenie umiejętności na rynku pracy w zakresie technologii oferowanych przez Microsoft.</strong></p>



<p>Jeżeli zależy ci na udokumentowaniu swojej wiedzy i umiejętności, możesz skorzystać z modułów, które przygotują cię do wybranego przez siebie certyfikatu, co na pewno ułatwi szukanie pracodawcy. Warto jest się dobrze zapoznać z dostępnymi ścieżkami certyfikacji i dowiedzieć, jaka wiedza jest sprawdzana na poszczególnych egzaminach. Na każdą ze ścieżek składa się kilka egzaminów o różnym zakresie i podziale tematycznym. W przypadku typowego DevOpsa w chmurze<strong> Azure (DevOps Engineer)</strong> polecam skupić się na<a href="https://learn.microsoft.com/en-us/certifications/azure-fundamentals/" target="_blank" data-type="URL" data-id="https://learn.microsoft.com/en-us/certifications/azure-fundamentals/" rel="noreferrer noopener"> AZ-900 Microsoft Azure Fundamentals</a>. Certyfikat ten zapozna cię z koncepcją chmury oraz dostępnymi zasobami w Azure na podstawowym poziomie. Dalej możesz już obrać jedną z bardziej zaawansowanych ścieżek w zależności od tego, co cię interesuje. Wszystkie certyfikaty wraz z opisami dostępne są <a href="https://learn.microsoft.com/en-us/certifications/browse/?products=azure" target="_blank" data-type="URL" data-id="https://learn.microsoft.com/en-us/certifications/browse/?products=azure" rel="noreferrer noopener">na oficjalnej stronie Microsoftu.</a></p>



<h5 class="wp-block-heading"><strong>   3.  Ćwiczenie umiejętności&nbsp;&nbsp;</strong></h5>



<p>Trzecią zaletą tej platformy jest jej funkcjonalność. Wszystkie moduły są pogrupowane w poszczególne kategorie ze względu na technologię lub certyfikację, którą wybierzesz. Dodatkowo twoja aktywność jest na bieżąco śledzona i zapisywana, dzięki czemu wiesz, które materiały już przerobiłeś. Bardzo często na końcu każdego modułu lub ważnego zagadnienia umieszczane są linki do dodatkowych zasobów, które pozwolą ci pogłębić wiedzę odnośnie opisywanych zagadnień. Nie są one wymagane, ale na pewno pozwalają zdobyć bardziej szczegółowe pojęcie o zasobach i poznać możliwości, jakie oferują.</p>



<p>Oprócz lekcji w formie tekstowej pojawiają się również laboratoria. Są one zintegrowane ze stroną i można w prosty sposób poćwiczyć tworzenie i konfigurowanie zasobów tak, jak byśmy to robili w codziennej pracy.</p>



<h2 class="wp-block-heading" id="A-jak-poznać-proces-DevOps?">A jak poznać proces DevOps?</h2>



<p>Chmurę, na przykładzie Azure, można zatem poznać w dość przystępnej formie, którą opisałem powyżej. Inaczej sytuacja wygląda natomiast z samym procesem DevOps. Niestety w tym przypadku, chyba w każdej firmie trafimy na odstępstwa od modelowych procesów i trudno szukać miejsca, gdzie wszystko byłoby idealne. Warto jest zatem mieć ogólne pojęcie o tym, jak powinny przebiegać poszczególne procesy, jakie dają nam realne korzyści oraz kiedy powinniśmy je stosować.</p>



<p>Reszta zależy już od wielu składowych, takich jak: <strong>specyfika projektu, oczekiwania klienta, budżet, zaangażowanie i wiedza zespołów ze sobą współpracujących, a nawet narzędzia, których używają.</strong></p>



<h2 class="wp-block-heading">Jak wdrażać projekty? Pomocne wzorce</h2>



<p>Z pomocą przyjdą nam wzorce, czyli podobnie jak w programowaniu, szablony, które stosujemy i które w czysty, zorganizowany sposób pozwalają nam budować strukturę projektu, który będzie elastyczny i reużywalny. O jakich zatem wzorcach / praktykach mowa?</p>



<ol class="wp-block-list">
<li><strong>CI/CD</strong></li>



<li><strong>IaaC</strong></li>
</ol>



<p>Wymieniłem właśnie te, ponieważ<strong> uważam je za najważniejsze i podstawowe </strong>– bez nich żadna infrastruktura nie powinna funkcjonować. Jest ich oczywiście znacznie więcej, np.: SecOps, monitoring, konteneryzacja, orkiestracja, ale moim zdaniem są to bardziej złożone procesy wynikające z przyjętej technologii oraz specyfiki projektu. Przyjrzyjmy się zatem nieco bliżej dwóm wybranym przeze mnie wzorcom.]</p>



<h2 class="wp-block-heading" id="CI/CD-(Continuous-Integration-/-Continuous-Delivery)">CI/CD (Continuous Integration / Continuous Delivery)</h2>



<p><strong>CI/CD (Continuous Integration / Continuous Delivery)</strong> – to szablon przepływu procesów w projekcie od momentu zaplanowania, przez wdrożenie, ciągłe utrzymywanie i monitorowanie. CI/CD to esencja kultury DevOps i warto go poznać, aby zrozumieć, jakie niesie ze sobą korzyści. Do jego składowych należą procesy:</p>



<ul class="wp-block-list">
<li>Plan</li>



<li>Code</li>



<li>Build</li>



<li>Test</li>



<li>Release</li>



<li>Deploy</li>



<li>Operate</li>



<li>Monitor</li>
</ul>



<p>Na każdy z nich można poświęcić jeden artykuł, dlatego zachęcam do skupienia się na tym wzorcu, który niewątpliwie stanowić będzie solidny fundament w rozwoju jako DevOps.</p>



<div style="height:34px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image size-full">
<figure class="aligncenter"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/jpro_2022.12.28_graphic_2.png" alt=" class=" class="wp-image-69148" title="DevOps Azure – jak zacząć karierę? 22"></figure></div>


<div style="height:34px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading" id="IaaC-(Infrastructure-as-a-Code)">IaaC (Infrastructure-as-a-Code)</h2>



<p><strong>IaaC (Infrastructure-as-a-Code)</strong> – czyli infrastruktura jako kod, jest to wzorzec, dzięki któremu jesteśmy w stanie budować skalowalną infrastrukturę w sposób zautomatyzowany. Istnieje wiele podejść do tego tematu. Dostawcy zasobów chmurowych oferują swoje rozwiązania, ale istnieją również na rynku narzędzia firm zewnętrznych. Możemy wyróżnić tutaj podejście deklaratywne, jak i imperatywne – oba są mniej lub bardziej świadomie stosowane. Warto zatem zapoznać się z różnicami między nimi (poruszę ten temat w kolejnym artykule) oraz z dostępnymi na rynku narzędziami do tworzenia IaaC, takimi jak:</p>



<div style="height:34px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile" style="grid-template-columns:auto 84%"><div class="wp-block-media-text__content">
<ul class="wp-block-list">
<li>Bicep</li>



<li>Terraform</li>



<li>Ansible</li>



<li>Pulumi</li>



<li>Chef</li>
</ul>
</div><figure class="wp-block-media-text__media"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/jpro_2022.12.28_graphic_1.png" alt="devops" class="wp-image-69146 size-full" title="DevOps Azure – jak zacząć karierę? 23"></figure></div>



<div style="height:34px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>W przypadku platformy Azure, <a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep" target="_blank" data-type="URL" data-id="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep" rel="noreferrer noopener">Bicep </a>jest dedykowanym językiem do pisania deklaratywnego kodu infrastruktury. Nie zastosujemy go w przypadku innych chmur (np. AWS czy GCP). Jeżeli zależy ci zatem na narzędziu opisującym infrastrukturę deklaratywnie i ze wsparciem dla pozostałych rozwiązań chmurowych, to polecam <a href="https://www.terraform.io/" target="_blank" data-type="URL" data-id="https://www.terraform.io/" rel="noreferrer noopener">Terraform</a>.</p>



<h2 class="wp-block-heading" id="Podsumowanie">Metodyki DevOps &#8211; podsumowanie</h2>



<p>W dobie zwinnego rozwoju oprogramowania i coraz szybszej transformacji cyfrowej już nikt nie kwestionuje potrzeby posiadania w zespole specjalisty, który może nie tylko budować aplikacje w chmurze, ale też je wdrażać. <strong>Warto zainteresować się kulturą DevOps – dla wielu programistów jest to naturalna droga rozwoju.</strong></p>



<p>Mam nadzieję, że po lekturze tego artykułu łatwiej będzie ci zrobić pierwszy krok w stronę rozwoju jako Azure DevOps. Jak widać powyżej, rola ta jest złożona i wymaga cierpliwości, ale jak to w życiu bywa, na wszystko potrzeba czasu. Powodzenia!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nearshore-it.eu/pl/artykuly/azure-devops/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mikroserwisy – czy to jeszcze rewolucja i nowa jakość czy już standard w projektach?</title>
		<link>https://nearshore-it.eu/pl/artykuly/mikroserwisy-nowa-jakosc-w-miedzynarodowych-projektach-it/</link>
					<comments>https://nearshore-it.eu/pl/artykuly/mikroserwisy-nowa-jakosc-w-miedzynarodowych-projektach-it/#respond</comments>
		
		<dc:creator><![CDATA[Dawid Wieczorek]]></dc:creator>
		<pubDate>Wed, 10 Nov 2021 07:11:19 +0000</pubDate>
				<category><![CDATA[Artykuły]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Application development]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Trendy]]></category>
		<guid isPermaLink="false">https://nearshore-it.eu/artykuly/mikroserwisy-nowa-jakosc-w-miedzynarodowych-projektach-it/</guid>

					<description><![CDATA[Mikroserwisy są odpowiedzią na problemy związane z tworzeniem i utrzymaniem monolitycznych systemów. W czasie, gdy aplikacje muszą być stale rozwijane, a jednocześnie dostępne dla użytkowników, mikrousługi stają się state-of-the-art w rozwoju oprogramowania. W jakich projektach się sprawdzą, a w których rozsądniej jest pozostać przy konstrukcji monolitu?]]></description>
										<content:encoded><![CDATA[
<div class="table-of-contents">
    <p class="title">Idź do:</p>
    <ol>
                    <li><a href="#Mikroserwisy-ich-popularnosc-rosnie">1.  Mikroserwisy – ich popularność rośnie</a></li>
                    <li><a href="#Jak-architektura-mikroserwisow-odpowiada-dzis-na-potrzeby-rozwoju-systemow">2.  Jak architektura mikroserwisów odpowiada dziś na potrzeby rozwoju systemów?</a></li>
                    <li><a href="#Bolaczki-monolitycznej-aplikacji">3.  Bolączki monolitycznej aplikacji</a></li>
                    <li><a href="#Zalety-wykorzystania-architektury-mikroserwisow">4.  Zalety wykorzystania architektury mikroserwisów</a></li>
                    <li><a href="#Wady-mikroserwisow">5.  Wady mikroserwisów</a></li>
                    <li><a href="#Mikrouslugi-a-podejscie-DDD">6.  Mikrousługi a podejście DDD</a></li>
                    <li><a href="#Mikroserwisy-w-praktyce-case-study">7.  Mikroserwisy w praktyce – case study</a></li>
                    <li><a href="#Podsumowujac-czy-architektura-mikroserwisowa-sprawdzi-sie-w-moim-projekcie">8.  Podsumowując: czy architektura mikroserwisowa sprawdzi się w moim projekcie?</a></li>
            </ol>
</div>


<h2 class="wp-block-heading" id="Mikroserwisy-ich-popularnosc-rosnie">Mikroserwisy – ich popularność rośnie</h2>



<p>Pojęcie architektury mikroserwisowej pojawiło się po raz pierwszy na scenie IT w okolicach roku 2013. Od tego czasu jej popularność wydaje się poruszać tylko w jednym kierunku – w górę! Potwierdzenie takiej hipotezy możemy znaleźć na przykład w raporcie <a href="https://www.oreilly.com/radar/microservices-adoption-in-2020" target="_blank" rel="noopener">„Microservices adoption”</a> przygotowanym przez firmę O’Reilly w roku 2020, z którego wynika, że 77% firm, w których pracują respondenci, stosują taką architekturę. Jednocześnie aż <strong>92% pytanych określiło zastosowanie mikroserwisów jako sukces</strong>&nbsp; z perspektywy oczekiwanych zysków, które przynosi takie podejście.</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/JPro_2021.11.10_graphic_1.png" alt="architektura mikroserwisów" class="wp-image-36081" title="Mikroserwisy – czy to jeszcze rewolucja i nowa jakość czy już standard w projektach? 24"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>W innej ankiecie przeprowadzonej przez<a href="https://www.ibm.com/account/reg/us-en/signup?formid=urx-49970" target="_blank" rel="noopener"> IBM Market Development &amp; Insights</a> o opinię zapytanych zostało ponad 1200 osób z branży IT, w tym dyrektorzy techniczni, menedżerowie i programiści pracujący w firmach, które stosują lub planują zastosować architekturę mikroserwisową.</p>



<p>Wyniki są jednoznaczne:</p>



<ul class="wp-block-list">
<li><strong>87%</strong> użytkowników zgadza się, że wysiłek oraz koszty poniesione na wdrożenie architektury mikroserwisowej opłacały się.</li>



<li><strong>84%</strong> użytkowników zgadza się, że stosowanie mikroserwisów ułatwia pracę obecnym pracownikom oraz pozwala na przyciągnięcie nowych.</li>



<li><strong>77%</strong> użytkowników zgadza się, że mikroserwisy są sprawdzonym i niezawodnym modelem tworzenia aplikacji.</li>
</ul>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/JPro_2021.11.10_graphic_2.png" alt="architektura mikroserwisów" class="wp-image-36082" title="Mikroserwisy – czy to jeszcze rewolucja i nowa jakość czy już standard w projektach? 25"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Chociaż jest to oczywiście bardzo wątpliwa miara, z własnej perspektywy programisty – sądząc po opisach projektów w ofertach pracy – mógłbym stwierdzić, że praktycznie większość projektów jest aktualnie tworzona w architekturze mikroserwisowej. Pomimo że na takie opisy musimy spojrzeć z przymrużeniem oka, widać, że <strong>mikroserwisy szybko stają się standardem w świecie IT.</strong></p>



<h2 class="wp-block-heading" id="Jak-architektura-mikroserwisow-odpowiada-dzis-na-potrzeby-rozwoju-systemow">Jak architektura mikroserwisów odpowiada dziś na potrzeby rozwoju systemów?</h2>



<p>Jednym z największych wyzwań architektury mikroserwisowej jest silna zależność od infrastruktury (serwerowej, sieciowej itp.), a co za tym idzie – zwiększona potrzeba inwestycji w jej tworzenie. Jeszcze kilka lat temu było to jednak dużo większym wyzwaniem niż dzisiaj. W odpowiedzi na potrzeby nowego modelu powstał szeroki wachlarz narzędzi, które usprawniają pracę w rozproszonym środowisku.</p>



<ul class="wp-block-list">
<li><strong>Kontenery</strong> – na potrzeby <a href="https://nearshore-it.eu/pl/artykuly/azure-serverless-workflow-orchestration">orkiestracji</a> serwisami powstały rozwiązania do zarządzania, automatyzacji i skalowania aplikacji kontenerowych. Dzisiaj możemy wybierać spośród wielu narzędzi, od prostych i niewymagających, jak <strong>Docker Swarm,</strong> po zakrojone na największą skalę rozwiązania enterprise, jak chyba najpopularniejszy <strong>Kubernetes</strong> lub <strong>Openshift. </strong>Dodatkowo dostępne są rozwiązania chmurowe, jak <strong>AWS Fargate</strong> czy <strong>Google Cloud Run</strong>. Każda z platform chmurowych oferuje również zarządzane przez siebie serwisy Kubernetes, jak <strong>AWS EKS</strong> lub <strong>Google GKE.</strong> Wszystkie wymienione narzędzia w znacznym stopniu zmniejszają dzisiaj próg wejścia do projektów opartych na mikroserwisach pod względem infrastruktury serwerowej. Należy jednak liczyć się z kosztami ich utrzymywania.</li>



<li><strong>Service Mesh</strong> – w odpowiedzi na wyzwania związane z silną zależnością od infrastruktury sieciowej powstało wiele rozwiązań, z których najpopularniejszy jest obecnie <a href="https://nearshore-it.eu/pl/artykuly/service-mesh-ale-komu-to-potrzebne">model Service Mesh.</a> Tutaj znowu mamy wybór pomiędzy lekkimi rozwiązaniami jak <strong>Linkerd, Kuma czy Maesh</strong> a bardziej wymagającymi, jak <a href="https://nearshore-it.eu/pl/artykuly/mikroserwisy-service-mesh-z-istio"><strong>Istio</strong></a><strong>,</strong> oraz rozwiązaniami chmurowymi, jak <strong>AWS App Mesh.</strong> Jak widać, stworzenie infrastruktury sieciowej dla swojej aplikacji mikroserwisowej nie stanowi dzisiaj tak dużego wyzwania jak kiedyś, chociaż sama zależność od sieci jest i zawsze pozostanie wyzwaniem.</li>



<li><strong>Narzędzia do monitorowania</strong> – cytując głównego inżyniera firmy Lyft, Matta Kleina, który brał udział w przejściu firmy z monolitu na mikroserwisy:</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Inną istotną zmianą, która pojawia się wraz z rozwojem mikroserwisów, jest obecność sieci jako niestabilnego elementu, którego nie da się uniknąć. Każdy programista musi w końcu poradzić sobie z problemami sieciowymi, zarówno jeśli chodzi o transport, jak i o znacznie bardziej złożone narzędzia wymagane do debugowania.</em></p>
</blockquote>



<p>Wspomniane wyżej narzędzia wspierające pracę i debugowanie aplikacji kontenerowej również przeżyły rozkwit i dzisiaj możemy wspierać się narzędziami do monitorowania, logowania i tracingu. Rozwiązania takie jak <strong>Prometheus, ELK</strong> czy <strong>AWS CloudWatch</strong> pozwalają sprostać wyzwaniom utrzymywania lub debugowania aplikacji w rozproszonym środowisku.</p>



<h2 class="wp-block-heading" id="Bolaczki-monolitycznej-aplikacji">Bolączki monolitycznej aplikacji</h2>



<p>Powstanie i ostateczny sukces mikroserwisów nie wziął się oczywiście z niczego. Jest to raczej odpowiedź na trudności związane z klasycznym podejściem, które w wielu przypadkach przeważają nad plusami podejścia monolitycznego.</p>



<h3 class="wp-block-heading">Z perspektywy biznesu i użytkowników</h3>



<p>Z perspektywy biznesowej możemy wymienić wiele wad, które mogą wpłynąć na doświadczenia użytkowników i tym samym – na ostateczny sukces aplikacji:</p>



<ul class="wp-block-list">
<li>Wprowadzanie nawet najmniejszej zmiany wymaga reinstalacji całej aplikacji, co prowadzi do tymczasowej niedostępności aplikacji, która w nowoczesnym świecie jest praktycznie niedopuszczalna dla komercyjnych rozwiązań.</li>



<li>Poszczególne komponenty systemu są ze sobą ściśle powiązane, co oznacza, że nawet mała zmiana w kodzie może negatywnie wpłynąć na całą aplikację, a tym samym być odczuwalna dla 100% jej użytkowników.</li>



<li>Trudności nastręcza skalowanie aplikacji w odpowiedzi na zmienny ruch. Niemożliwe jest też oczywiście skalowanie poszczególnych komponentów systemu, a tylko całej aplikacji. W momencie przeciążenia aplikacja może stać się niedostępna dla części użytkowników.</li>



<li>Brak skalowalności może się przekładać na wyższe koszty utrzymania aplikacji.</li>



<li>Spowolnienie prędkości rozwoju i udostępniania nowej funkcjonalności.</li>



<li>Zdecydowanie zmniejszona możliwość zastosowania nowych technologii, których wprowadzenie byłoby zbyt kosztowne i wymagałoby poświęcenia więcej czasu przez programistów (czy nawet zatrudnienia nowych).</li>
</ul>



<h3 class="wp-block-heading">Z perspektywy developera</h3>



<p>Patrząc z perspektywy developera pracującego nad monolitem, możemy dodatkowo wymienić jeszcze kilka wad:</p>



<ul class="wp-block-list">
<li>Spora baza kodu jest trudna w zrozumieniu, co od nowego programisty wymaga dużo czasu na poznanie i wdrożenie. Spowalnia ona również codzienny cykl wprowadzania zmian i ich testowania (pamiętajmy, że każda, nawet drobna zmiana, może mieć wpływ na całą aplikację).</li>



<li>Rozmyta odpowiedzialność oraz brak poczucia własności kodu może wpływać demotywująco na programistę. W przeciwieństwie do całkowitej własności części systemu, którego czujemy się autorem w przypadku tworzenia i utrzymywania konkretnych mikrousług.</li>



<li>Trudność we wdrożeniu nowych, interesujących technologii, ponieważ każda taka inicjatywa oznacza wprowadzenie zmian w całej bazie kodu aplikacji.</li>



<li>Mniejsze możliwości rozwoju osobistego – w dynamicznie zmieniającym się świecie IT rozważne jest, aby developer ciągle się rozwijał i zawsze dysponował aktualną wiedzą. Praca nad aplikacją monolityczną może nie być najlepszym krokiem, gdyż nie ma się styczności z szeroką wiedzą wymaganą w świecie mikroserwisów.</li>
</ul>



<h2 class="wp-block-heading" id="Zalety-wykorzystania-architektury-mikroserwisow">Zalety wykorzystania architektury mikroserwisów</h2>



<p>Przejdźmy teraz do możliwości i udogodnień dostępnych przy wykorzystaniu mikroserwisów.</p>



<h3 class="wp-block-heading">Z perspektywy biznesu i użytkowników</h3>



<ul class="wp-block-list">
<li>Łatwa redundancja elementów (czyli duplikowanie poszczególnych komponentów celem zapewnienia ciągłości pracy w razie awarii) i ich skalowanie, zgodnie z aktualnym zapotrzebowaniem, a tym samym większa dostępność systemu. Maleje tym samym ryzyko, że użytkownik nie będzie mógł skorzystać z naszej aplikacji.</li>



<li>Luźne powiązanie poszczególnych serwisów pozwala na niezależny rozwój funkcjonalności i szybsze ich wdrożenie.</li>



<li>Wdrożenia mogą następować niezależnie od siebie i praktycznie nie wpływają na dostępność całości systemu dla użytkowników.</li>



<li>Mikroserwisy są idealnie dostosowane do wykorzystania <a href="https://bulldogjob.pl/articles/1047-serverless-czym-jest-i-jak-dziala" target="_blank" rel="noopener">architektury typu serverless</a>, która w odpowiednich zastosowaniach pozwoli zaoszczędzić na kosztach infrastruktury.</li>



<li>Łatwiejsze testowanie małych komponentów pozwala na uniknięcie wystąpienia uciążliwych dla użytkowników bugów.</li>



<li>Wdrożenie nowych technologii, z korzyścią dla użytkownika, jest zdecydowanie łatwiejsze i może odbywać się na poziomie poszczególnych serwisów.</li>
</ul>



<h3 class="wp-block-heading">Z perspektywy developerów</h3>



<p>Z zastosowaniem mikroserwisów łączy się też kilka pozytywów dla pracujących z nimi developerów:</p>



<ul class="wp-block-list">
<li>Pojedyncze usługi są łatwiejsze w zrozumieniu, ich baza kodu jest też odpowiednio mniejsza. Ułatwia to pracę nad nowymi funkcjonalnościami i ich <a href="https://nearshore-it.eu/pl/artykuly/quality-assurance-czyli-jak-zagwarantowac-jakosc-i-bezpieczenstwo-w-projektach-it">testowaniem</a>, ale również usprawnia wdrożenie nowej osoby w projekt.</li>



<li>Każdy z twórców danej usługi czuje się za nią odpowiedzialny i dobrze zna domenę biznesową powierzonej mu części.</li>



<li>Możliwość eksperymentowania i poszerzania wiedzy o nowych technologiach przy tworzeniu nowych funkcjonalności.</li>



<li>Mniejsza koncentracja wiedzy wśród programistów, co pozwala uniknąć sytuacji, w której brak kluczowej osoby może okazać się poważnym problemem.</li>



<li>Odpowiedzialność za poszczególne komponenty jest podzielona pomiędzy oddzielne zespoły, co pozwala na skuteczne dyżurowanie i szybką reakcję odpowiednich dla danego problemu osób. </li>
</ul>



<p><strong>Przeczytaj także:</strong> <a href="https://nearshore-it.eu/pl/artykuly/mikroserwisy-service-mesh-z-istio">Mikroserwisy – Service Mesh z Istio. Poznaj Istio i możliwości jakie daje.</a></p>



<h2 class="wp-block-heading" id="Wady-mikroserwisow">Wady mikroserwisów</h2>



<h3 class="wp-block-heading">Z perspektywy biznesu</h3>



<ul class="wp-block-list">
<li>Początkowy koszt wykonania aplikacji w architekturze rozproszonej może być wyższy niż w przypadku monolitu. Podwyższony koszt to przede wszystkim wydatek na infrastrukturę oraz zaangażowanie odpowiednich specjalistów DevOps, odpowiedzialnych za jej utrzymanie.</li>



<li>Ryzyko, że realizacja aplikacji będzie utrudniona lub nawet się nie powiedzie, jest większe z powodu nieodłącznej złożoności takiej architektury.</li>



<li>Wdrożenie takiej architektury wymaga zmiany podejścia całego zespołu pracującego nad aplikacją. Decyzyjność przesuwa się od menedżerów i architektów w stronę poszczególnych zespołów. Z taką autonomią przychodzi większa potrzeba skutecznej komunikacji i współpracy pomiędzy zespołami.</li>
</ul>



<h3 class="wp-block-heading">Z perspektywy developera</h3>



<ul class="wp-block-list">
<li>Funkcjonalność wymagająca bezwzględnej spójności danych (transakcje bankowe itp.) jest trudniejsza do implementacji, ponieważ wymaga dodatkowej koordynacji całego procesu, który może być realizowany w kliku usługach. W aplikacji monolitycznej taki problem byłby rozwiązany za pomocą transakcji na poziomie bazy danych.</li>



<li>Debugowanie może być utrudnione z powodu rozproszenia logiki w wielu usługach, których logi mogą zawierać wskazówki o błędzie. Dodatkowymi źródłami błędów mogą okazać się punkty komunikacji pomiędzy poszczególnymi usługami.</li>



<li>Testowanie integracyjne nowych funkcjonalności staje się bardziej skomplikowane, ponieważ nie ma możliwości przetestowania całego systemu rozproszonego.</li>
</ul>



<h2 class="wp-block-heading" id="Mikrouslugi-a-podejscie-DDD"><strong>Mikrousługi a podejście DDD</strong></h2>



<p>Większość korzyści płynących z zastosowania architektury rozproszonej jest efektem stworzenia prawidłowego podziału odpowiedzialności poszczególnych usług i wyznaczenia sposobu komunikacji między nimi. Celem jest stworzenie silnej spójności serwisów i jednocześnie luźnego powiązania pomiędzy nimi. Innymi słowy, rzeczy, które zwykle wymagają wspólnej zmiany, powinny należeć do jednego serwisu. Bez odpowiedniego podziału zamiast korzyści, jak niezależna implementacja czy skalowalność usług, możemy skończyć z niewydajnym lub trudnym w utrzymaniu projektem. W praktyce jest to oczywiście trudniejsze do zrealizowania niż w teorii – wstępne założenia lub późniejsze wymagania ulegają zmianie. Z tego powodu możliwość łatwego wprowadzania zmian jest kolejnym krytycznym aspektem podczas projektowania każdej aplikacji.</p>



<p>Podejście <strong>Domain-driven design (DDD)</strong> jest kluczowym narzędziem podczas projektowania architektury mikroserwisowej, tak przy rozbijaniu aplikacji monolitycznej, jak i tworzeniu aplikacji od zera.</p>



<h3 class="wp-block-heading">Czym jest DDD? Czyli jak okiełznać system podczas tworzenia oprogramowania</h3>



<p>DDD zapoczątkowane w książce Erica Evansa to zestaw zasad i wzorców, których celem jest wsparcie tworzenia aplikacji rozproszonych w oparciu o model domeny biznesowej będącej tematem tworzonego oprogramowania. Zespół programistów wraz z ekspertami domeny biznesowej tworzą model biznesowy w wypracowanym wspólnym języku, tzw. <em>ubiquitous language</em><em>. </em>Następnie stworzony model jest tłumaczony na poszczególne usługi, ustalane są protokoły komunikacji między nimi oraz tworzone są zespoły odpowiedzialne za poszczególne serwisy. W całym procesie&nbsp; pomocny może być dodatkowo <a href="https://en.wikipedia.org/wiki/Event_storming" target="_blank" rel="noopener">event storming</a>. Wzorce DDD mają na celu ułatwienie zrozumienia domeny i zależności w niej zachodzących. Od tego już niedaleko do wyznaczenia granic w domenie, a tym samym wypracowania podziału na usługi zmapowane na domenę biznesową.</p>



<h2 class="wp-block-heading" id="Mikroserwisy-w-praktyce-case-study">Mikroserwisy w praktyce – case study</h2>



<p>W istniejącej od wielu lat<a href="http://jcommerce.local/klienci/pionierskie-rozwiazanie-developerow-java-dla-e-commerce" target="_blank" rel="noopener"> </a>platformie e-commerce pojawiło się nowe wymaganie biznesowe, polegające na masowym tworzeniu nowych ofert na bazie plików. Narzędzie miało być głównie stosowane przez sprzedawców oferujących szeroki asortyment, którzy w ten sposób mogliby usprawnić i zautomatyzować interakcję z platformą w kwestii tworzenia i edycji swoich ofert.</p>



<p>Wspomniana platforma, chociaż została stworzona jako monolit, od dawna jest już rozbita i rozwijana w architekturze mikroserwisowej. Zadanie zlecone jednemu z zespołów Inetum polegało więc na stworzeniu nowej mikrousługi (ostatecznie powstało ich kilka) odpowiedzialnej za realizację tej funkcjonalności. Prace nad rozwiązaniem postępowały bez ingerencji w resztę usług aplikacji, której rozwój mógł postępować niezależnie. Jedynym punktem styku z resztą platformy stała się inna mikrousługa, a szczegóły komunikacji i implementacji zostały ustalone pomiędzy zespołami odpowiedzialnymi za obie usługi. Również decyzje o wyborze technologii (jak baza danych czy nawet język programowania) pozostawały w dużej mierze w gestii zespołu. Po wdrożeniu na produkcję zespół Inetum jest w stanie dynamicznie skalować ilość instancji usługi adekwatnie do liczby zapytań od użytkowników.</p>



<p>Taka autonomia jest kluczowa przy rozwoju aplikacji, nad którą kolektywnie pracują nawet setki zespołów. Trudno sobie wręcz wyobrazić skuteczne wdrożenie takiej funkcjonalności, gdyby cala platforma była nadal monolitem.</p>



<h2 class="wp-block-heading" id="Podsumowujac-czy-architektura-mikroserwisowa-sprawdzi-sie-w-moim-projekcie">Podsumowując: czy architektura mikroserwisowa sprawdzi się w moim projekcie?</h2>



<p>Odpowiedź na to pytanie musi być niestety wymijająca – <strong>to zależy. </strong>Decydując się na dany model, akceptujemy kompromis, czyli przyjmujemy go razem z jego mocnymi i słabymi stronami.</p>



<h3 class="wp-block-heading">Gdy chcemy rozbić monolit</h3>



<p>Jeżeli rozważamy rozbicie istniejącej aplikacji monolitycznej, decyzja jest może prostsza, zmotywowana wszystkimi bolączkami, które nastręcza monolit. <strong>W tym przypadku jednym ze sprawdzonych podejść jest odcinanie mniejszych serwisów z głównego bloku,</strong> aż w końcu nowe funkcjonalności będą mogły być tworzone w całkowitej izolacji, a mniejszy centralny monolit będzie stopniowo wygaszany.</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/JPro_2021.11.10_graphic_3.png" alt="architektura mikroserwisowa całej aplikacji" class="wp-image-36083" title="Mikroserwisy – czy to jeszcze rewolucja i nowa jakość czy już standard w projektach? 26"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">Gdy tworzymy aplikację od podstaw</h3>



<p>Jeżeli jednak rozpoczynamy tworzenie aplikacji od zera, jednym z kluczowych względów, na którym możemy oprzeć decyzję, jest rozmiar docelowej aplikacji. W przypadku tworzenia MVP aplikacji, najważniejsza jest szybkość dostarczenia funkcjonalności kosztem innych priorytetów. Zgodnie z zasadą <a href="https://martinfowler.com/bliki/Yagni.html" target="_blank" rel="noopener">YAGNI</a> (<em>You Ain’t Gonna Need It</em>) nie ma sensu inwestować w zastosowanie zbyt wyszukanych narzędzi, jeśli nie mamy pewności, że aplikacja będzie się cieszyć odpowiednim poziomem zainteresowania.</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2024/09/JPro_2021.11.10_graphic_4.png" alt="architektura mikroserwisów" class="wp-image-36084" title="Mikroserwisy – czy to jeszcze rewolucja i nowa jakość czy już standard w projektach? 27"></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p><strong>Taka sytuacja przemawia więc za zastosowaniem monolitu, który dopiero w dalszej fazie zostanie podzielony – ciekawym rozwiązaniem może być zastosowanie architektury tzw. modularnego monolitu, w której funkcjonalności rozbite są na poszczególne moduły tworzone w ramach jednej aplikacji.</strong></p>



<p>Jeśli jednak wiemy, że rozmiary docelowej aplikacji uzasadniają wstępną inwestycję, wtedy architektura mikroserwisowa jest jak najbardziej rozsądnym wyborem.</p>



<p><strong>Przeczytaj także: </strong><a href="https://nearshore-it.eu/pl/artykuly/kim-jest-devops-i-jak-wspiera-projekty-it/" target="_blank" data-type="URL" data-id="https://nearshore-it.eu/pl/artykuly/kim-jest-devops-i-jak-wspiera-projekty-it" rel="noreferrer noopener"> Kim jest DevOps i jak wspiera projekty IT? </a></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://nearshore-it.eu/pl/artykuly/mikroserwisy-nowa-jakosc-w-miedzynarodowych-projektach-it/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
