{"id":78676,"date":"2020-04-21T07:42:22","date_gmt":"2020-04-21T05:42:22","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya"},"modified":"2020-04-21T07:42:22","modified_gmt":"2020-04-21T05:42:22","slug":"devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya","title":{"rendered":"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Cz\u0119\u015b\u0107 1: Web \/ Android<\/h1>\n<p>\n <u>Uwaga<\/u>: <i>ten artyku\u0142 jest przek\u0142adem oryginalnego artyku\u0142u na rosyjski\u00a0<\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@altunin.alexey.a\/devops-tools-are-not-only-for-devops-building-test-automation-infrastructure-from-scratch-18e351dde938?source=friends_link&amp;sk=54dcbf6ab96c5592d093b50e441f942e\"><i>\u201eNarz\u0119dzia DevOps nie s\u0105 tylko dla DevOps. Budowanie infrastruktury automatyzacji test\u00f3w od podstaw\u201d.<\/i><\/a><\/noindex><i> Jednak wszystkie ilustracje, linki, cytaty i terminy pozostaj\u0105 w oryginalnym j\u0119zyku, aby unikn\u0105\u0107 wypaczenia sensu podczas t\u0142umaczenia na rosyjski. \u017bycz\u0119 przyjemnej lektury!<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/3d2ffb8331713a18755213cafac02144.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n Obecnie zaw\u00f3d DevOps nale\u017cy do najbardziej poszukiwanych w bran\u017cy IT. Je\u015bli otworzysz popularne strony z ofertami pracy i ustawisz filtr wed\u0142ug wynagrodze\u0144, zobaczysz, \u017ce oferty zwi\u0105zane z DevOps znajduj\u0105 si\u0119 na pocz\u0105tku listy. Wa\u017cne jest jednak, aby zrozumie\u0107, \u017ce dotyczy to g\u0142\u00f3wnie pozycji \u201eSenior\u201d, co oznacza, \u017ce kandydat ma wysoki poziom umiej\u0119tno\u015bci, znajomo\u015b\u0107 technologii i narz\u0119dzi. Z tym te\u017c zwi\u0105zany jest wysoki poziom odpowiedzialno\u015bci za nieprzerwan\u0105 prac\u0119 na produkcji. Jednak zaczynamy zapomina\u0107, czym jest DevOps. Pocz\u0105tkowo nie by\u0142 to konkretny cz\u0142owiek ani departament. Szukaj\u0105c definicji tego terminu, znajdziemy wiele \u0142adnych i poprawnych rzeczownik\u00f3w, takich jak metodologia, praktyki, filozofia kulturowa, grupa koncepcji i tak dalej.<\/p>\n<p>Moja specjalizacja to in\u017cynier automatyzacji testowania (QA automation engineer), ale uwa\u017cam, \u017ce nie powinna ogranicza\u0107 si\u0119 tylko do pisania test\u00f3w automatycznych lub opracowywania architektury frameworka testowego. W 2020 roku znajomo\u015b\u0107 infrastruktury automatyzacji jest r\u00f3wnie\u017c niezb\u0119dna. Umo\u017cliwia to samodzielne organizowanie procesu automatyzacji, od uruchamiania test\u00f3w po dostarczanie wynik\u00f3w wszystkim zainteresowanym stronom zgodnie z wyznaczonymi celami. W rezultacie umiej\u0119tno\u015bci DevOps s\u0105 obowi\u0105zkowym czynnikiem do wykonania tej pracy. I wszystko to jest dobre, ale niestety istnieje problem (<i>spoiler: ten artyku\u0142 podejmuje pr\u00f3b\u0119 uproszczenia tego problemu<\/i>). Polega on na tym, \u017ce DevOps jest trudny. I to jest oczywiste, poniewa\u017c firmy nie b\u0119d\u0105 p\u0142aci\u0107 du\u017co za to, co mo\u017cna \u0142atwo zrobi\u0107... W \u015bwiecie DevOps istnieje wiele narz\u0119dzi, termin\u00f3w i praktyk, kt\u00f3re trzeba opanowa\u0107. Szczeg\u00f3lnie jest to trudne na pocz\u0105tku kariery i zale\u017cy od zdobytego do\u015bwiadczenia technicznego.<\/p>\n<p><img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/20712bd4acf881d5346b87f5a2b359d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u0179r\u00f3d\u0142o: <noindex><a rel=\"nofollow\" href=\"http:\/\/maximelanciauxbi.blogspot.com\/2017\/04\/devops-tools.html\"> http:\/\/maximelanciauxbi.blogspot.com\/2017\/04\/devops-tools.html<\/a><\/noindex><\/p>\n<p>Tutaj zako\u0144czymy wst\u0119p i skupimy si\u0119 na celu tego artyku\u0142u.\u00a0<\/p>\n<h3>O czym jest ten artyku\u0142<\/h3>\n<p>\nW tym artykule zamierzam podzieli\u0107 si\u0119 moim do\u015bwiadczeniem w budowaniu infrastruktury do automatyzacji test\u00f3w. W internecie mo\u017cna znale\u017a\u0107 wiele \u017ar\u00f3de\u0142 informacji na temat r\u00f3\u017cnych narz\u0119dzi i sposob\u00f3w ich u\u017cycia, ale chcia\u0142bym rozwa\u017cy\u0107 je wy\u0142\u0105cznie w kontek\u015bcie automatyzacji. Wierz\u0119, \u017ce wielu in\u017cynier\u00f3w automatyzacji zna sytuacj\u0119, gdy opracowane testy, poza wami, nikt nie uruchamia ani nie dba o ich utrzymanie. W efekcie testy staj\u0105 si\u0119 przestarza\u0142e i trzeba po\u015bwi\u0119ca\u0107 czas na ich aktualizacj\u0119. Zw\u0142aszcza na pocz\u0105tku kariery mo\u017ce to by\u0107 do\u015b\u0107 trudne zadanie: w\u0142a\u015bciwie zdecydowa\u0107, kt\u00f3re narz\u0119dzia powinny pom\u00f3c w rozwi\u0105zaniu tego problemu, jak je wybra\u0107, skonfigurowa\u0107 i utrzyma\u0107. Niekt\u00f3rzy testerzy zwracaj\u0105 si\u0119 o pomoc do DevOps (ludzi) i, b\u0105d\u017amy szczerzy, takie podej\u015bcie dzia\u0142a. W wielu przypadkach mo\u017ce to by\u0107 jedyna opcja, poniewa\u017c brakuje nam widoczno\u015bci wszystkich zale\u017cno\u015bci. Ale, jak wiemy, DevOps to bardzo zaj\u0119ci ludzie, musz\u0105 my\u015ble\u0107 o infrastrukturze ca\u0142ej firmy, wdro\u017ceniach, monitorowaniu, mikroserwisach i innych podobnych zadaniach w zale\u017cno\u015bci od organizacji\/zesp\u00f3\u0142u. Jak to zazwyczaj bywa, automatyzacja nie jest priorytetem. W takim przypadku musimy stara\u0107 si\u0119 zrobi\u0107 wszystko, co w naszej mocy, od pocz\u0105tku do ko\u0144ca. To zmniejszy zale\u017cno\u015bci, przyspieszy proces pracy, poprawi nasze umiej\u0119tno\u015bci i pozwoli zobaczy\u0107 szerszy obraz sytuacji.<\/p>\n<p>W artykule przedstawione s\u0105 najpopularniejsze i najbardziej poszukiwane narz\u0119dzia oraz pokazano, jak je wykorzysta\u0107 do krok po kroku budowania infrastruktury automatyzacji. Ka\u017cda grupa jest reprezentowana przez narz\u0119dzia, kt\u00f3re zosta\u0142y przetestowane na podstawie osobistego do\u015bwiadczenia. Jednak to nie znaczy, \u017ce musicie u\u017cywa\u0107 tego samego. Same narz\u0119dzia nie s\u0105 wa\u017cne, pojawiaj\u0105 si\u0119 i staj\u0105 przestarza\u0142e. Naszym in\u017cynieryjnym zadaniem jest zrozumienie podstawowych zasad: dlaczego potrzebujemy tej grupy narz\u0119dzi i jakie zadania robocze mo\u017cemy dzi\u0119ki nim rozwi\u0105za\u0107. Dlatego na ko\u0144cu ka\u017cdej sekcji zostawiam linki do podobnych narz\u0119dzi, kt\u00f3re by\u0107 mo\u017ce s\u0105 u\u017cywane w waszej organizacji.<\/p>\n<h3>Czego w tym artykule nie ma<\/h3>\n<p>\nPowt\u00f3rz\u0119 jeszcze raz, \u017ce artyku\u0142 nie dotyczy konkretnych narz\u0119dzi, wi\u0119c nie b\u0119dzie tu fragment\u00f3w kodu z dokumentacji ani opis\u00f3w konkretnych polece\u0144. Na ko\u0144cu ka\u017cdej sekcji zostawi\u0142em linki do szczeg\u00f3\u0142owego zapoznania si\u0119 z tematem.<\/p>\n<p>Zosta\u0142o to zrobione z powodu tego, \u017ce:\u00a0<\/p>\n<ul>\n<li>ten materia\u0142 jest bardzo \u0142atwy do znalezienia w r\u00f3\u017cnych \u017ar\u00f3d\u0142ach (dokumentacja, ksi\u0105\u017cki, kursy wideo);<\/li>\n<li>je\u015bli zaczniemy si\u0119 zag\u0142\u0119bia\u0107, b\u0119dziemy musieli napisa\u0107 10, 20, 30 cz\u0119\u015bci tego artyku\u0142u (podczas gdy w planach s\u0105 2-3);<\/li>\n<li>po prostu nie chc\u0119 marnowa\u0107 waszego czasu, poniewa\u017c by\u0107 mo\u017ce chcecie u\u017cywa\u0107 innych narz\u0119dzi do osi\u0105gni\u0119cia tych samych cel\u00f3w.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Praktyka<\/h3>\n<p>\nBardzo chcia\u0142bym, aby ten materia\u0142 by\u0142 przydatny dla ka\u017cdego czytelnika, a nie tylko zosta\u0142 przeczytany i zapomniany. W ka\u017cdym procesie nauki praktyka jest bardzo wa\u017cnym elementem. W tym celu przygotowa\u0142em<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeyAltunin\/devops-tools-for-qa-automation-infrastructure\"> repozytorium GitHub z przewodnikiem krok po kroku, jak zrobi\u0107 wszystko od zera<\/a><\/noindex>. Czeka na was r\u00f3wnie\u017c praca domowa, aby upewni\u0107 si\u0119, \u017ce nie skopiowali\u015bcie bezmy\u015blnie wierszy wykonywanych polece\u0144 <\/p>\n<h3>Plan<\/h3>\n<p><\/p>\n<p><strong>Krok<\/strong><br \/>\n<strong>Technologia<\/strong><br \/>\n<strong>Narz\u0119dzia<\/strong><\/p>\n<p><strong>1<\/strong><br \/>\nLokalne uruchamianie (przygotowanie test\u00f3w demonstracyjnych www \/ android i uruchomienie ich lokalnie)\u00a0<br \/>\nNode.js, Selenium, Appium<\/p>\n<p><strong>2<\/strong><br \/>\nSystemy kontroli wersji\u00a0<br \/>\nGitem<\/p>\n<p><strong>3<\/strong><br \/>\nKonteneryzacja<br \/>\nDocker, Selenium grid, Selenoid (Web, Android)<\/p>\n<p><strong>4<\/strong><br \/>\nCI \/ CD<br \/>\nGitlab CI<\/p>\n<p><strong>5<\/strong><br \/>\nPlatformy chmurowe<br \/>\nGoogle Cloud Platform<\/p>\n<p><strong>6<\/strong><br \/>\nOrkiestracja<br \/>\nKubernetes<\/p>\n<p><strong>7<\/strong><br \/>\nInfrastruktura jako kod (IaC)<br \/>\nTerraform, Ansible<\/p>\n<p><\/p>\n<h3>Struktura ka\u017cdej sekcji<\/h3>\n<p>\nAby utrzyma\u0107 narracj\u0119 w przejrzystej formie, ka\u017cda sekcja opisuje si\u0119 wed\u0142ug nast\u0119puj\u0105cego planu:<\/p>\n<ul>\n<li>kr\u00f3tkie wprowadzenie do technologii,<\/li>\n<li>warto\u015b\u0107 dla infrastruktury automatyzacji,<\/li>\n<li>ilustracja aktualnego stanu infrastruktury,<\/li>\n<li>linki do dalszej nauki,<\/li>\n<li>podobne narz\u0119dzia.<\/li>\n<\/ul>\n<p><\/p>\n<h2>1. Lokalna uruchomienie test\u00f3w<\/h2>\n<p><\/p>\n<h3>Kr\u00f3tkie wprowadzenie do technologii<\/h3>\n<p>\nTo tylko etap przygotowawczy do uruchomienia test\u00f3w demonstracyjnych lokalnie i do sprawdzenia, czy przechodz\u0105 one pomy\u015blnie. W praktycznej cz\u0119\u015bci wykorzystuje si\u0119 Node.js, ale j\u0119zyk programowania i platforma nie maj\u0105 znaczenia - mo\u017cna korzysta\u0107 z tych u\u017cywanych w waszej firmie.\u00a0<\/p>\n<p>Jednak jako narz\u0119dzia automatyzacji polecam u\u017cycie Selenium WebDriver dla platform webowych oraz Appium dla platformy Android, poniewa\u017c w kolejnych krokach b\u0119dziemy korzysta\u0107 z obraz\u00f3w Dockera, kt\u00f3re s\u0105 zoptymalizowane do pracy z tymi narz\u0119dziami. Co wi\u0119cej, nawi\u0105zuj\u0105c do wymaga\u0144 w ofertach pracy, te narz\u0119dzia s\u0105 najbardziej poszukiwane na rynku.<\/p>\n<p>Jak zapewne zauwa\u017cy\u0142e\u015b, rozwa\u017camy tylko testy webowe i na Androidzie. Niestety, IOS to zupe\u0142nie inna historia (dzi\u0119kujemy Apple). Planuj\u0119 pokaza\u0107 rozwi\u0105zania i praktyki zwi\u0105zane z IOS w kolejnych cz\u0119\u015bciach.<\/p>\n<h3>Warto\u015b\u0107 dla infrastruktury automatyzacji<\/h3>\n<p>\nZ punktu widzenia infrastruktury lokalne uruchomienie nie ma \u017cadnej warto\u015bci. Sprawdzasz tylko, czy testy dzia\u0142aj\u0105 na lokalnej maszynie w lokalnych przegl\u0105darkach i symulatorach. Jednak w ka\u017cdym przypadku jest to niezb\u0119dny punkt wyj\u015bcia.<\/p>\n<h3>Ilustracja obecnego stanu infrastruktury<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/504f28744e29938f66be41c32d9a7dc6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Linki do zg\u0142\u0119biania tematu<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/selenium.dev\/\">Selenium<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/appium.io\/docs\/en\/about-appium\/getting-started\/\">Appium<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developer.android.com\/studio\/run\/emulator\">Emulator Androida<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/SeleniumHQ\/selenium\/tree\/master\/javascript\/node\/selenium-webdriver\/example\">Przyk\u0142ady Selenium JS na GitHubie<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/appium\/appium\/tree\/master\/sample-code\/javascript-wd\">Przyk\u0142ady Appium JS na GitHubie<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Podobne narz\u0119dzia<\/h3>\n<p><\/p>\n<ul>\n<li>dowolny j\u0119zyk programowania, kt\u00f3ry lubisz, w po\u0142\u0105czeniu z testami Selenium\/Appium;<\/li>\n<li>jakiekolwiek testy;<\/li>\n<li>dowolny runner test\u00f3w.<\/li>\n<\/ul>\n<p><\/p>\n<h2>2. Systemy kontroli wersji (Git)<\/h2>\n<p><\/p>\n<h3>Kr\u00f3tkie wprowadzenie do technologii<\/h3>\n<p>\n Nie b\u0119dzie to dla nikogo wielkim odkryciem, je\u015bli powiem, \u017ce system kontroli wersji to niezwykle wa\u017cna cz\u0119\u015b\u0107 rozwoju, zar\u00f3wno w zespole, jak i indywidualnie. Na podstawie r\u00f3\u017cnych \u017ar\u00f3de\u0142 mo\u017cna z pe\u0142nym przekonaniem powiedzie\u0107, \u017ce Git jest najpopularniejszym przedstawicielem. System kontroli wersji oferuje wiele korzy\u015bci, takich jak udost\u0119pnianie kodu, przechowywanie wersji, przywracanie do poprzednich ga\u0142\u0119zi, monitorowanie historii projektu, kopie zapasowe. Nie b\u0119dziemy omawia\u0107 ka\u017cdego punktu szczeg\u00f3\u0142owo, poniewa\u017c jestem pewny, \u017ce dobrze to znasz i u\u017cywasz na co dzie\u0144. Ale je\u015bli nie, to polecam wstrzyma\u0107 si\u0119 z czytaniem tego artyku\u0142u i jak najszybciej uzupe\u0142ni\u0107 t\u0119 luk\u0119.<\/p>\n<h3>Warto\u015b\u0107 dla infrastruktury automatyzacji<\/h3>\n<p>\n I tutaj mo\u017cesz zada\u0107 s\u0142uszne pytanie: \"Dlaczego opowiada nam o Gicie? Wszyscy to znaj\u0105 i u\u017cywaj\u0105 zar\u00f3wno do rozwijania kodu, jak i do test\u00f3w automatycznych.\" B\u0119dziesz ca\u0142kowicie s\u0142uszny, ale w tym artykule m\u00f3wimy o infrastrukturze, a ta sekcja stanowi wprowadzenie do sekcji 7: \"Infrastruktura jako kod (IaC)\". Dla nas oznacza to, \u017ce ca\u0142a infrastruktura, w tym testowa, jest opisana w postaci kodu, co oznacza, \u017ce tak\u017ce mo\u017cemy zastosowa\u0107 systemy wersjonowania i uzyska\u0107 podobne korzy\u015bci do tych dla kodu rozwoju i automatyzacji.<\/p>\n<p>Om\u00f3wimy IaC bardziej szczeg\u00f3\u0142owo w kroku 7, ale ju\u017c teraz mo\u017cna zacz\u0105\u0107 u\u017cywa\u0107 Gita lokalnie, tworz\u0105c lokalne repozytorium. Og\u00f3lny obraz zostanie rozszerzony, gdy dodamy do infrastruktury zdalne repozytorium.<\/p>\n<h3>Ilustracja obecnego stanu infrastruktury<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/f17c1d2b2f18aa814c44f7c443e49416.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Linki do zg\u0142\u0119biania tematu<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.atlassian.com\/git\/tutorials\/what-is-version-control\">Czym jest kontrola wersji<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/git-scm.com\/\">Gitem<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/git-scm.com\/book\/en\/v2\/Getting-Started-About-Version-Control\">Wprowadzenie \u2014 O kontroli wersji<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Podobne narz\u0119dzia<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/subversion.apache.org\/\">SVN<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.mercurial-scm.org\/guide\">Mercurial<\/a><\/noindex>\u00a0<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/azure.microsoft.com\/en-us\/services\/devops\/server\/\">Microsoft TFS (obecnie cz\u0119\u015b\u0107 Azure DevOps Services)<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2>3. Konteneryzacja (Docker)<\/h2>\n<p><\/p>\n<h3>Kr\u00f3tkie wprowadzenie do technologii<\/h3>\n<p>\n Aby pokaza\u0107, jak konteneryzacja zmieni\u0142a zasady gry, cofnijmy si\u0119 o kilka dziesi\u0119cioleci. W tamtych czasach ludzie kupowali i u\u017cywali serwer\u00f3w do uruchamiania aplikacji. Jednak w wi\u0119kszo\u015bci przypadk\u00f3w wymagane zasoby do uruchomienia nie by\u0142y znane wcze\u015bniej. W rezultacie firmy wydawa\u0142y pieni\u0105dze na zakup drogich, mocnych serwer\u00f3w, ale cz\u0119\u015b\u0107 tych mocy nie by\u0142a w pe\u0142ni wykorzystywana.<\/p>\n<p>Kolejnym etapem ewolucji by\u0142y maszyny wirtualne (VM), kt\u00f3re rozwi\u0105za\u0142y problem wydatk\u00f3w na niewykorzystane zasoby. Ta technologia pozwoli\u0142a na uruchamianie aplikacji niezale\u017cnie od siebie w ramach jednego serwera, wydzielaj\u0105c ca\u0142kowicie izolowan\u0105 przestrze\u0144. Niestety, ka\u017cda technologia ma swoje wady. Uruchomienie VM wymaga pe\u0142noprawnego systemu operacyjnego, kt\u00f3ry zu\u017cywa CPU, RAM, pami\u0119\u0107 masow\u0105, a w zale\u017cno\u015bci od systemu operacyjnego, nale\u017cy uwzgl\u0119dni\u0107 koszty licencji. Te czynniki wp\u0142ywaj\u0105 na czas uruchamiania i utrudniaj\u0105 przeno\u015bno\u015b\u0107.<\/p>\n<p>I tak doszli\u015bmy do konteneryzacji. I znowu ta technologia rozwi\u0105za\u0142a wcze\u015bniejszy problem, poniewa\u017c kontenery nie u\u017cywaj\u0105 pe\u0142noprawnego systemu operacyjnego, co pozwala na zwolnienie znacznej ilo\u015bci zasob\u00f3w i zapewnia szybkie oraz elastyczne rozwi\u0105zanie dla przeno\u015bno\u015bci.<\/p>\n<p>Oczywi\u015bcie, technologia konteneryzacji nie jest niczym nowym i zosta\u0142a po raz pierwszy zaprezentowana pod koniec lat 70-tych. W tamtych czasach przeprowadzono wiele bada\u0144, prac i pr\u00f3b. To w\u0142a\u015bnie Docker dostosowa\u0142 t\u0119 technologi\u0119 i uczyni\u0142 j\u0105 \u0142atwo dost\u0119pn\u0105 dla mas. W dzisiejszych czasach, gdy m\u00f3wimy o kontenerach, w wi\u0119kszo\u015bci przypadk\u00f3w mamy na my\u015bli Docker. M\u00f3wi\u0105c o kontenerach Docker, mamy na my\u015bli kontenery Linux. Mo\u017cemy u\u017cywa\u0107 system\u00f3w Windows i macOS do uruchamiania kontener\u00f3w, ale wa\u017cne jest, aby zrozumie\u0107, \u017ce w takim przypadku pojawia si\u0119 dodatkowa warstwa. Na przyk\u0142ad, Docker na Macu niepostrze\u017cenie uruchamia kontenery w lekkiej maszynie wirtualnej Linux. Wr\u00f3cimy do tego tematu, gdy b\u0119dziemy omawia\u0107 uruchamianie emulator\u00f3w Androida w kontenerach, poniewa\u017c pojawia si\u0119 tutaj bardzo istotny niuans, kt\u00f3ry nale\u017cy om\u00f3wi\u0107 bardziej szczeg\u00f3\u0142owo.<\/p>\n<h3>Warto\u015b\u0107 dla infrastruktury automatyzacji<\/h3>\n<p>\n Ustalili\u015bmy, \u017ce konteneryzacja i Docker to \u015bwietne rozwi\u0105zania. Przyjrzyjmy si\u0119 temu w kontek\u015bcie automatyzacji, poniewa\u017c ka\u017cde narz\u0119dzie lub technologia powinny rozwi\u0105zywa\u0107 jaki\u015b problem. Zidentyfikujmy oczywiste problemy z automatyzacj\u0105 test\u00f3w w kontek\u015bcie test\u00f3w UI:<\/p>\n<ul>\n<li>ogromna liczba zale\u017cno\u015bci przy instalacji Selenium, a zw\u0142aszcza Appium;<\/li>\n<li>problemy z kompatybilno\u015bci\u0105 mi\u0119dzy wersjami przegl\u0105darek, symulator\u00f3w i sterownik\u00f3w;<\/li>\n<li>brak izolowanej przestrzeni dla przegl\u0105darek\/symulator\u00f3w, co jest szczeg\u00f3lnie krytyczne dla r\u00f3wnoleg\u0142ego uruchamiania;<\/li>\n<li>trudno zarz\u0105dza\u0107 i utrzymywa\u0107, je\u015bli trzeba uruchomi\u0107 10, 50, 100 lub nawet 1000 przegl\u0105darek jednocze\u015bnie.<\/li>\n<\/ul>\n<p>\nAle poniewa\u017c Selenium jest najpopularniejszym narz\u0119dziem do automatyzacji, a Docker najpopularniejszym narz\u0119dziem do konteneryzacji, nikogo nie powinno dziwi\u0107, \u017ce kto\u015b pr\u00f3bowa\u0142 je po\u0142\u0105czy\u0107, aby uzyska\u0107 pot\u0119\u017cne narz\u0119dzie do rozwi\u0105zania wy\u017cej wymienionych problem\u00f3w. Przyjrzyjmy si\u0119 tym rozwi\u0105zaniom bardziej szczeg\u00f3\u0142owo.\u00a0<\/p>\n<p><u>Selenium grid w docker<\/u><\/p>\n<p>To narz\u0119dzie jest najpopularniejszym na \u015bwiecie rozwi\u0105zaniem Selenium do uruchamiania wielu przegl\u0105darek na wielu maszynach i zarz\u0105dzania nimi z centralnego w\u0119z\u0142a. Aby uruchomi\u0107, nale\u017cy zarejestrowa\u0107 co najmniej 2 cz\u0119\u015bci: Hub i Node(y). Hub to centralny w\u0119ze\u0142, kt\u00f3ry otrzymuje wszystkie zapytania z test\u00f3w i rozdziela je mi\u0119dzy odpowiednie Nodes. Dla ka\u017cdego Node mo\u017cemy skonfigurowa\u0107 konkretn\u0105 konfiguracj\u0119, na przyk\u0142ad wskazuj\u0105c odpowiedni\u0105 przegl\u0105dark\u0119 i jej wersj\u0119. Jednak musimy sami zadba\u0107 o zgodne sterowniki dla przegl\u0105darek i zainstalowa\u0107 je na potrzebnych Nodes. Z tego powodu Selenium grid nie jest u\u017cywane w czystej postaci, z wyj\u0105tkiem przypadk\u00f3w, gdy musimy pracowa\u0107 z przegl\u0105darkami, kt\u00f3rych nie mo\u017cna zainstalowa\u0107 na systemie Linux. W wszystkich innych przypadkach znacznie bardziej elastycznym i w\u0142a\u015bciwym rozwi\u0105zaniem jest u\u017cycie obraz\u00f3w Docker do uruchomienia Hub i Nodes Selenium grid. Takie podej\u015bcie bardzo upraszcza zarz\u0105dzanie w\u0119z\u0142ami, poniewa\u017c mo\u017cemy wybra\u0107 odpowiedni obraz z ju\u017c zainstalowanymi zgodnymi wersjami przegl\u0105darek i sterownik\u00f3w.<\/p>\n<p>Pomimo negatywnych opinii na temat stabilno\u015bci dzia\u0142ania, szczeg\u00f3lnie przy r\u00f3wnoczesnym uruchamianiu du\u017cej liczby Nodes, Selenium grid wci\u0105\u017c pozostaje najpopularniejszym narz\u0119dziem do r\u00f3wnoleg\u0142ego uruchamiania test\u00f3w Selenium. Wa\u017cne jest, aby zauwa\u017cy\u0107, \u017ce w open-source stale pojawiaj\u0105 si\u0119 r\u00f3\u017cne poprawki i modyfikacje tego narz\u0119dzia, kt\u00f3re walcz\u0105 z r\u00f3\u017cnymi w\u0105skimi gard\u0142ami.<\/p>\n<p><u>Selenoid for Web<\/u><\/p>\n<p>To narz\u0119dzie to jest prze\u0142omem w \u015bwiecie Selenium, poniewa\u017c dzia\u0142a od razu po wyj\u0119ciu z pude\u0142ka i znacznie upro\u015bci\u0142o \u017cycie wielu in\u017cynier\u00f3w zajmuj\u0105cych si\u0119 automatyzacj\u0105. Przede wszystkim, to nie jest kolejna modyfikacja Selenium grid. Zamiast tego, deweloperzy stworzyli zupe\u0142nie now\u0105 wersj\u0119 Selenium Hub w j\u0119zyku Golang, co w po\u0142\u0105czeniu z lekkimi obrazami Dockera dla r\u00f3\u017cnych przegl\u0105darek przyspieszy\u0142o rozw\u00f3j automatyzacji test\u00f3w. Co wi\u0119cej, w przypadku Selenium Grid musimy z g\u00f3ry zdefiniowa\u0107 wszystkie potrzebne przegl\u0105darki oraz ich wersje, co nie stanowi problemu, gdy pracujemy tylko z jedn\u0105 przegl\u0105dark\u0105. Ale gdy mowa o kilku wspieranych przegl\u0105darkach, to Selenoid jest rozwi\u0105zaniem numer jeden, dzi\u0119ki funkcji \u2018przegl\u0105darka na \u017c\u0105danie\u2019. Wszystko, co musimy zrobi\u0107, to z g\u00f3ry pobra\u0107 potrzebne obrazy przegl\u0105darek i zaktualizowa\u0107 plik konfiguracyjny, z kt\u00f3rym wsp\u00f3\u0142pracuje Selenoid. Po otrzymaniu \u017c\u0105dania od test\u00f3w, Selenoid automatycznie uruchomi odpowiedni kontener z odpowiedni\u0105 przegl\u0105dark\u0105. Po zako\u0144czeniu testu Selenoid zatrzyma kontener, uwalniaj\u0105c w ten spos\u00f3b zasoby dla kolejnych \u017c\u0105da\u0144. Takie podej\u015bcie ca\u0142kowicie eliminuje znany problem \u2018degradacji w\u0119z\u0142\u00f3w\u2019, z kt\u00f3rym cz\u0119sto spotykamy si\u0119 w Selenium grid.<\/p>\n<p>Jednak niestety, Selenoid wci\u0105\u017c nie jest srebrn\u0105 kul\u0105. Otrzymali\u015bmy funkcj\u0119 \u2018przegl\u0105darka na \u017c\u0105danie\u2019, ale funkcja \u2018zasoby na \u017c\u0105danie\u2019 wci\u0105\u017c nie jest dost\u0119pna. Aby u\u017cywa\u0107 Selenoid, musimy go wdro\u017cy\u0107 na fizycznym sprz\u0119cie lub na maszynie wirtualnej, co oznacza, \u017ce musimy z g\u00f3ry wiedzie\u0107, ile zasob\u00f3w nale\u017cy przydzieli\u0107. Uwa\u017cam, \u017ce nie stanowi to problemu dla ma\u0142ych projekt\u00f3w, kt\u00f3re uruchamiaj\u0105 10, 20, czy nawet 30 przegl\u0105darek r\u00f3wnocze\u015bnie. Ale co je\u015bli potrzebujemy 100, 500, 1000 i wi\u0119cej? Nie ma sensu utrzymywa\u0107 i p\u0142aci\u0107 za tak\u0105 ilo\u015b\u0107 zasob\u00f3w na sta\u0142e. W sekcjach 5 i 6 tego artyku\u0142u om\u00f3wimy rozwi\u0105zania, kt\u00f3re pozwalaj\u0105 na skalowanie, znacznie obni\u017caj\u0105c tym samym koszty firmy.<\/p>\n<p><u>Selenoid dla Androida<\/u><\/p>\n<p>Po sukcesie Selenoid jako narz\u0119dzia do automatyzacji webowej, ludzie pragn\u0119li otrzyma\u0107 co\u015b podobnego dla Androida. I tak si\u0119 sta\u0142o \u2013 Selenoid zosta\u0142 wydany z obs\u0142ug\u0105 Androida. Z punktu widzenia u\u017cytkownika zasada dzia\u0142ania jest analogiczna do automatyzacji webowej. Jedyn\u0105 r\u00f3\u017cnic\u0105 jest to, \u017ce zamiast kontener\u00f3w z przegl\u0105darkami Selenoid uruchamia kontenery z emulatorami Androida. Moim zdaniem, obecnie jest to najpot\u0119\u017cniejsze bezp\u0142atne narz\u0119dzie do uruchamiania test\u00f3w Androida r\u00f3wnolegle.<\/p>\n<p>Bardzo nie chcia\u0142bym m\u00f3wi\u0107 o negatywnych stronach tego narz\u0119dzia, poniewa\u017c naprawd\u0119 bardzo mi si\u0119 podoba. Jednak\u017ce s\u0105 pewne wady, kt\u00f3re odnosz\u0105 si\u0119 tak\u017ce do automatyzacji webowej, zwi\u0105zane z skalowalno\u015bci\u0105. Dodatkowo nale\u017cy wspomnie\u0107 o jeszcze jednym ograniczeniu, kt\u00f3re mo\u017ce by\u0107 niespodziank\u0105, je\u015bli konfigurujemy narz\u0119dzie po raz pierwszy. Do uruchomienia obraz\u00f3w Androida potrzebujemy fizycznej maszyny lub VM z obs\u0142ug\u0105 zagnie\u017cd\u017conej wirtualizacji. W praktycznym przewodniku pokazuj\u0119, jak to aktywowa\u0107 na VM z systemem Linux. Jednak je\u015bli jeste\u015b u\u017cytkownikiem macOS i chcesz uruchomi\u0107 Selenoid lokalnie, to uruchomienie test\u00f3w Androida b\u0119dzie niemo\u017cliwe. Zawsze mo\u017cesz jednak uruchomi\u0107 lokalnie VM z systemem Linux z ustawion\u0105 \u201ezagnie\u017cd\u017con\u0105 wirtualizacj\u0105\u201d i wdro\u017cy\u0107 Selenoid wewn\u0105trz.<\/p>\n<h3>Ilustracja obecnego stanu infrastruktury<\/h3>\n<p>\n W kontek\u015bcie tego artyku\u0142u dodamy 2 narz\u0119dzia do ilustracji infrastruktury. Jest to Selenium Grid do test\u00f3w webowych oraz Selenoid do test\u00f3w Androida. W przewodniku na GitHubie poka\u017c\u0119 r\u00f3wnie\u017c, jak u\u017cywa\u0107 Selenoid do uruchamiania test\u00f3w webowych.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/1202ae79eba9cffc965f3a5b2648c755.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Linki do zg\u0142\u0119biania tematu<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.docker.com\/resources\/what-container\">Docker: jaki jest kontener<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.docker.com\/get-started\">Docker: rozpocznij<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/containerjournal.com\/topics\/container-ecosystems\/5-container-alternatives-to-docker\/\">5 alternatyw dla kontener\u00f3w Docker<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/SeleniumHQ\/selenium\/wiki\/Grid2\">Selenium Grid<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/SeleniumHQ\/docker-selenium\">Selenium docker<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/aerokube.com\/selenoid\/latest\/\">Selenoid<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/aerokube\/selenoid\">Selenoid Github<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developer.android.com\/studio\/run\/emulator-acceleration#vm-linux\">Ustawienia KVM dla emulator\u00f3w Androida<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Docker-Deep-Dive-Nigel-Poulton-ebook\/dp\/B01LXWQUFF\/ref=pd_sim_351_1\/147-1129855-1615632?_encoding=UTF8&amp;pd_rd_i=B01LXWQUFF&amp;pd_rd_r=f8dcd666-e707-4f85-99c6-24ecec56ea74&amp;pd_rd_w=rMnHL&amp;pd_rd_wg=u17vC&amp;pf_rd_p=bab57536-7c8f-4781-a8ed-3e270b9cd303&amp;pf_rd_r=KN6EXNGBWJ6B9QNJE4M2&amp;psc=1&amp;refRID=KN6EXNGBWJ6B9QNJE4M2\">Ksi\u0105\u017cka Docker Deep Dive<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Podobne narz\u0119dzia<\/h3>\n<p><\/p>\n<ul>\n<li>Istniej\u0105 inne narz\u0119dzia do konteneryzacji, ale Docker jest najpopularniejszy. Je\u015bli chcesz wypr\u00f3bowa\u0107 co\u015b innego, pami\u0119taj, \u017ce narz\u0119dzia, kt\u00f3re om\u00f3wili\u015bmy do r\u00f3wnoleg\u0142ego uruchamiania test\u00f3w Selenium, nie b\u0119d\u0105 dzia\u0142a\u0107 od razu.\u00a0\u00a0<\/li>\n<li>Jak ju\u017c wspomniano, istnieje wiele modyfikacji Selenium Grid, na przyk\u0142ad,<noindex><a rel=\"nofollow\" href=\"https:\/\/opensource.zalando.com\/zalenium\/\"> Zalenium<\/a><\/noindex>. <\/li>\n<\/ul>\n<p><\/p>\n<h2>4. CI \/ CD<\/h2>\n<p><\/p>\n<h3>Kr\u00f3tkie wprowadzenie do technologii<\/h3>\n<p>\n Praktyka ci\u0105g\u0142ej integracji jest do\u015b\u0107 popularna w programowaniu i staje w jednym rz\u0119dzie z systemami kontroli wersji. Mimo to czuj\u0119, \u017ce istnieje pewne zamieszanie w terminologii. W tym akapicie chcia\u0142bym opisa\u0107 3 modyfikacje tej technologii z mojej perspektywy. W internecie mo\u017cna znale\u017a\u0107 wiele artyku\u0142\u00f3w z r\u00f3\u017cnymi interpretacjami i to ca\u0142kowicie normalne, je\u015bli twoje zdanie si\u0119 r\u00f3\u017cni. Najwa\u017cniejsze to by\u0107 na tej samej fali co twoi koledzy.<\/p>\n<p>Zatem istniej\u0105 3 terminy: CI \u2014 Continuous Integration (ci\u0105g\u0142a integracja), CD \u2014 Continuous Delivery (ci\u0105g\u0142a dostawa) i ponownie CD \u2014 Continuous Deployment (ci\u0105g\u0142e wdra\u017canie). (<i>B\u0119d\u0119 u\u017cywa\u0142 tych termin\u00f3w w j\u0119zyku angielskim<\/i>). Ka\u017cda modyfikacja dodaje kilka dodatkowych etap\u00f3w do twojego procesu rozwoju. Ale s\u0142owo <u>continuous<\/u> (ci\u0105g\u0142y) jest najwa\u017cniejszy. W tym kontek\u015bcie rozumiemy co\u015b, co trwa od pocz\u0105tku do ko\u0144ca, bez przerwy lub interwencji r\u0119cznej. Przyjrzyjmy si\u0119 CI &#038; CD oraz CD w tym kontek\u015bcie.<\/p>\n<ul>\n<li><strong>Ci\u0105g\u0142a integracja \u2013<\/strong> to pierwszy krok ewolucji. Po wys\u0142aniu nowego kodu na serwer oczekujemy szybkiej informacji zwrotnej, \u017ce nasze zmiany s\u0105 w porz\u0105dku. Zwykle CI obejmuje uruchamianie narz\u0119dzi do analizy statycznej kodu oraz testy modu\u0142owe\/wywo\u0142ania API. Pozwala to na uzyskanie informacji o naszym kodzie ju\u017c kilka sekund\/minut p\u00f3\u017aniej.<\/li>\n<li><strong>Continuous Delivery<\/strong> jest bardziej zaawansowanym krokiem, na kt\u00f3rym uruchamiamy testy integracyjne\/UI. Jednak na tym etapie nie otrzymujemy wynik\u00f3w tak szybko, jak w przypadku CI. Po pierwsze, te typy test\u00f3w wymagaj\u0105 wi\u0119cej czasu na wykonanie. Po drugie, przed ich uruchomieniem musimy wdro\u017cy\u0107 nasze zmiany w \u015brodowisku testowym\/staging. Co wi\u0119cej, je\u015bli m\u00f3wimy o rozwoju aplikacji mobilnych, to pojawia si\u0119 dodatkowy etap tworzenia wersji naszej aplikacji.<\/li>\n<li><strong>Ci\u0105g\u0142e wdra\u017canie<\/strong> zak\u0142ada, \u017ce automatycznie wprowadza(i) nasze zmiany na produkcj\u0119, je\u015bli wszystkie testy akceptacyjne zosta\u0142y pomy\u015blnie zako\u0144czone na wcze\u015bniejszych etapach. Opr\u00f3cz tego po etapie wprowadzenia mo\u017cna skonfigurowa\u0107 r\u00f3\u017cne etapy, takie jak uruchamianie test\u00f3w smoke na produkcji oraz zbieranie interesuj\u0105cych metryk. Wdro\u017cenie ci\u0105g\u0142e jest mo\u017cliwe tylko przy dobrym pokryciu testami zautomatyzowanymi. Je\u015bli wymagane s\u0105 jakiekolwiek r\u0119czne interwencje, w tym testowanie, to nie jest ju\u017c <u>Ci\u0105g\u0142e<\/u> (Continuous). Wtedy mo\u017cemy m\u00f3wi\u0107, \u017ce nasza linia produkcyjna odpowiada tylko praktyce dostarczania ci\u0105g\u0142ego.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Warto\u015b\u0107 dla infrastruktury automatyzacji<\/h3>\n<p>\n W tej sekcji musz\u0119 wyja\u015bni\u0107, \u017ce gdy m\u00f3wimy o testach UI end-to-end, oznacza to, \u017ce musimy wdro\u017cy\u0107 nasze zmiany i zwi\u0105zane us\u0142ugi w testowych \u015brodowiskach. Integracja ci\u0105g\u0142a \u2014 proces nie ma zastosowania w tej kwestii i musimy zadba\u0107 o wdro\u017cenie przynajmniej praktyk dostarczania ci\u0105g\u0142ego. Wdro\u017cenie ci\u0105g\u0142e ma r\u00f3wnie\u017c sens w kontek\u015bcie test\u00f3w UI, je\u015bli planujemy je uruchomi\u0107 na produkcji.<\/p>\n<p>I zanim spojrzymy na ilustracj\u0119 zmiany architektury, chcia\u0142bym powiedzie\u0107 kilka s\u0142\u00f3w o GitLab CI. W przeciwie\u0144stwie do innych narz\u0119dzi CI\/CD, GitLab oferuje zdalne repozytorium i wiele innych dodatkowych funkcji. Tak wi\u0119c, GitLab to wi\u0119cej ni\u017c CI. Zawiera w zestawie zarz\u0105dzanie kodem \u017ar\u00f3d\u0142owym, zarz\u0105dzanie Agile, pipelines CI\/CD, narz\u0119dzia do logowania i zbierania metryk. Architektura GitLab sk\u0142ada si\u0119 z GitLab CI\/CD i GitLab Runner. Podaj\u0119 kr\u00f3tkie streszczenie z oficjalnej strony:<\/p>\n<blockquote><p>GitLab CI\/CD to aplikacja internetowa z API, kt\u00f3ra przechowuje sw\u00f3j stan w bazie danych, zarz\u0105dza projektami\/budowami i zapewnia interfejs u\u017cytkownika. GitLab Runner to aplikacja, kt\u00f3ra przetwarza budowy. Mo\u017ce by\u0107 wdra\u017cana oddzielnie i wsp\u00f3\u0142pracuje z GitLab CI\/CD przez API. Do uruchomienia test\u00f3w potrzebujesz zar\u00f3wno instancji GitLab, jak i Runnera.<\/p><\/blockquote>\n<p><\/p>\n<h3>Ilustracja obecnego stanu infrastruktury<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/a05ece39b6c6a9aaec4177d4b5242722.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Linki do zg\u0142\u0119biania tematu<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/martinfowler.com\/articles\/continuousIntegration.html\">Martin Fowler: Integracja ci\u0105g\u0142a<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/ci\/\">GitLab CI\/CD<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Integration-Improving-Software-Reducing\/dp\/0321336380\">Ksi\u0105\u017cka o integracji ci\u0105g\u0142ej<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Delivery-Deployment-Automation-Addison-Wesley-ebook-dp-B003YMNVC0\/dp\/B003YMNVC0\/ref=mt_kindle?_encoding=UTF8&amp;me=&amp;qid=\">Ksi\u0105\u017cka o dostarczaniu ci\u0105g\u0142ym<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Podobne narz\u0119dzia<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/jenkins.io\/\">Jenkins<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/teamcity\/\">TeamCity<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/travis-ci.com\/\">Travis<\/a><\/noindex>\u00a0<\/li>\n<li>I wiele innych<\/li>\n<\/ul>\n<p><\/p>\n<h2>5. Platformy chmurowe<\/h2>\n<p><\/p>\n<h3>Kr\u00f3tkie wprowadzenie do technologii<\/h3>\n<p>\n W tej sekcji om\u00f3wimy popularny trend zwany \u201echmurami publicznymi\u201d. Mimo ogromnych korzy\u015bci, jakie daj\u0105 opisane wcze\u015bniej technologie wirtualizacji i konteneryzacji, nadal potrzebujemy zasob\u00f3w obliczeniowych. Firmy kupuj\u0105 drogie serwery lub wynajmuj\u0105 centra danych, ale w takim przypadku konieczne jest przeprowadzenie oblicze\u0144 (czasami nierealistycznych) dotycz\u0105cych tego, ile zasob\u00f3w b\u0119dzie nam potrzebnych, czy b\u0119dziemy z nich korzysta\u0107 24\/7 i do jakich cel\u00f3w. Na przyk\u0142ad w produkcji potrzebny jest dzia\u0142aj\u0105cy przez ca\u0142\u0105 dob\u0119 serwer, ale czy potrzebujemy analogicznych zasob\u00f3w do testowania po godzinach pracy? Zale\u017cy to r\u00f3wnie\u017c od rodzaju wykonywanego testowania. Przyk\u0142adami mog\u0105 by\u0107 testy obci\u0105\u017ceniowe\/stresowe, kt\u00f3re planujemy przeprowadza\u0107 poza godzinami pracy, aby uzyska\u0107 wyniki na nast\u0119pny dzie\u0144. Jednak z pewno\u015bci\u0105 ca\u0142odobowa dost\u0119pno\u015b\u0107 serwer\u00f3w nie jest wymagana do test\u00f3w automatycznych end-to-end, a zw\u0142aszcza w przypadku \u015brodowisk testowych manualnych. W takich sytuacjach dobrze by\u0142oby otrzymywa\u0107 tyle zasob\u00f3w, ile potrzebujemy na \u017c\u0105danie, korzysta\u0107 z nich i przesta\u0107 p\u0142aci\u0107, gdy nie s\u0105 ju\u017c potrzebne. Co wi\u0119cej, by\u0142oby wspaniale otrzymywa\u0107 je natychmiast, wykonuj\u0105c kilka klikni\u0119\u0107 myszy lub uruchamiaj\u0105c kilka skrypt\u00f3w. I to w\u0142a\u015bnie do tego s\u0142u\u017c\u0105 chmury publiczne. Przyjrzyjmy si\u0119 definicji:<\/p>\n<blockquote><p>\u201eChmura publiczna definiowana jest jako us\u0142ugi obliczeniowe oferowane przez dostawc\u00f3w zewn\u0119trznych w Internecie publicznym, co czyni je dost\u0119pnymi dla ka\u017cdego, kto chce z nich korzysta\u0107 lub je kupi\u0107. Mog\u0105 by\u0107 bezp\u0142atne lub sprzedawane na \u017c\u0105danie, umo\u017cliwiaj\u0105c klientom p\u0142acenie tylko za u\u017cycie cykli CPU, przestrzeni dyskowej lub pasma, kt\u00f3re konsumuj\u0105\u201d.<\/p><\/blockquote>\n<p>\n Panuje przekonanie, \u017ce chmury publiczne s\u0105 drogie. Jednak ich kluczowym pomys\u0142em jest zmniejszenie wydatk\u00f3w firmy. Jak wspomniano wcze\u015bniej, chmury publiczne umo\u017cliwiaj\u0105 uzyskiwanie zasob\u00f3w na \u017c\u0105danie i p\u0142acenie tylko za czas ich wykorzystania. Czasami zapominamy r\u00f3wnie\u017c, \u017ce pracownicy otrzymuj\u0105 wynagrodzenie, a specjali\u015bci r\u00f3wnie\u017c s\u0105 drogim zasobem. Nale\u017cy mie\u0107 na uwadze, \u017ce chmury publiczne znacznie u\u0142atwiaj\u0105 utrzymanie infrastruktury, co pozwala in\u017cynierom skoncentrowa\u0107 si\u0119 na wa\u017cniejszych zadaniach.\u00a0<\/p>\n<h3>Warto\u015b\u0107 dla infrastruktury automatyzacji<\/h3>\n<p>\n Jakie konkretne zasoby s\u0105 nam potrzebne do test\u00f3w UI end-to-end? G\u0142\u00f3wnie s\u0105 to maszyny wirtualne lub klastry (om\u00f3wimy Kubernetes w nast\u0119pnej sekcji) do uruchamiania przegl\u0105darek i emulator\u00f3w. Im wi\u0119cej przegl\u0105darek i emulator\u00f3w chcemy uruchomi\u0107 jednocze\u015bnie, tym wi\u0119cej CPU i pami\u0119ci potrzebujemy, a tym samym wi\u0119cej pieni\u0119dzy b\u0119dziemy musieli za to zap\u0142aci\u0107. W ten spos\u00f3b publiczne chmury w kontek\u015bcie automatyzacji testowania pozwalaj\u0105 nam na uruchomienie du\u017cej liczby (100, 200, 1000\u2026) przegl\u0105darek\/emulator\u00f3w na \u017c\u0105danie, uzyskiwanie wynik\u00f3w test\u00f3w tak szybko, jak to mo\u017cliwe, i przestawanie p\u0142aci\u0107 za te szalenie kosztowne zasoby.\u00a0<\/p>\n<p>Najpopularniejszymi dostawcami chmury s\u0105 Amazon Web Services (AWS), Microsoft Azure, Google Cloud Platform (GCP). W praktycznym przewodniku przedstawione s\u0105 przyk\u0142ady u\u017cycia GCP, ale tak na dobr\u0105 spraw\u0119 to nie ma znaczenia, co dok\u0142adnie b\u0119dziesz u\u017cywa\u0107 do zada\u0144 automatyzacji. Wszyscy oni oferuj\u0105 mniej wi\u0119cej te same funkcje. Zazwyczaj wyb\u00f3r dostawcy koncentruje si\u0119 na ca\u0142ej infrastrukturze firmy i wymaganiach biznesowych, co wykracza poza zakres tego artyku\u0142u. In\u017cynierowie zajmuj\u0105cy si\u0119 automatyzacj\u0105 b\u0119d\u0105 bardziej zainteresowani por\u00f3wnaniem u\u017cycia dostawc\u00f3w chmury z platformami chmurowymi dedykowanymi konkretnie dla testowania, takimi jak Sauce Labs, BrowserStack, BitBar i tak dalej. Wi\u0119c zr\u00f3bmy to! Moim zdaniem Sauce Labs jest najbardziej znan\u0105 farm\u0105 do testowania w chmurze, wi\u0119c to j\u0105 wybra\u0142em do por\u00f3wnania.\u00a0<\/p>\n<p><u>GCP kontra Sauce Labs dla cel\u00f3w automatyzacji:<\/u><\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce musimy przeprowadzi\u0107 jednocze\u015bnie 8 test\u00f3w webowych i 8 test\u00f3w Android. W tym celu u\u017cyjemy GCP i uruchomimy 2 maszyny wirtualne z Selenoid. Na pierwszej uruchomimy 8 kontener\u00f3w z przegl\u0105darkami. Na drugiej \u2013 8 kontener\u00f3w z emulatorami. Sp\u00f3jrzmy na ceny:\u00a0\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/e4688fd2e6e5593d2e1c22fc57f59484.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Do uruchomienia jednego kontenera z Chrome b\u0119dziemy potrzebowa\u0107 <strong>n1-standard-1 <\/strong>maszyny. W przypadku Android to b\u0119dzie <strong>n1-standard-4 <\/strong>dla jednego emulatora. Tak naprawd\u0119 bardziej elastycznym i ta\u0144szym sposobem jest podanie konkretnych warto\u015bci u\u017cytkownika dla CPU\/Pami\u0119ci, ale w tej chwili dla por\u00f3wnania z Sauce Labs nie ma to znaczenia.<\/p>\n<p>A oto stawki za korzystanie z Sauce Labs:<\/p>\n<p><img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/1367d2b59bbef9603b4b4be166e8d721.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPrzypuszczam, \u017ce ju\u017c zauwa\u017cy\u0142e\u015b r\u00f3\u017cnic\u0119, ale i tak podam tabel\u0119 z obliczeniami dla naszego zadania:<\/p>\n<p><strong>Wymagane zasoby<\/strong><br \/>\n<strong>Miesi\u0119cznie<\/strong><br \/>\n<strong>Godziny pracy<\/strong><strong>(8:00 \u2014 20:00)<\/strong><br \/>\n<strong>Godziny pracy<\/strong><strong>+ Preemptible<\/strong><\/p>\n<p><strong>GCP dla Web<\/strong><br \/>\nn1-standard-1 x 8 = n1-standard-8<br \/>\n$194.18<br \/>\n23 dni * 12h * 0.38 = 104,88$\u00a0<br \/>\n23 dni * 12h * 0.08 = 22,08$<\/p>\n<p><strong>Sauce Labs dla Web<\/strong><br \/>\nWirtualne Cloud8 testy r\u00f3wnoleg\u0142e<br \/>\n$1.559<br \/>\n\u2014<br \/>\n\u2014<\/p>\n<p><strong>GCP dla Androida<\/strong><br \/>\nn1-standard-4 x 8: n1-standard-16<br \/>\n$776.72<br \/>\n23 dni * 12h * 1.52 = 419,52$\u00a0<br \/>\n23 dni * 12h * 0.32 = 88,32$<\/p>\n<p><strong>Sauce Labs dla Androida<\/strong><br \/>\nPrawdziwa chmura urz\u0105dze\u0144 8 test\u00f3w r\u00f3wnoleg\u0142ych<br \/>\n$1.999<br \/>\n\u2014<br \/>\n\u2014<\/p>\n<p>\nJak wida\u0107, r\u00f3\u017cnica w kosztach jest ogromna, zw\u0142aszcza je\u015bli uruchamiasz testy tylko w normalnym dwunastogodzinnym przedziale czasowym. Ale mo\u017cna jeszcze bardziej ograniczy\u0107 wydatki, korzystaj\u0105c z maszyn preemptible. Co to w\u0142a\u015bciwie jest?<\/p>\n<blockquote><p>Maszyna wirtualna preemptible to instancja, kt\u00f3r\u0105 mo\u017cesz utworzy\u0107 i uruchomi\u0107 w znacznie ni\u017cszej cenie ni\u017c normalne instancje. Jednak\u017ce, Compute Engine mo\u017ce zako\u0144czy\u0107 (przerwa\u0107) te instancje, je\u015bli potrzebuje dost\u0119pu do tych zasob\u00f3w dla innych zada\u0144. Instancje preemptible to nadmiar pojemno\u015bci Compute Engine, wi\u0119c ich dost\u0119pno\u015b\u0107 zmienia si\u0119 w zale\u017cno\u015bci od u\u017cycia.<\/p>\n<p>Je\u015bli Twoje aplikacje s\u0105 odporne na b\u0142\u0119dy i mog\u0105 znie\u015b\u0107 ewentualne przerwania instancji, to instancje preemptible mog\u0105 znacz\u0105co obni\u017cy\u0107 Twoje koszty Compute Engine. Na przyk\u0142ad, zadania przetwarzania wsadowego mog\u0105 by\u0107 uruchamiane na instancjach preemptible. Je\u015bli niekt\u00f3re z tych instancji zako\u0144cz\u0105 dzia\u0142anie podczas przetwarzania, zadanie spowolni, ale nie zatrzyma si\u0119 ca\u0142kowicie. Instancje preemptible realizuj\u0105 Twoje zadania przetwarzania wsadowego bez nak\u0142adania dodatkowego obci\u0105\u017cenia na istniej\u0105ce instancje i bez konieczno\u015bci p\u0142acenia pe\u0142nej ceny za dodatkowe normalne instancje.<\/p><\/blockquote>\n<p>\n I to jeszcze nie koniec! W rzeczywisto\u015bci jestem pewien, \u017ce nikt nie uruchamia test\u00f3w przez 12 godzin bez przerwy. A je\u015bli tak, to mo\u017cesz automatycznie uruchamia\u0107 i zatrzymywa\u0107 maszyny wirtualne, kiedy nie s\u0105 potrzebne. Rzeczywisty czas u\u017cytkowania mo\u017ce spa\u015b\u0107 do 6 godzin dziennie. Wtedy p\u0142atno\u015b\u0107 w kontek\u015bcie naszego zadania zmniejszy si\u0119 do 11$ miesi\u0119cznie za 8 przegl\u0105darek. Czy to nie wspania\u0142e? Ale z maszynami preemptible musimy by\u0107 ostro\u017cni i przygotowani na przerwy oraz niestabiln\u0105 prac\u0119, chocia\u017c te sytuacje mog\u0105 by\u0107 przewidziane i obs\u0142u\u017cone programowo. To warto!<\/p>\n<p>Ale w \u017cadnym wypadku nie m\u00f3wi\u0119 'nigdy nie u\u017cywaj chmurowych farm testowych'. Maj\u0105 one wiele zalet. Przede wszystkim to nie tylko maszyna wirtualna, ale kompleksowe rozwi\u0105zanie do automatyzacji testowania z zestawem funkcji 'z pude\u0142ka': zdalny dost\u0119p, logi, zrzuty ekranu, nagrania wideo, r\u00f3\u017cne przegl\u0105darki i fizyczne urz\u0105dzenia mobilne. W wielu sytuacjach mo\u017ce to by\u0107 niezast\u0105piona luksusowa alternatywa. Szczeg\u00f3lnie platformy testowe s\u0105 przydatne w automatyzacji IOS, gdy publiczne chmury mog\u0105 oferowa\u0107 jedynie systemy Linux\/Windows. Ale rozmowa o IOS b\u0119dzie w kolejnych artyku\u0142ach. Zawsze polecam oceni\u0107 sytuacj\u0119 i kierowa\u0107 si\u0119 potrzebami: w niekt\u00f3rych przypadkach korzystanie z publicznych chmur jest ta\u0144sze i bardziej efektywne, a w innych testowe platformy zdecydowanie s\u0105 warte wydanych pieni\u0119dzy.<\/p>\n<h3>Ilustracja obecnego stanu infrastruktury<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/f68770c9e27677b9d762af574726c90e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Linki do zg\u0142\u0119biania tematu<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/gcp\/\">GCP<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/docs\/instances\/preemptible\">GCP: Preemptible<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/vm-instance-pricing\">GCP: Cennik maszyn wirtualnych<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/saucelabs.com\/pricing\">SauceLabs<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.inovex.de\/blog\/comparing-cloud-providers\/\">Por\u00f3wnanie dostawc\u00f3w chmury<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Podobne narz\u0119dzia:<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/\">AWS<\/a><\/noindex>\u00a0<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/azure.microsoft.com\/en-us\/\">Azure<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2>6. Orkiestracja<\/h2>\n<p><\/p>\n<h3>Kr\u00f3tkie wprowadzenie do technologii<\/h3>\n<p>\n Mam dobre wie\u015bci \u2013 prawie zako\u0144czyli\u015bmy artyku\u0142! Nasza infrastruktura automatyzacji aktualnie sk\u0142ada si\u0119 z test\u00f3w webowych i aplikacji na Androida, kt\u00f3re uruchamiamy r\u00f3wnolegle za pomoc\u0105 GitLab CI, korzystaj\u0105c z narz\u0119dzi wspieraj\u0105cych Docker: Selenium grid i Selenoid. Co wi\u0119cej, wykorzystujemy wirtualne maszyny utworzone przez GCP do uruchamiania w nich kontener\u00f3w z przegl\u0105darkami i emulatorami. Aby zredukowa\u0107 koszty, uruchamiamy te wirtualne maszyny tylko na \u017c\u0105danie i zatrzymujemy je, gdy testy nie s\u0105 przeprowadzane. Czy jest co\u015b, co mo\u017ce jeszcze poprawi\u0107 nasz\u0105 infrastruktur\u0119? Odpowied\u017a brzmi: tak! Poznajmy Kubernetes (K8s)!<\/p>\n<p>Na pocz\u0105tek przyjrzyjmy si\u0119, jak s\u0142owa orkiestracja, klaster i Kubernetes s\u0105 ze sob\u0105 powi\u0105zane. Na wysokim poziomie orkiestracja to system, kt\u00f3ry wdra\u017ca i zarz\u0105dza aplikacjami. Dla automatyzacji testowania takimi aplikacjami kontenerowymi s\u0105 Selenium grid i Selenoid. Docker i K8s wzajemnie si\u0119 uzupe\u0142niaj\u0105. Docker u\u017cywany jest do wdra\u017cania aplikacji, natomiast K8s do orkiestracji. K8s z kolei jest klastrem. Zadaniem klastra jest wykorzystanie VM jako w\u0119z\u0142\u00f3w, co pozwala na instalowanie r\u00f3\u017cnych funkcji, program\u00f3w i us\u0142ug w ramach jednego serwera (klastra). Je\u015bli kt\u00f3rykolwiek z w\u0119z\u0142\u00f3w zawiedzie, inne w\u0119z\u0142y przejm\u0105 jego zadania, zapewniaj\u0105c naszemu zastosowaniu nieprzerwan\u0105 prac\u0119. Dodatkowo K8s posiada wa\u017cne funkcje zwi\u0105zane z skalowaniem, dzi\u0119ki czemu automatycznie otrzymujemy optymaln\u0105 ilo\u015b\u0107 zasob\u00f3w, w oparciu o obci\u0105\u017cenie i ustalone limity.<\/p>\n<p>Szczerze m\u00f3wi\u0105c, r\u0119czne uruchamianie Kubernetes od podstaw jest do\u015b\u0107 skomplikowane. Zostawi\u0119 link do znanego praktycznego przewodnika \"Kubernetes The Hard Way\", a je\u015bli jeste\u015b zainteresowany, mo\u017cesz spr\u00f3bowa\u0107. Na szcz\u0119\u015bcie istniej\u0105 alternatywne metody i narz\u0119dzia. Naj\u0142atwiejszym z nich jest korzystanie z Google Kubernetes Engine (GKE) w GCP, co pozwala na uzyskanie gotowego klastra po kilku klikni\u0119ciach. Na pocz\u0105tek polecam ten w\u0142a\u015bnie spos\u00f3b, poniewa\u017c pozwala skupi\u0107 si\u0119 na nauce, jak u\u017cywa\u0107 K8s do swoich zada\u0144, zamiast bada\u0107, jak wewn\u0119trzne komponenty musz\u0105 by\u0107 ze sob\u0105 zintegrowane.\u00a0<\/p>\n<h3>Warto\u015b\u0107 dla infrastruktury automatyzacji<\/h3>\n<p>\nRozwa\u017cmy kilka znacz\u0105cych funkcji, kt\u00f3re zapewnia K8s:<\/p>\n<ul>\n<li>wdro\u017ceniu aplikacji: wykorzystanie klastra multi-node, zamiast VM;<\/li>\n<li>dynamiczne skalowanie: redukuje koszty zasob\u00f3w, kt\u00f3re s\u0105 wykorzystywane tylko na \u017c\u0105danie;<\/li>\n<li>samonaprawa (Self-healing): automatyczne przywracanie pod\u00f3w (co w rezultacie przywraca r\u00f3wnie\u017c kontenery);<\/li>\n<li>wprowadzanie aktualizacji i cofni\u0119\u0107 zmian bez przestoj\u00f3w: aktualizacja narz\u0119dzi, przegl\u0105darek i emulator\u00f3w nie przerywa pracy bie\u017c\u0105cych u\u017cytkownik\u00f3w.<\/li>\n<\/ul>\n<p>\n Jednak K8s wci\u0105\u017c nie jest srebrn\u0105 kul\u0105. Aby zrozumie\u0107 wszystkie zalety i ograniczenia w kontek\u015bcie omawianych przez nas narz\u0119dzi (Selenium grid, Selenoid), kr\u00f3tko om\u00f3wimy struktur\u0119 K8s. Klaster zawiera dwa typy w\u0119z\u0142\u00f3w: W\u0119z\u0142y Master i W\u0119z\u0142y Robocze. W\u0119z\u0142y Master s\u0105 odpowiedzialne za zarz\u0105dzanie, wdra\u017canie i podejmowanie decyzji o harmonogramie. W\u0119z\u0142y robocze to miejsce, gdzie uruchamiane s\u0105 aplikacje. W\u0119z\u0142y zawieraj\u0105 r\u00f3wnie\u017c \u015brodowisko uruchomieniowe kontener\u00f3w. W naszym przypadku jest to Docker, kt\u00f3ry odpowiada za operacje zwi\u0105zane z kontenerami. Istniej\u0105 jednak r\u00f3wnie\u017c alternatywne rozwi\u0105zania, takie jak<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/containerd\/containerd\"> containerd<\/a><\/noindex>. Wa\u017cne jest, aby zrozumie\u0107, \u017ce skalowanie lub samonaprawa nie odnosi si\u0119 bezpo\u015brednio do kontener\u00f3w. Realizuje si\u0119 to poprzez dodawanie lub zmniejszanie liczby pod\u00f3w, kt\u00f3re z kolei zawieraj\u0105 kontenery (zwykle jeden kontener na pod, ale w zale\u017cno\u015bci od zadania mo\u017ce by\u0107 ich wi\u0119cej). Wysokopoziomowa hierarchia przedstawia w\u0119z\u0142y robocze, wewn\u0105trz kt\u00f3rych znajduj\u0105 si\u0119 pody, w kt\u00f3rych uruchamiane s\u0105 kontenery.<\/p>\n<p>Funkcja skalowania jest kluczowa i mo\u017ce by\u0107 stosowana zar\u00f3wno do nodes w puli w\u0119z\u0142\u00f3w klastra, jak i do pods w ramach w\u0119z\u0142a. Istniej\u0105 2 typy skalowania, kt\u00f3re odnosz\u0105 si\u0119 zar\u00f3wno do nodes, jak i pods. Pierwszy typ \u2013 poziome \u2013 polega na zwi\u0119kszeniu liczby nodes\/pods. Taki typ jest bardziej preferowany. Drugi typ, odpowiednio, pionowy. Skalowanie polega na zwi\u0119kszeniu rozmiar\u00f3w nodes\/pods, a nie ich ilo\u015bci.<\/p>\n<p>Teraz przyjrzyjmy si\u0119 naszym narz\u0119dziom w kontek\u015bcie wspomnianych termin\u00f3w.<\/p>\n<p><u>Selenium grid<\/u><\/p>\n<p>Jak wspomniano wcze\u015bniej, Selenium grid to bardzo popularne narz\u0119dzie, i nie jest zaskoczeniem, \u017ce zosta\u0142o ono skonteneryzowane. Dlatego nie dziwi fakt, \u017ce Selenium grid mo\u017cna wdro\u017cy\u0107 w K8s. Przyk\u0142ad, jak to zrobi\u0107, mo\u017cna znale\u017a\u0107 w oficjalnym repozytorium K8s. Jak zwykle, za\u0142\u0105czam linki na ko\u0144cu sekcji. W dodatku w praktycznym przewodniku pokazano, jak to zrobi\u0107 za pomoc\u0105 Terraform. Istnieje r\u00f3wnie\u017c instrukcja dotycz\u0105ca skalowania liczby pods, kt\u00f3re zawieraj\u0105 kontenery z przegl\u0105darkami. Jednak funkcja automatycznego skalowania w kontek\u015bcie K8s wci\u0105\u017c pozostaje nie do ko\u0144ca oczywistym zadaniem. Kiedy zaczyna\u0142em nauk\u0119, nie znalaz\u0142em \u017cadnego praktycznego przewodnika ani zalece\u0144. Po kilku badaniach i eksperymentach przy wsparciu zespo\u0142u DevOps wybrali\u015bmy podej\u015bcie do uruchamiania kontener\u00f3w z potrzebnymi przegl\u0105darkami wewn\u0105trz jednego pod, kt\u00f3ry znajduje si\u0119 w obr\u0119bie jednego w\u0119z\u0142a roboczego. Taki spos\u00f3b pozwala nam zastosowa\u0107 strategi\u0119 poziomego skalowania nodes poprzez zwi\u0119kszenie ich liczby. Mam nadziej\u0119, \u017ce w przysz\u0142o\u015bci sytuacja si\u0119 zmieni, a my zobaczymy coraz wi\u0119cej opis\u00f3w najlepszych podej\u015b\u0107 i gotowych rozwi\u0105za\u0144, szczeg\u00f3lnie po wydaniu Selenium grid 4 z zmienion\u0105 architektur\u0105 wewn\u0119trzn\u0105.<\/p>\n<p><u>Selenoid<\/u>:<\/p>\n<p>Obecnie wdro\u017cenie Selenoid w K8s jest najwi\u0119kszym rozczarowaniem. S\u0105 one niekompatybilne. Teoretycznie mo\u017cemy uruchomi\u0107 kontener Selenoid wewn\u0105trz pod, ale kiedy Selenoid zacznie uruchamia\u0107 kontenery z przegl\u0105darkami, one nadal b\u0119d\u0105 znajdowa\u0107 si\u0119 wewn\u0105trz tego samego pod. To uniemo\u017cliwia skalowanie i, w efekcie, dzia\u0142anie Selenoid w obr\u0119bie klastra nie b\u0119dzie r\u00f3\u017cni\u0142o si\u0119 od dzia\u0142ania w obr\u0119bie maszyny wirtualnej. Koniec historii.<\/p>\n<p><u>Moon<\/u>:<\/p>\n<p>Znaj\u0105c to w\u0105skie miejsce w pracy z Selenoid, programi\u015bci wydali pot\u0119\u017cniejsze narz\u0119dzie, kt\u00f3re nazwali Moon. Narz\u0119dzie to zosta\u0142o pierwotnie zaprojektowane do pracy z Kubernetes, co pozwala na korzystanie z funkcji automatycznego skalowania. Co wi\u0119cej, powiedzia\u0142bym, \u017ce obecnie jest to <u>jedyny<\/u> najlepsze narz\u0119dzie w \u015bwiecie Selenium, kt\u00f3re z pude\u0142ka ma natywn\u0105 obs\u0142ug\u0119 klastra K8s (<i>ju\u017c nie, zobacz nast\u0119pne narz\u0119dzie <\/i>). Kluczow\u0105 cech\u0105 Moon, kt\u00f3ra zapewnia t\u0119 obs\u0142ug\u0119, jest:\u00a0<\/p>\n<blockquote><p>Kompletnie bezstanowe. Selenoid przechowuje w pami\u0119ci informacje o aktualnie dzia\u0142aj\u0105cych sesjach przegl\u0105darki. Je\u015bli z jakiego\u015b powodu jego proces ulegnie awarii \u2014 wszystkie dzia\u0142aj\u0105ce sesje s\u0105 utracone. Moon przeciwnie, nie ma wewn\u0119trznego stanu, wi\u0119c mo\u017cna go replikowa\u0107 w r\u00f3\u017cnych centrach danych. Sesje przegl\u0105darki pozostaj\u0105 aktywne nawet je\u015bli jedna lub wi\u0119cej replik ulegnie awarii.<\/p><\/blockquote>\n<p>A wi\u0119c, Moon to doskona\u0142e rozwi\u0105zanie, ale z jedn\u0105 wad\u0105: nie jest darmowe. Cena zale\u017cy od liczby sesji. Mo\u017cna uruchomi\u0107 tylko 0-4 sesji za darmo, co nie jest zbyt u\u017cyteczne. Jednak od pi\u0105tej sesji trzeba zap\u0142aci\u0107 5$ za ka\u017cd\u0105 dodatkow\u0105. Sytuacja mo\u017ce si\u0119 r\u00f3\u017cni\u0107 w zale\u017cno\u015bci od firmy, ale w naszym przypadku korzystanie z Moon jest bez sensu. Jak opisa\u0142em wcze\u015bniej, mo\u017cemy uruchamia\u0107 VM-y z Selenium Grid na \u017c\u0105danie lub zwi\u0119ksza\u0107 liczb\u0119 w\u0119z\u0142\u00f3w w klastrze. Na jeden pipeline uruchamiamy oko\u0142o 500 przegl\u0105darek i zatrzymujemy wszystkie zasoby po zako\u0144czeniu test\u00f3w. Gdyby\u015bmy korzystali z Moon, musieliby\u015bmy zap\u0142aci\u0107 dodatkowe 500 x 5 = 2500 $ miesi\u0119cznie, niezale\u017cnie od tego, jak cz\u0119sto przeprowadzamy testy. I znowu, nie m\u00f3wi\u0119 \u201enie u\u017cywaj Moon\u201d. Mo\u017ce to by\u0107 niezast\u0105pione rozwi\u0105zanie w zale\u017cno\u015bci od Twoich potrzeb, na przyk\u0142ad je\u015bli w Twojej organizacji jest wiele projekt\u00f3w\/zesp\u00f3\u0142 i potrzebujesz ogromnego wsp\u00f3lnego klastra dla wszystkich. Jak zawsze, pozostawiam link na ko\u0144cu i zach\u0119cam do wykonania wszystkich niezb\u0119dnych oblicze\u0144 w kontek\u015bcie Twoich potrzeb.<\/p>\n<p><u>Callisto<\/u>: (<i><strong>Uwaga! To nie znajduje si\u0119 w oryginalnym artykule i jest zawarte tylko w t\u0142umaczeniu na j\u0119zyk rosyjski.<\/strong><\/i>)<\/p>\n<p>Jak ju\u017c m\u00f3wi\u0142em, Selenium to bardzo popularne narz\u0119dzie, a bran\u017ca IT rozwija si\u0119 w szybkim tempie. Podczas gdy pracowa\u0142em nad t\u0142umaczeniem, w sieci pojawi\u0142o si\u0119 nowe obiecuj\u0105ce narz\u0119dzie Callisto (czcij Cypress i innych zab\u00f3jc\u00f3w Selenium). Dzia\u0142a ono natywnie z K8s i pozwala uruchamia\u0107 kontenery Selenoid w pods, rozproszonych po Nodes. Wszystko dzia\u0142a od razu z pude\u0142ka, w\u0142\u0105cznie z automatycznym skalowaniem. Fantastyka, ale trzeba to przetestowa\u0107. Ju\u017c uda\u0142o mi si\u0119 uruchomi\u0107 to narz\u0119dzie i przeprowadzi\u0107 kilka eksperyment\u00f3w. Jednak zbyt wcze\u015bnie na wnioski, po uzyskaniu wynik\u00f3w na d\u0142u\u017cszym dystansie, by\u0107 mo\u017ce napisz\u0119 przegl\u0105d w nast\u0119pnych artyku\u0142ach. Na razie pozostawiam tylko linki do samodzielnych bada\u0144.\u00a0\u00a0<\/p>\n<h3>Ilustracja obecnego stanu infrastruktury<\/p>\n<h3><img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/c9c2ffd21df2a261947df809dcec7108.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Linki do zg\u0142\u0119biania tematu<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/setup\/\">Kubernetes: konfiguracja<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kelseyhightower\/kubernetes-the-hard-way\">Kubernetes: trudna droga<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/examples\/tree\/master\/staging\/selenium\">Kubernetes: Selenium<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/kubernetes-engine\">GCP: silnik Kubernetes<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/aerokube.com\/moon\/latest\/\">Moon<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Kubernetes-Book-Version-November-2018-ebook\/dp\/B072TS9ZQZ\/ref=pd_sim_351_1\/147-1129855-1615632?_encoding=UTF8&amp;pd_rd_i=B072TS9ZQZ&amp;pd_rd_r=489f0d27-dd2c-4e33-b23c-a420affcba5d&amp;pd_rd_w=HLjs5&amp;pd_rd_wg=eGbU7&amp;pf_rd_p=bab57536-7c8f-4781-a8ed-3e270b9cd303&amp;pf_rd_r=G71DN3V8127KHPXQ6JFN&amp;psc=1&amp;refRID=G71DN3V8127KHPXQ6JFN\">Ksi\u0105\u017cka o Kubernetes<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=MmdGyqNqs9w\">Zdalna automatyzacja z u\u017cyciem Kubernetes<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/SeleniumHQ\/selenium\/wiki\/Selenium-Grid-4\">Selenium Grid 4<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wrike\/callisto\">Callisto GitHub<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/software-testing.ru\/events\/review\/3317-wrike-techclub\">Wrike TechClub (Callisto)<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Podobne narz\u0119dzia<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/get-started\/swarm-deploy\/\">Docker swarm<\/a><\/noindex>\u00a0<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/mesosphere.github.io\/marathon\/\">Marathon<\/a><\/noindex>\u00a0<\/li>\n<\/ul>\n<p><\/p>\n<h2>7. Infrastruktura jako kod (IaC)<\/h2>\n<p><\/p>\n<h3>Kr\u00f3tkie wprowadzenie do technologii<\/h3>\n<p>\n I oto doszli\u015bmy do ostatniego rozdzia\u0142u. Zazwyczaj ta technologia i zwi\u0105zane z ni\u0105 zadania nie le\u017c\u0105 w zakresie odpowiedzialno\u015bci in\u017cynier\u00f3w automatyzacji. I s\u0105 ku temu swoje powody. Po pierwsze, w wielu organizacjach kwestie infrastrukturalne s\u0105 pod kontrol\u0105 dzia\u0142u DevOps, a zesp\u00f3\u0142 programistyczny nie przyk\u0142ada zbyt du\u017cej wagi do tego, dzi\u0119ki czemu dzia\u0142a pipeline i w jaki spos\u00f3b trzeba wspiera\u0107 wszystko, co z nim zwi\u0105zane. Po drugie, b\u0105d\u017amy szczerzy, praktyka \u201eInfrastruktura jako kod (IaC)\u201d wci\u0105\u017c nie jest stosowana w wielu firmach. Jednak z pewno\u015bci\u0105 sta\u0142a si\u0119 popularnym trendem i wa\u017cne jest, aby stara\u0107 si\u0119 uczestniczy\u0107 w zwi\u0105zanych z tym procesach, podej\u015bciach i narz\u0119dziach. Lub przynajmniej by\u0107 na bie\u017c\u0105co.<\/p>\n<p>Zacznijmy od motywacji do u\u017cycia tego podej\u015bcia. Ju\u017c om\u00f3wili\u015bmy, \u017ce do uruchomienia test\u00f3w w GitLab CI potrzebujemy przynajmniej zasob\u00f3w do uruchomienia GitLab Runnera. Aby uruchomi\u0107 kontenery z przegl\u0105darkami\/emulatorami, musimy zarezerwowa\u0107 VM lub klaster. Opr\u00f3cz zasob\u00f3w do testowania, potrzebujemy znacznej mocy do utrzymania \u015brodowisk rozwoju, stagingu i produkcji, co obejmuje r\u00f3wnie\u017c bazy danych, automatyczne harmonogramy, konfiguracje sieci, load balancer, uprawnienia u\u017cytkownik\u00f3w i tak dalej. Kluczowym problemem s\u0105 wysi\u0142ki wymagane do utrzymania tego wszystkiego. Istnieje kilka sposob\u00f3w, w jaki mo\u017cemy wprowadza\u0107 zmiany i wdra\u017ca\u0107 aktualizacje. Na przyk\u0142ad w kontek\u015bcie GCP mo\u017cemy u\u017cy\u0107 konsoli UI w przegl\u0105darce i wykona\u0107 wszystkie dzia\u0142ania, klikaj\u0105c przyciski. Alternatywnym sposobem mo\u017ce by\u0107 korzystanie z wywo\u0142a\u0144 API do interakcji z zasobami w chmurze lub u\u017cycie narz\u0119dzia wiersza polece\u0144 gcloud do wykonania potrzebnych manipulacji. Jednak przy naprawd\u0119 du\u017cej liczbie r\u00f3\u017cnych zasob\u00f3w i element\u00f3w infrastruktury staje si\u0119 trudno, a nawet niemo\u017cliwe, wykonywanie wszystkich operacji r\u0119cznie. Co wi\u0119cej, wszystkie te r\u0119czne dzia\u0142ania s\u0105 niekontrolowane. Nie mo\u017cemy ich wys\u0142a\u0107 do przegl\u0105du przed ich wykonaniem, u\u017cy\u0107 systemu kontroli wersji ani szybko cofn\u0105\u0107 poprawek, kt\u00f3re doprowadzi\u0142y do incydentu. Aby rozwi\u0105za\u0107 takie problemy, in\u017cynierowie tworzyli i tworz\u0105 automatyczne skrypty bash\/shell, co nie jest znacznie lepsze od poprzednich metod, poniewa\u017c nie s\u0105 tak \u0142atwe do szybkiego przeczytania, zrozumienia, utrzymania i modyfikacji w stylu proceduralnym.<\/p>\n<p>W tym artykule i praktycznym przewodniku korzystam z dw\u00f3ch narz\u0119dzi zwi\u0105zanych z praktykami IaC. S\u0105 to Terraform i Ansible. Niekt\u00f3rzy uwa\u017caj\u0105, \u017ce nie ma sensu u\u017cywa\u0107 ich jednocze\u015bnie, poniewa\u017c ich funkcjonalno\u015b\u0107 jest podobna i s\u0105 zamienne. Jednak chodzi o to, \u017ce pierwotnie postawiono przed nimi zupe\u0142nie r\u00f3\u017cne zadania. Fakt, \u017ce te narz\u0119dzia powinny si\u0119 uzupe\u0142nia\u0107, zosta\u0142 potwierdzony podczas wsp\u00f3lnej prezentacji deweloper\u00f3w reprezentuj\u0105cych firmy HashiCorp i RedHat. Zasadnicza r\u00f3\u017cnica polega na tym, \u017ce Terraform jest narz\u0119dziem provisioningowym do zarz\u0105dzania samymi serwerami. Z kolei Ansible jest narz\u0119dziem do zarz\u0105dzania konfiguracjami, kt\u00f3rego celem jest instalacja, konfiguracja i zarz\u0105dzanie oprogramowaniem na tych serwerach.<\/p>\n<p>Kolejn\u0105 kluczow\u0105 cech\u0105 odr\u00f3\u017cniaj\u0105c\u0105 te narz\u0119dzia jest styl pisania kodu. W przeciwie\u0144stwie do bash i Ansible, Terraform u\u017cywa deklaratywnego stylu, opartego na opisie po\u017c\u0105danego ko\u0144cowego stanu, kt\u00f3ry nale\u017cy osi\u0105gn\u0105\u0107 w wyniku wykonywania. Na przyk\u0142ad, je\u015bli zamierzamy stworzy\u0107 10 maszyn wirtualnych i zastosowa\u0107 zmiany za pomoc\u0105 Terraform, otrzymamy 10 maszyn wirtualnych. Je\u015bli zastosujemy skrypt ponownie, nic si\u0119 nie stanie, poniewa\u017c mamy ju\u017c 10 maszyn wirtualnych, a Terraform o tym wie, poniewa\u017c przechowuje obecny stan infrastruktury w pliku state. Natomiast Ansible stosuje podej\u015bcie proceduralne i, je\u015bli poprosimy go o stworzenie 10 maszyn wirtualnych, to przy pierwszym uruchomieniu otrzymamy 10 maszyn, podobnie jak w przypadku Terraform. Jednak po ponownym uruchomieniu b\u0119dziemy mie\u0107 ju\u017c 20 maszyn wirtualnych. To jest istotna r\u00f3\u017cnica. W stylu proceduralnym nie przechowujemy bie\u017c\u0105cego stanu i po prostu opisujemy sekwencj\u0119 krok\u00f3w, kt\u00f3re nale\u017cy wykona\u0107. Oczywi\u015bcie, mo\u017cemy obs\u0142u\u017cy\u0107 r\u00f3\u017cne sytuacje, doda\u0107 kilka sprawdze\u0144 istnienia zasob\u00f3w i bie\u017c\u0105cego stanu, ale nie ma sensu traci\u0107 czasu i wysi\u0142ku na kontrolowanie tej logiki. Poza tym zwi\u0119ksza to ryzyko pope\u0142nienia b\u0142\u0119d\u00f3w.\u00a0<\/p>\n<p>Podsumowuj\u0105c powy\u017csze, mo\u017cna stwierdzi\u0107, \u017ce do provisioning serwer\u00f3w bardziej odpowiednim narz\u0119dziem jest Terraform oraz notacja deklaratywna. Natomiast prace zwi\u0105zane z zarz\u0105dzaniem konfiguracjami lepiej zleci\u0107 Ansible. Rozumiej\u0105c to, przyjrzyjmy si\u0119 przyk\u0142adom zastosowania w kontek\u015bcie automatyzacji.<\/p>\n<h3>Warto\u015b\u0107 dla infrastruktury automatyzacji<\/h3>\n<p>\n Wa\u017cne jest, aby zrozumie\u0107, \u017ce infrastruktura automatyzacji testowania powinna by\u0107 traktowana jako cz\u0119\u015b\u0107 ca\u0142ej infrastruktury firmy. Oznacza to, \u017ce wszystkie praktyki IaC powinny by\u0107 stosowane globalnie do zasob\u00f3w ca\u0142ej organizacji. Kto jest za to odpowiedzialny, zale\u017cy od waszych proces\u00f3w. Zesp\u00f3\u0142 DevOps jest bardziej do\u015bwiadczony w tych kwestiach, dostrzegaj\u0105 pe\u0142en obraz sytuacji. Jednak in\u017cynierowie QA s\u0105 bardziej zaanga\u017cowani w proces budowy automatyzacji i struktury pipeline, co pozwala im lepiej zauwa\u017cy\u0107 wszystkie wymagane zmiany i mo\u017cliwo\u015bci poprawy. Najlepszym rozwi\u0105zaniem jest wsp\u00f3\u0142praca, wymiana wiedzy i pomys\u0142\u00f3w w celu osi\u0105gni\u0119cia oczekiwanego wyniku.\u00a0<\/p>\n<p>Podam kilka przyk\u0142ad\u00f3w u\u017cycia Terraform i Ansible w kontek\u015bcie automatyzacji testowania oraz narz\u0119dzi, kt\u00f3re omawiali\u015bmy wcze\u015bniej:<\/p>\n<p>1. Opisanie za pomoc\u0105 Terraform niezb\u0119dnych charakterystyk i parametr\u00f3w VM i klastr\u00f3w.<\/p>\n<p>2. Zainstalowanie za pomoc\u0105 Ansible niezb\u0119dnych narz\u0119dzi do testowania: docker, Selenoid, Selenium Grid oraz za\u0142adowanie potrzebnych wersji przegl\u0105darek\/emulator\u00f3w.<\/p>\n<p>3. Opisanie za pomoc\u0105 Terraform charakterystyk VM, na kt\u00f3rej zostanie uruchomiony GitLab Runner.<\/p>\n<p>4. Zainstalowanie za pomoc\u0105 Ansible GitLab Runnera i niezb\u0119dnych narz\u0119dzi towarzysz\u0105cych, ustawienie konfiguracji i ustawie\u0144.<\/p>\n<h3>Ilustracja obecnego stanu infrastruktury<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/5d793a800a4ef62e181e6cb3a3f0544e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Linki do nauki:<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/\">Terraform<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.ansible.com\/\">Ansible<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.hashicorp.com\/resources\/ansible-terraform-better-together\">Ansible i Terraform razem lepsze<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/blog.gruntwork.io\/a-comprehensive-guide-to-terraform-b3d32832baca\">Kompleksowy przewodnik po Terraformie<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/blog.gruntwork.io\/why-we-use-terraform-and-not-chef-puppet-ansible-saltstack-or-cloudformation-7989dad2865c\">Dlaczego u\u017cywamy Terraform zamiast Chefa, Pupa, Ansible, SaltStack lub CloudFormation<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/solutions\/infrastructure-as-code\">GCP: IaC<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Podobne narz\u0119dzia<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.chef.io\/\">Chef<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/\">Puppet<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/saltstack.com\/\">SaltStack<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.vagrantup.com\/\">Vagrant<\/a><\/noindex><\/li>\n<\/ul>\n<h2>Podsumujmy!<\/h2>\n<p><\/p>\n<p><strong>Krok<\/strong><br \/>\n<strong>Technologia<\/strong><br \/>\n<strong>Narz\u0119dzia<\/strong><br \/>\n<strong>Warto\u015b\u0107 dla infrastruktury automatyzacji<\/strong><\/p>\n<p><strong>1<\/strong><br \/>\nUruchamianie lokalne<br \/>\nNode.js, Selenium, Appium<\/p>\n<ul>\n<li>Najpopularniejsze narz\u0119dzia dla web i mobile<\/li>\n<li>Wsparcie dla wielu j\u0119zyk\u00f3w i platform (w tym Node.js)<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>2<\/strong><br \/>\nSystemy kontroli wersji\u00a0<br \/>\nGitem<\/p>\n<ul>\n<li>Podobne zalety z kodem rozwoju<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>3<\/strong><br \/>\nKonteneryzacja<br \/>\nDocker, Selenium grid, Selenoid (Web, Android)<\/p>\n<ul>\n<li>R\u00f3wnoleg\u0142e uruchamianie test\u00f3w<\/li>\n<li>Izolowane \u015brodowiska<\/li>\n<li>\u0141atwe, elastyczne aktualizacje wersji<\/li>\n<li>Dynamiczne zatrzymywanie nieu\u017cywanych zasob\u00f3w<\/li>\n<li>\u0141atwe w konfiguracji<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>4<\/strong><br \/>\nCI \/ CD<br \/>\nGitlab CI<\/p>\n<ul>\n<li>Testy cz\u0119\u015bci\u0105 pipeline<\/li>\n<li>Szybka informacja zwrotna<\/li>\n<li>Widoczno\u015b\u0107 dla ca\u0142ej firmy \/ zespo\u0142u<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>5<\/strong><br \/>\nPlatformy chmurowe<br \/>\nGoogle Cloud Platform<\/p>\n<ul>\n<li>Zasoby na \u017c\u0105danie (p\u0142acimy tylko wtedy, gdy s\u0105 potrzebne)<\/li>\n<li>\u0141atwe w zarz\u0105dzaniu i aktualizacji<\/li>\n<li>Widoczno\u015b\u0107 i kontrola wszystkich zasob\u00f3w<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>6<\/strong><br \/>\nOrkiestracja<br \/>\nKubernetes<br \/>\nW kontek\u015bcie kontener\u00f3w z przegl\u0105darkami\/emulatorami wewn\u0105trz pods:<\/p>\n<ul>\n<li>Skalowanie \/ automatyczne skalowanie<\/li>\n<li>Autonaprawa<\/li>\n<li>Aktualizacje i rollbacki bez przerwy<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>7<\/strong><br \/>\nInfrastruktura jako kod (IaC)<br \/>\nTerraform, Ansible<\/p>\n<ul>\n<li>Podobne zalety z infrastruktur\u0105 dewelopersk\u0105<\/li>\n<li>Wszystkie zalety wersjonowania kodu<\/li>\n<li>\u0141atwe wprowadzanie zmian i utrzymanie<\/li>\n<li>Ca\u0142kowicie zautomatyzowane<\/li>\n<\/ul>\n<p><\/p>\n<h2>Diagramy map my\u015bli: ewolucja infrastruktury<\/h2>\n<p>\nkrok 1: Lokalny<br \/>\n<img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/507908ba097a603adc3b301ab2f94a8d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>krok 2: VCS<br \/>\n<img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/71c5170293d98375d8ab86d05eb47a33.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>krok 3: Konteneryzacja\u00a0<br \/>\n<img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/da33442a592851e07c3f5800c3ee9ead.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>krok 4: CI\/CD\u00a0<br \/>\n<img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/900f18b45124412a1ad00d3901efb40e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>krok 5: Platformy chmurowe<br \/>\n<img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/840e5063141ac8787612e2fc46b5d690.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>krok 6: Orkiestracja<br \/>\n<img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/4651b552efdc893695cbf359c6992e9e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>krok 7: IaC<br \/>\n<img decoding=\"async\" alt=\"Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji testowania od podstaw\" src=\"\/wp-content\/uploads\/2020\/04\/e784130f570260fc6c3aa263916e3db5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Co dalej?<\/h2>\n<p>\nI tak, to koniec artyku\u0142u. Na zako\u0144czenie chcia\u0142bym ustali\u0107 pewne ustalenia z wami.<\/p>\n<p><u>Z waszej strony<\/u><br \/>\n Jak wspomniano na pocz\u0105tku, chcia\u0142bym, aby artyku\u0142 mia\u0142 praktyczne znaczenie i pom\u00f3g\u0142 wam zastosowa\u0107 zdobyt\u0105 wiedz\u0119 w rzeczywistej pracy. Dodaj\u0119 jeszcze raz<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeyAltunin\/devops-tools-for-qa-automation-infrastructure\"> link do przewodnika praktycznego<\/a><\/noindex>.<\/p>\n<p>Jednak nawet po tym nie zatrzymujcie si\u0119, \u0107wiczcie, studiujcie odpowiednie linki i ksi\u0105\u017cki, dowiedzcie si\u0119, jak to dzia\u0142a w waszej firmie, znajd\u017acie miejsca, kt\u00f3re mo\u017cna poprawi\u0107, i bierzcie w tym udzia\u0142. Powodzenia!<\/p>\n<p><u>Z mojej strony<\/u><\/p>\n<p>Z tytu\u0142u wynika, \u017ce to by\u0142a tylko pierwsza cz\u0119\u015b\u0107. Pomimo tego, \u017ce by\u0142a do\u015b\u0107 obszerna, nadal nie om\u00f3wiono wa\u017cnych temat\u00f3w. W drugiej cz\u0119\u015bci planuj\u0119 om\u00f3wi\u0107 infrastruktur\u0119 automatyzacji w kontek\u015bcie IOS. Z powodu ogranicze\u0144 Apple dotycz\u0105cych uruchamiania symulator\u00f3w IOS tylko na systemach macOS, nasze rozwi\u0105zania s\u0105 ograniczone. Na przyk\u0142ad, nie mamy mo\u017cliwo\u015bci korzystania z Dockera do uruchamiania symulatora ani z publicznych chmur do uruchamiania maszyn wirtualnych. Ale to nie oznacza, \u017ce nie ma innych alternatyw. Postaram si\u0119 trzyma\u0107 was na bie\u017c\u0105co z nowoczesnymi rozwi\u0105zaniami i narz\u0119dziami!<\/p>\n<p>R\u00f3wnie\u017c nie wspomnia\u0142em o do\u015b\u0107 du\u017cych tematach zwi\u0105zanych z monitorowaniem. W cz\u0119\u015bci 3 zamierzam om\u00f3wi\u0107 najpopularniejsze narz\u0119dzia do monitorowania infrastruktury oraz jakie dane i metryki warto wzi\u0105\u0107 pod uwag\u0119.<\/p>\n<p>I na koniec. W przysz\u0142o\u015bci planuj\u0119 wyda\u0107 kurs wideo na temat budowy testowej infrastruktury i popularnych narz\u0119dzi. Obecnie w internecie jest wiele kurs\u00f3w i wyk\u0142ad\u00f3w na temat DevOps, ale wszystkie materia\u0142y s\u0105 zwi\u0105zane z rozwojem, a nie z automatyzacj\u0105 testowania. W tej sprawie potrzebuj\u0119 bardzo waszej opinii, czy taki kurs by\u0142by interesuj\u0105cy i warto\u015bciowy dla spo\u0142eczno\u015bci tester\u00f3w i automatyk\u00f3w. Z g\u00f3ry dzi\u0119kuj\u0119!<\/h3>\n<\/h3>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497918\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0427\u0430\u0441\u0442\u044c 1: Web \/ Android \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438\u00a0\u00abDevOps tools are not only for DevOps. Building test automation infrastructure from scratch\u00bb. \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u0441\u0435 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u0441\u0441\u044b\u043b\u043a\u0438, \u0446\u0438\u0442\u0430\u0442\u044b \u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043c\u044b\u0441\u043b\u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a. \u0416\u0435\u043b\u0430\u044e \u0432\u0430\u043c \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f! \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":78677,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-78676","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0427\u0430\u0441\u0442\u044c 1: Web \/ Android \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47DevOps \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f DevOps. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043d\u0443\u043b\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0427\u0430\u0441\u0442\u044c 1: Web \/ Android \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-21T05:42:22+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-21T05:42:22+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Narz\u0119dzia DevOps nie tylko dla DevOps. Proces budowy infrastruktury automatyzacji test\u00f3w od zera | ProHoster","description":"Cz\u0119\u015b\u0107 1: Web \/ Android Uwaga: ten artyku\u0142 jest t\u0142umaczeniem oryginalnego artyku\u0142u na j\u0119zyk polski","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47DevOps \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f DevOps. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043d\u0443\u043b\u044f | ProHoster","og:description":"\u0427\u0430\u0441\u0442\u044c 1: Web \/ Android \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-21T05:42:22+00:00","article:modified_time":"2020-04-21T05:42:22+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"78676","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:53:59","updated":"2022-10-05 06:14:03","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/78676","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=78676"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/78676\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/78677"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=78676"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=78676"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=78676"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}