{"id":32526,"date":"2019-10-31T21:47:32","date_gmt":"2019-10-31T18:47:32","guid":{"rendered":"https:\/\/prohoster.info\/blog\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci\/"},"modified":"2019-10-31T21:47:32","modified_gmt":"2019-10-31T18:47:32","slug":"protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci","title":{"rendered":"Proces v\u00fdvoja a testovania s Docker a Gitlab CI","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Odpor\u00fa\u010dam obozn\u00e1mi\u0165 sa s prepisom spr\u00e1vy Alexandra Sigacheva z Inventos \u201eProces v\u00fdvoja a testovania s Docker + Gitlab CI\u201c<\/strong><\/p>\n<p><\/p>\n<p>T\u00ed, ktor\u00ed pr\u00e1ve za\u010d\u00ednaj\u00fa s implement\u00e1ciou procesu v\u00fdvoja a testovania zalo\u017een\u00e9ho na Docker + Gitlab CI, sa \u010dasto p\u00fdtaj\u00fa na z\u00e1kladn\u00e9 ot\u00e1zky. Odkia\u013e za\u010da\u0165? Ako organizova\u0165? Ako testova\u0165?<\/p>\n<p><\/p>\n<p>T\u00e1to prezent\u00e1cia je dobr\u00e1 t\u00fdm, \u017ee \u0161trukt\u00farovane opisuje proces v\u00fdvoja a testovania s vyu\u017eit\u00edm Docker a Gitlab CI. Samotn\u00e1 prezent\u00e1cia je z roku 2017. Mysl\u00edm, \u017ee z tejto prezent\u00e1cie sa daj\u00fa na\u010derpa\u0165 z\u00e1klady, metodol\u00f3gia, my\u0161lienky a sk\u00fasenosti. <\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"lJsqRwULRVA\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/lJsqRwULRVA\/hqdefault.jpg\" alt=\"Prehrajte video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Kto m\u00e1 z\u00e1ujem, pros\u00edm, pod kat. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<p>Vol\u00e1m sa Alexander Sigachev. Pracujem v spolo\u010dnosti Inventos. Povieme si o mojich sk\u00fasenostiach s Dockerom a o tom, ako ho postupne implementujeme do projektov v spolo\u010dnosti.<\/p>\n<p><\/p>\n<p>T\u00e9ma prezent\u00e1cie: Proces v\u00fdvoja s vyu\u017eit\u00edm Docker a Gitlab CI. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/e30c4757e4bda1bcc3e20b16e8e2709e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Toto je moja druh\u00e1 prezent\u00e1cia o Dockeri. V \u010dase prvej prezent\u00e1cie sme Docker pou\u017e\u00edvali len v prostred\u00ed v\u00fdvoja na po\u010d\u00edta\u010doch v\u00fdvoj\u00e1rov. Po\u010det zamestnancov, ktor\u00ed pou\u017e\u00edvali Docker, bol pribli\u017ene 2-3 osoby. Postupne sme z\u00edskali sk\u00fasenosti a posunuli sa \u010falej. Odkaz na na\u0161u <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/gled\/docker-development-70411088\">prv\u00fa prezent\u00e1ciu<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>\u010co bude v tejto prezent\u00e1cii? Podel\u00edme sa o na\u0161u sk\u00fasenos\u0165, ak\u00e9 prek\u00e1\u017eky sme nazbierali, ak\u00e9 probl\u00e9my sme ako vyrie\u0161ili. Nie v\u0161etko bolo elegantn\u00e9, ale umo\u017enilo n\u00e1m to posun\u00fa\u0165 sa \u010falej.<\/p>\n<p><\/p>\n<p>Na\u0161e motto: dockerizuj v\u0161etko, \u010do n\u00e1m pr\u00edde pod ruky.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/25ae4f97f1c502384abfe697bac502b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak\u00e9 probl\u00e9my rie\u0161ime?<\/p>\n<p><\/p>\n<p>Ke\u010f je v spolo\u010dnosti nieko\u013eko t\u00edmov, program\u00e1tor je zdie\u013ean\u00fdm zdrojom. S\u00fa f\u00e1zy, ke\u010f program\u00e1tora vytiahnu z jedn\u00e9ho projektu a poskytn\u00fa ho na ur\u010dit\u00fd \u010das do in\u00e9ho projektu.<\/p>\n<p><\/p>\n<p>Aby sa program\u00e1tor r\u00fdchlo zapracoval, je potrebn\u00e9, aby si stiahol zdrojov\u00fd k\u00f3d projektu a \u010do najr\u00fdchlej\u0161ie spustil prostredie, ktor\u00e9 mu umo\u017en\u00ed \u010falej pracova\u0165 na \u00faloh\u00e1ch tohto projektu.<\/p>\n<p><\/p>\n<p>Zvy\u010dajne, ak sa za\u010d\u00edna od nuly, tak dokument\u00e1cia v projekte je zanedban\u00e1. Inform\u00e1cie o tom, ako nastavi\u0165, maj\u00fa len star\u00ed zamestnanci. Zamestnanci si samostatne nastavuj\u00fa svoje pracovn\u00e9 prostredie za jeden-dva dni. Aby sa to ur\u00fdchlilo, sme pou\u017eili Docker.<\/p>\n<p><\/p>\n<p>\u010eal\u0161\u00ed d\u00f4vod \u2014 to je \u0161tandardiz\u00e1cia nastaven\u00ed v prostred\u00ed v\u00fdvoja. Pod\u013ea mojich sk\u00fasenost\u00ed, v\u00fdvoj\u00e1ri v\u017edy prejavuj\u00fa iniciat\u00edvu. V ka\u017edom piatom pr\u00edpade sa zav\u00e1dza vlastn\u00e1 dom\u00e9na, napr\u00edklad vasya.dev. Ved\u013ea sed\u00ed sused Petya, ktor\u00fd m\u00e1 dom\u00e9nu petya.dev. Spolo\u010dne vyv\u00edjaj\u00fa webov\u00fa str\u00e1nku alebo nejak\u00fa s\u00fa\u010das\u0165 syst\u00e9mu, pou\u017e\u00edvaj\u00fac tieto dom\u00e9ny.<\/p>\n<p><\/p>\n<p>Ke\u010f sa syst\u00e9m rozrast\u00e1 a tieto dom\u00e9nov\u00e9 men\u00e1 za\u010d\u00ednaj\u00fa prenikn\u00fa\u0165 do konfigur\u00e1ci\u00ed, vznik\u00e1 konflikt v\u00fdvojov\u00fdch prostred\u00ed a cesta k webovej lokalite sa prep\u00ed\u0161e.<\/p>\n<p><\/p>\n<p>To ist\u00e9 sa deje s nastaveniami datab\u00e1zy. Niekto sa nezaober\u00e1 bezpe\u010dnos\u0165ou a pracuje s pr\u00e1zdnym heslom root. Niekto in\u00fd na f\u00e1ze in\u0161tal\u00e1cie MySQL vy\u017eaduje heslo, a to sa uk\u00e1\u017ee ako 123. \u010casto sa st\u00e1va, \u017ee konfigur\u00e1cia datab\u00e1zy sa neust\u00e1le menila v z\u00e1vislosti od commitov v\u00fdvoj\u00e1ra. Niekto opravil, niekto neopravoval konfigur\u00e1ciu. Boli finty, ke\u010f sme pres\u00favali nejak\u00fa testovaciu konfigur\u00e1ciu do <code>.gitignore<\/code> a ka\u017ed\u00fd v\u00fdvoj\u00e1r musel nain\u0161talova\u0165 datab\u00e1zu. To s\u0165a\u017eovalo proces spustenia. Okrem v\u0161etk\u00e9ho treba pam\u00e4ta\u0165 aj na datab\u00e1zu. Datab\u00e1zu treba inicializova\u0165, zap\u00edsa\u0165 heslo, definova\u0165 pou\u017e\u00edvate\u013ea, vytvori\u0165 tabu\u013eku a tak \u010falej.<\/p>\n<p><\/p>\n<p>\u010eal\u0161\u00ed probl\u00e9m \u2014 to s\u00fa r\u00f4zne verzie kni\u017en\u00edc. \u010casto sa st\u00e1va, \u017ee v\u00fdvoj\u00e1r pracuje na r\u00f4znych projektoch. Existuje Legacy projekt, ktor\u00fd sa za\u010d\u00ednal pred piatimi rokmi (od roku 2017 \u2014 pozn. red.). Pri rozbehu sme za\u010d\u00ednali s MySQL 5.5. Existuj\u00fa aj modern\u00e9 projekty, kde sa sna\u017e\u00edme zav\u00e1dza\u0165 u\u017e modernej\u0161ie verzie MySQL, napr\u00edklad 5.7 alebo nov\u0161ie (v roku 2017 \u2014 pozn. red.)<\/p>\n<p><\/p>\n<p>Ten, kto pracuje s MySQL, vie, \u017ee tieto kni\u017enice so sebou \u0165ahaj\u00fa z\u00e1vislosti. Dos\u0165 problematick\u00e9 je spusti\u0165 2 datab\u00e1zy s\u00fa\u010dasne. Aspo\u0148 star\u00fdch klientov je \u0165a\u017ek\u00e9 pripoji\u0165 k novej datab\u00e1ze. To vn\u00e1\u0161a do procesu nieko\u013eko probl\u00e9mov.<\/p>\n<p><\/p>\n<p>\u010eal\u0161\u00ed probl\u00e9m nast\u00e1va, ke\u010f v\u00fdvoj\u00e1r pracuje na lok\u00e1lnom stroji, pou\u017e\u00edva lok\u00e1lne zdroje, lok\u00e1lne s\u00fabory, lok\u00e1lnu RAM. V\u0161etka interakcia po\u010das v\u00fdvoja rie\u0161en\u00ed prebieha v r\u00e1mci toho, \u010do funguje na jednom stroji. Pr\u00edkladom m\u00f4\u017ee by\u0165 situ\u00e1cia, ke\u010f m\u00e1me v produkcii 3 backendov\u00e9 servery, a v\u00fdvoj\u00e1r uklad\u00e1 s\u00fabory do kore\u0148ov\u00e9ho adres\u00e1ra, odkia\u013e nginx na\u010d\u00edtava s\u00fabory na odpove\u010f na po\u017eiadavku. Ke\u010f sa tak\u00fdto k\u00f3d dostane do produkcie, zist\u00ed sa, \u017ee s\u00fabor je pr\u00edtomn\u00fd na jednom z 3 serverov.<\/p>\n<p><\/p>\n<p>V s\u00fa\u010dasnosti sa rozv\u00edja smer mikroslu\u017eieb. Ke\u010f rozdel\u00edme na\u0161e ve\u013ek\u00e9 aplik\u00e1cie na men\u0161ie komponenty, ktor\u00e9 medzi sebou vz\u00e1jomne komunikuj\u00fa. To umo\u017e\u0148uje vybra\u0165 technol\u00f3gie pre konkr\u00e9tny s\u00fabor \u00faloh. Takisto to umo\u017e\u0148uje rozdeli\u0165 pr\u00e1cu a z\u00f3nu zodpovednosti medzi v\u00fdvoj\u00e1rov.<\/p>\n<p><\/p>\n<p>Frontend v\u00fdvoj\u00e1r, ktor\u00fd vyv\u00edja na JS, prakticky nem\u00e1 vplyv na backend. Backend v\u00fdvoj\u00e1r na druhej strane vyv\u00edja, v na\u0161om pr\u00edpade, Ruby on Rails a neprek\u00e1\u017ea frontend. Interakcia prebieha pomocou API.<\/p>\n<p><\/p>\n<p>Ako bonus, pomocou Dockeru sa n\u00e1m podarilo optimalizova\u0165 zdroje na stagingu. Ka\u017ed\u00fd projekt vzh\u013eadom na svoju \u0161pecifiku vy\u017eadoval ur\u010dit\u00e9 nastavenia. Fyzicky bolo potrebn\u00e9 vy\u010dleni\u0165 bu\u010f virtu\u00e1lny server a samostatne ich nastavi\u0165, alebo rozde\u013eova\u0165 nejak\u00e9 premenliv\u00e9 prostredie, pri\u010dom projekty mohli v z\u00e1vislosti od verzi\u00ed kni\u017en\u00edc ovplyv\u0148ova\u0165 navz\u00e1jom.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/fa5c99f90faef84a356d4791fd915830.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e1stroje. \u010co pou\u017e\u00edvame? <\/p>\n<p><\/p>\n<ul>\n<li>Pr\u00edmo samotn\u00fd Docker. V Dockerfile s\u00fa pop\u00edsan\u00e9 z\u00e1vislosti jednej aplik\u00e1cie. <\/li>\n<li>Docker-compose \u2014 je to zoskupenie, ktor\u00e9 sp\u00e1ja nieko\u013eko na\u0161ich Docker aplik\u00e1ci\u00ed.<\/li>\n<li>GitLab pou\u017e\u00edvame na ukladanie zdrojov\u00e9ho k\u00f3du.<\/li>\n<li>GitLab-CI pou\u017e\u00edvame na syst\u00e9mov\u00fa integr\u00e1ciu.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/b6041827a6ba928e0d33add6b79c581c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prezent\u00e1cia sa sklad\u00e1 z dvoch \u010dast\u00ed.<\/p>\n<p><\/p>\n<p>Prv\u00e1 \u010das\u0165 sa zameriava na to, ako sme sp\u00fa\u0161\u0165ali Docker na strojoch v\u00fdvoj\u00e1rov.<\/p>\n<p><\/p>\n<p>Druh\u00e1 \u010das\u0165 sa zameriava na to, ako interagova\u0165 s GitLabom, ako sp\u00fa\u0161\u0165ame testy a ako nasadzujeme na staging.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/45746d3323d35e0d18f066c8bfcb2214.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Docker je technol\u00f3gia, ktor\u00e1 umo\u017e\u0148uje (pou\u017e\u00edvaj\u00fac deklarat\u00edvny pr\u00edstup) op\u00edsa\u0165 potrebn\u00e9 komponenty. To je pr\u00edklad Dockerfile. Tu oznamujeme, \u017ee ded\u00edme z ofici\u00e1lneho Docker obrazu Ruby:2.3.0. Obsahuje nain\u0161talovan\u00fd Ruby verzie 2.3. In\u0161talujeme potrebn\u00e9 kni\u017enice na zostavenie a NodeJS. Ozn\u00e1mime, \u017ee vytv\u00e1rame adres\u00e1r <code>\/app<\/code>. Ur\u010dujeme adres\u00e1r app ako pracovn\u00fd adres\u00e1r. Do tohto adres\u00e1ra umiest\u0148ujeme potrebn\u00fd minim\u00e1lny Gemfile a Gemfile.lock. Potom vykon\u00e1me zostavenie projektov, ktor\u00e9 in\u0161taluj\u00fa z\u00e1vislosti tohto obrazu. Uv\u00e1dzame, \u017ee kontajner bude pripraven\u00fd po\u010d\u00fava\u0165 na externom porte 3000. Posledn\u00fd pr\u00edkaz je ten, ktor\u00fd priamo sp\u00fa\u0161\u0165a na\u0161u aplik\u00e1ciu. Ak vykon\u00e1me pr\u00edkaz na spustenie projektu, aplik\u00e1cia sa pok\u00fasi vykona\u0165 a sp\u00fa\u0161\u0165a uveden\u00fd pr\u00edkaz.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/ba503c305ae90f49b39f4ae2cbda1668.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Toto je minim\u00e1lny pr\u00edklad s\u00faboru docker-compose. V tomto pr\u00edpade ukazujeme, ako s\u00fa prepojen\u00e9 dva kontajnery. Ide o slu\u017ebu datab\u00e1zy a webov\u00fa slu\u017ebu. Na\u0161e webov\u00e9 aplik\u00e1cie v drvivej v\u00e4\u010d\u0161ine pr\u00edpadov vy\u017eaduj\u00fa na ukladanie \u00fadajov nejak\u00fa datab\u00e1zu ako backend. Ke\u010f\u017ee pou\u017e\u00edvame MySQL, pou\u017eijeme pr\u00edklad s MySQL \u2014 ni\u010d v\u0161ak nebr\u00e1ni pou\u017eitiu inej datab\u00e1zy (PostgreSQL, Redis).<\/p>\n<p><\/p>\n<p>S\u0165ahujeme ofici\u00e1lny obraz MySQL 5.7.14 bez zmien z Docker hub. Obraz, ktor\u00fd zodpoved\u00e1 na\u0161ej webovej aplik\u00e1cii, zostavujeme z aktu\u00e1lneho adres\u00e1ra. Pri prvom spusten\u00ed n\u00e1m zostav\u00ed obraz. Potom spust\u00ed pr\u00edkaz, ktor\u00fd tu vykon\u00e1vame. Ak sa vr\u00e1time sp\u00e4\u0165, uvid\u00edme, \u017ee bola ur\u010den\u00e1 pr\u00edkaz na spustenie cez Puma. Puma je slu\u017eba nap\u00edsan\u00e1 v Ruby. V druhom pr\u00edpade prepisujeme. Tento pr\u00edkaz m\u00f4\u017ee by\u0165 ak\u00fdko\u013evek v z\u00e1vislosti od na\u0161ich potrieb alebo \u00faloh.<\/p>\n<p><\/p>\n<p>Tie\u017e popisujeme, \u017ee je potrebn\u00e9 prenies\u0165 port z na\u0161ej hostite\u013eskej ma\u0161iny, v\u00fdvojov\u00e9ho stroja, z portu 3000 na port 3000 kontajnera. To sa vykon\u00e1va automaticky pomocou iptables a jeho mechanizmu, ktor\u00fd je priamo zabudovan\u00fd v Dockeri. <\/p>\n<p><\/p>\n<p>V\u00fdvoj\u00e1r sa m\u00f4\u017ee rovnako ako predt\u00fdm obr\u00e1ti\u0165 na ak\u00fako\u013evek dostupn\u00fa IP adresu, napr\u00edklad 127.0.0.1, miestnu alebo extern\u00fa IP adresu stroja.<\/p>\n<p><\/p>\n<p>Posledn\u00fd riadok hovor\u00ed, \u017ee kontajner web z\u00e1vis\u00ed od kontajnera db. Ke\u010f sp\u00fa\u0161\u0165ame kontajner web, predt\u00fdm docker-compose spust\u00ed na\u0161u datab\u00e1zu. Po na\u0161tartovan\u00ed datab\u00e1zy (v skuto\u010dnosti \u2014 po spusten\u00ed kontajnera! Pripravenos\u0165 DB to nezaru\u010duje) sa spust\u00ed na\u0161a aplik\u00e1cia, n\u00e1\u0161 backend.<\/p>\n<p><\/p>\n<p>To umo\u017e\u0148uje vyhn\u00fa\u0165 sa chyb\u00e1m, ke\u010f datab\u00e1za nie je spusten\u00e1, a \u0161etr\u00ed zdroje, ke\u010f zastavujeme kontajner datab\u00e1zy, \u010d\u00edm uvo\u013e\u0148ujeme tieto prostriedky pre in\u00e9 projekty. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/4acbcf5de89b98db055e8abc419202de.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u010co n\u00e1m d\u00e1va pou\u017e\u00edvanie dockeriz\u00e1cie datab\u00e1zy v projekte. U v\u0161etk\u00fdch v\u00fdvoj\u00e1rov fixujeme verziu MySQL. To pom\u00e1ha predch\u00e1dza\u0165 niektor\u00fdm chyb\u00e1m, ktor\u00e9 m\u00f4\u017eu vznikn\u00fa\u0165 pri nes\u00falade verzi\u00ed, ke\u010f sa men\u00ed syntax, konfigur\u00e1cia, predvolen\u00e9 nastavenia. Umo\u017e\u0148uje n\u00e1m ur\u010di\u0165 spolo\u010dn\u00e9 hostname pre datab\u00e1zu, prihlasovacie meno a heslo. Odch\u00e1dzame od toho zverinca mien a konfliktov v konfigura\u010dn\u00fdch s\u00faboroch, ktor\u00e9 boli predt\u00fdm. <\/p>\n<p><\/p>\n<p>M\u00e1me mo\u017enos\u0165 pou\u017e\u00edva\u0165 optim\u00e1lnej\u0161iu konfigur\u00e1ciu pre v\u00fdvojov\u00e9 prostredie, ktor\u00e1 sa bude l\u00ed\u0161i\u0165 od predvolenej. MySQL je predvolene nakonfigurovan\u00e9 na slab\u0161ie zariadenia a jeho v\u00fdkon je v z\u00e1kladnej verzii ve\u013emi n\u00edzky.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/417d77a06b18e2df9b71440c0f2a1653.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Docker umo\u017e\u0148uje pou\u017e\u00edva\u0165 interpretr\u00e1tory Python, Ruby, NodeJS, PHP v potrebnej verzii. Zbavujeme sa potreby pou\u017e\u00edva\u0165 nejak\u00e9ho mana\u017e\u00e9ra verzi\u00ed. Predt\u00fdm sme pre Ruby pou\u017e\u00edvali rpm bal\u00edk, ktor\u00fd umo\u017e\u0148oval meni\u0165 verziu v z\u00e1vislosti od projektu. Takisto to umo\u017e\u0148uje, v\u010faka Docker kontajneru, plynule migrova\u0165 k\u00f3d a verziova\u0165 ho spolu so z\u00e1vislos\u0165ami. Nem\u00e1me probl\u00e9m pochopi\u0165 verziu ako interpretr\u00e1tora, tak aj k\u00f3du. Pre aktualiz\u00e1ciu verzie je potrebn\u00e9 zru\u0161i\u0165 star\u00fd kontajner a spusti\u0165 nov\u00fd kontajner. Ak sa nie\u010do pokaz\u00ed, m\u00f4\u017eeme zru\u0161i\u0165 nov\u00fd kontajner a spusti\u0165 star\u00fd kontajner.<\/p>\n<p><\/p>\n<p>Po zostaven\u00ed obrazu bud\u00fa kontajnery v prostred\u00ed v\u00fdvoja aj produkcie rovnak\u00e9. To je obzvl\u00e1\u0161\u0165 aktu\u00e1lne pre ve\u013ek\u00e9 in\u0161tal\u00e1cie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/185a1bfe257f7e3e0eecdc6e0e0d330f.jpg\" style=\"display:block;margin: 0 auto;\" \/> Na frontend pou\u017e\u00edvame JavaScript a NodeJS.<\/p>\n<p><\/p>\n<p>Aktu\u00e1lne m\u00e1me n\u00e1\u0161 posledn\u00fd projekt na ReactJS. V\u00fdvoj\u00e1r sp\u00fa\u0161\u0165al v\u0161etky kontajnery a vyv\u00edjal s pou\u017eit\u00edm hot-reload.<\/p>\n<p><\/p>\n<p>N\u00e1sledne sa sp\u00fa\u0161\u0165a \u00faloha na zostavenie JavaScriptu a k\u00f3d, ktor\u00fd bol zostaven\u00fd do statick\u00fdch s\u00faborov, sa dod\u00e1va cez nginx, \u010d\u00edm sa \u0161etria zdroje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/4c2e28319d56d7fc81845b4133a1bfe6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tu som prilo\u017eil sch\u00e9mu n\u00e1\u0161ho posledn\u00e9ho projektu.<\/p>\n<p><\/p>\n<p>Ak\u00e9 \u00falohy sme rie\u0161ili? Vznikla n\u00e1m potreba vybudova\u0165 syst\u00e9m, s ktor\u00fdm interaguj\u00fa mobiln\u00e9 zariadenia. Tieto z\u00edskavaj\u00fa d\u00e1ta. Jedna z mo\u017enost\u00ed je posla\u0165 push notifik\u00e1cie na toto zariadenie. <\/p>\n<p><\/p>\n<p>\u010co sme preto urobili?<\/p>\n<p><\/p>\n<p>Rozdelili sme aplik\u00e1ciu na tak\u00e9 komponenty ako: administrat\u00edvna \u010das\u0165 na JS, backend, ktor\u00fd pracuje cez REST rozhranie pod Ruby on Rails. Backend interaguje s datab\u00e1zou. V\u00fdsledok, ktor\u00fd sa generuje, sa odovzd\u00e1va klientovi. Administrat\u00edvka s backendom a datab\u00e1zou interaguje cez REST rozhranie.<\/p>\n<p><\/p>\n<p>Takisto sme mali potrebu posiela\u0165 Push notifik\u00e1cie. Predt\u00fdm sme mali projekt, v ktorom bol implementovan\u00fd mechanizmus, ktor\u00fd zodpoved\u00e1 za doru\u010dovanie notifik\u00e1ci\u00ed na mobiln\u00e9 platformy. <\/p>\n<p><\/p>\n<p>Vypracovali sme tak\u00fato sch\u00e9mu: oper\u00e1tor z preh\u013ead\u00e1va\u010da interaguje s adminstr\u00e1ciou, administr\u00e1cia interaguje s backendom, je nastaven\u00e1 \u00faloha, \u017ee treba posla\u0165 Push notifik\u00e1cie.<\/p>\n<p><\/p>\n<p>Push notifik\u00e1cie interaguj\u00fa s in\u00fdm komponentom, ktor\u00fd je implementovan\u00fd na NodeJS.<\/p>\n<p><\/p>\n<p>Vytv\u00e1raj\u00fa sa fronty a n\u00e1sledne ide pod\u013ea svojho mechanizmu odosielanie ozn\u00e1men\u00ed.<\/p>\n<p><\/p>\n<p>Tu s\u00fa zn\u00e1zornen\u00e9 dve datab\u00e1zy. V s\u00fa\u010dasnosti pou\u017e\u00edvame pomocou Dockeru 2 nez\u00e1visl\u00e9 datab\u00e1zy, ktor\u00e9 nie s\u00fa nijako prepojen\u00e9. Okrem toho, \u017ee maj\u00fa spolo\u010dn\u00fa virtu\u00e1lnu sie\u0165, fyzick\u00e9 d\u00e1ta s\u00fa ulo\u017een\u00e9 v r\u00f4znych adres\u00e1roch na stroji v\u00fdvoj\u00e1ra.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/dfde59db7e6886d2d851dcf884049318.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To ist\u00e9, ale v \u010d\u00edslach. Tu je d\u00f4le\u017eit\u00e9 op\u00e4tovn\u00e9 vyu\u017e\u00edvanie k\u00f3du.<\/p>\n<p><\/p>\n<p>Ak sme predt\u00fdm hovorili o op\u00e4tovnom vyu\u017e\u00edvan\u00ed k\u00f3du vo forme kni\u017en\u00edc, v tomto pr\u00edpade n\u00e1\u0161 servis, ktor\u00fd zodpoved\u00e1 za Push ozn\u00e1menia, sa op\u00e4tovne vyu\u017e\u00edva ako kompletn\u00fd server. Poskytuje API. A s n\u00edm interaguje u\u017e na\u0161a nov\u00e1 vyvinut\u00e1 aplik\u00e1cia.<\/p>\n<p><\/p>\n<p>V tom \u010dase sme pou\u017e\u00edvali 4. verziu NodeJS. Teraz (v roku 2017 \u2014 pozn. red.) v nov\u00fdch projektoch pou\u017e\u00edvame 7. verziu NodeJS. Nie s\u00fa probl\u00e9my s nov\u00fdmi komponentmi vyu\u017e\u00edva\u0165 nov\u00e9 verzie kni\u017en\u00edc. <\/p>\n<p><\/p>\n<p>Ak bude potrebn\u00e9, m\u00f4\u017eeme vykona\u0165 refaktoring a aktualizova\u0165 verziu NodeJS na servise Push ozn\u00e1men\u00ed. <\/p>\n<p><\/p>\n<p>Ak sa n\u00e1m podar\u00ed udr\u017ea\u0165 kompatibilitu pod\u013ea API, bude mo\u017en\u00e9 ho vymeni\u0165 v in\u00fdch projektoch, ktor\u00e9 boli pou\u017eit\u00e9 predt\u00fdm.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/5c58c65be078a5a1b9fc17ee2e7b4ad4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u010co je potrebn\u00e9 na pridanie Dockeru? Prid\u00e1me do n\u00e1\u0161ho repozit\u00e1ra Dockerfile, ktor\u00fd popisuje potrebn\u00e9 z\u00e1vislosti. V tomto pr\u00edklade s\u00fa komponenty rozdelen\u00e9 pod\u013ea logiky. Toto je minim\u00e1lny s\u00fabor pre backend v\u00fdvoj\u00e1ra.<\/p>\n<p><\/p>\n<p>Pri vytv\u00e1ran\u00ed nov\u00e9ho projektu vytv\u00e1rame Dockerfile, opisujeme potrebn\u00fa ekosyst\u00e9mu (Python, Ruby, NodeJS). V docker-compose opisujeme potrebn\u00fa z\u00e1vislos\u0165 \u2014 datab\u00e1zu. Op\u00ed\u0161eme, \u017ee potrebujeme verziu datab\u00e1zy tak\u00fato, a uchov\u00e1va\u0165 d\u00e1ta tam a tam.<\/p>\n<p><\/p>\n<p>Na pod\u00e1vanie statiky pou\u017e\u00edvame samostatn\u00fd tret\u00ed kontajner s nginx. Je predpokladan\u00e1 mo\u017enos\u0165 na\u010d\u00edtania obr\u00e1zkov. Backend ich uklada do vopred pripraven\u00e9ho zv\u00e4zku, ktor\u00fd je takisto pripojen\u00fd k nginx kontajneru, ktor\u00fd poskytuje statiku.<\/p>\n<p><\/p>\n<p>Aby sme uchov\u00e1vali konfigur\u00e1ciu nginx, mysql, pridali sme do zlo\u017eky Docker prie\u010dinok, v ktorom uchov\u00e1vame potrebn\u00e9 konfigur\u00e1cie. Ke\u010f v\u00fdvoj\u00e1r vykon\u00e1 git clone repozit\u00e1ra na svoj stroj, dostane u\u017e projekt pripraven\u00fd na lok\u00e1lny v\u00fdvoj. Nevznik\u00e1 ot\u00e1zka, ak\u00fd port alebo ak\u00e9 nastavenia aplikova\u0165.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/e7a6b308a75cacf8ce60687a9e6081dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u010ealej m\u00e1me nieko\u013eko komponentov: administr\u00e1tor, informa\u010dn\u00e9 API, push ozn\u00e1menia.<\/p>\n<p><\/p>\n<p>Aby sme to v\u0161etko spustili, vytvorili sme \u010fal\u0161\u00ed repozit\u00e1r, ktor\u00fd sme nazvali dockerized-app. V s\u00fa\u010dasnosti pou\u017e\u00edvame nieko\u013eko repozit\u00e1rov pre ka\u017ed\u00fd komponent. Tieto sa logicky odli\u0161uj\u00fa \u2014 v GitLabe to vyzer\u00e1 ako prie\u010dinok, zatia\u013e \u010do na po\u010d\u00edta\u010di v\u00fdvoj\u00e1ra ide o prie\u010dinok pre konkr\u00e9tny projekt. Na ni\u017e\u0161ej \u00farovni sa nach\u00e1dzaj\u00fa komponenty, ktor\u00e9 bud\u00fa zl\u00fa\u010den\u00e9.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/f4e2c45c8ec20fca0bac74b3a3892543.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Toto je pr\u00edklad obsahu dockerized-app. Taktie\u017e sem vn\u00e1\u0161ame Docker prie\u010dinok, v ktorom pln\u00edme konfigur\u00e1cie potrebn\u00e9 pre interakcie v\u0161etk\u00fdch komponentov. Obsahuje README.md, v ktorom je stru\u010dne pop\u00edsan\u00e9, ako spusti\u0165 projekt.<\/p>\n<p><\/p>\n<p>Tu sme pou\u017eili dva s\u00fabory docker-compose. Je to uroben\u00e9 s cie\u013eom ma\u0165 mo\u017enos\u0165 sp\u00fa\u0161\u0165a\u0165 ich postupne. Ke\u010f v\u00fdvoj\u00e1r pracuje s jadrom a nepotrebuje Push notifik\u00e1cie, spust\u00ed jednoducho s\u00fabor docker-compose a t\u00fdm sa \u0161etr\u00ed zdroj.<\/p>\n<p><\/p>\n<p>Ak je potrebn\u00e1 integr\u00e1cia s Push notifik\u00e1ciami, spust\u00ed sa docker-compose.yaml a docker-compose-push.yaml.<\/p>\n<p><\/p>\n<p>Ke\u010f\u017ee docker-compose.yaml a docker-compose-push.yaml s\u00fa v tom istom prie\u010dinku, automaticky sa vytvor\u00ed jednotn\u00e1 virtu\u00e1lna sie\u0165.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/535019c82c72c1602176fbaf4aa5640f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Popis komponentov. Je to roz\u0161\u00edren\u00fd s\u00fabor, ktor\u00fd zodpoved\u00e1 za zlo\u017eenie komponentov. \u010co je tu v\u00fdnimo\u010dn\u00e9? Tu zav\u00e1dzame komponent vyrovn\u00e1va\u010da.<\/p>\n<p><\/p>\n<p>Toto je hotov\u00fd Docker obraz, v ktorom be\u017e\u00ed nginx a aplik\u00e1cia, ktor\u00e1 po\u010d\u00fava na Docker socket. Dynamicky, pri zap\u00ednan\u00ed a vyp\u00ednan\u00ed kontajnerov, regeneruje konfigur\u00e1ciu nginx. Interakcie s komponentami rozde\u013eujeme pod\u013ea dom\u00e9nov\u00fdch mien tretej \u00farovne.<\/p>\n<p><\/p>\n<p>Pre v\u00fdvojov\u00e9 prostredie pou\u017e\u00edvame dom\u00e9nu .dev \u2014 api.informer.dev. Aplik\u00e1cia s dom\u00e9nou .dev je pr\u00edstupn\u00e1 na lok\u00e1lnom po\u010d\u00edta\u010di v\u00fdvoj\u00e1ra.<\/p>\n<p><\/p>\n<p>\u010ealej sa prenes\u00fa konfigur\u00e1cie do ka\u017ed\u00e9ho projektu a spustia sa v\u0161etky projekty s\u00fa\u010dasne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/bc1e11e6f1fd1c837d2c8087d04145c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak by sme to graficky zn\u00e1zornili, klientom je n\u00e1\u0161 prehliada\u010d alebo nejak\u00fd n\u00e1stroj, ktor\u00fdm zasielame po\u017eiadavky na vyrovn\u00e1va\u010d.<\/p>\n<p><\/p>\n<p>Vyrovn\u00e1va\u010d pod\u013ea dom\u00e9nov\u00e9ho mena ur\u010duje, ku ktor\u00e9mu kontajneru je potrebn\u00e9 sa obraca\u0165.<\/p>\n<p><\/p>\n<p>M\u00f4\u017ee to by\u0165 nginx, ktor\u00fd poskytuje JS administr\u00e1torskej sekcie. M\u00f4\u017ee to by\u0165 nginx, ktor\u00fd poskytuje API alebo statick\u00e9 s\u00fabory, ktor\u00e9 s\u00fa odovzd\u00e1van\u00e9 nginx vo forme nahr\u00e1vania obr\u00e1zkov.<\/p>\n<p><\/p>\n<p>Na sch\u00e9me je vidie\u0165, \u017ee kontajnery s\u00fa spojen\u00e9 v virtu\u00e1lnej sieti a skryt\u00e9 za proxy.<\/p>\n<p><\/p>\n<p>Na v\u00fdvoj\u00e1rskom po\u010d\u00edta\u010di m\u00f4\u017eete pristupova\u0165 k kontajneru pomocou IP, ale my to vo v\u0161eobecnosti nepou\u017e\u00edvame. Priama potreba pr\u00edstupu sa prakticky nevyskytuje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/2908c31fd9d3c79f6189bdbeeb6d028f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak\u00fd pr\u00edklad si pozrie\u0165, aby ste dockerizovali svoju aplik\u00e1ciu? Pod\u013ea m\u00f4jho n\u00e1zoru je dobr\u00fdm pr\u00edkladom ofici\u00e1lny docker obraz pre MySQL.<\/p>\n<p><\/p>\n<p>Je dos\u0165 komplikovan\u00fd. Existuje ve\u013ea verzi\u00ed. Ale jeho funk\u010dnos\u0165 pokryje mnoh\u00e9 potreby, ktor\u00e9 m\u00f4\u017eu vznikn\u00fa\u0165 v priebehu \u010fal\u0161ieho v\u00fdvoja. Ak str\u00e1vite \u010das a pochop\u00edte, ako to cel\u00e9 interaguje, mysl\u00edm, \u017ee pri samostatnej implement\u00e1cii nebudete ma\u0165 probl\u00e9my.<\/p>\n<p><\/p>\n<p>Na hub.docker.com zvy\u010dajne n\u00e1jdete odkazy na github.com, kde s\u00fa uveden\u00e9 surov\u00e9 d\u00e1ta, z ktor\u00fdch si m\u00f4\u017eete sami zostavi\u0165 obraz.<\/p>\n<p><\/p>\n<p>\u010ealej v tomto repozit\u00e1ri sa nach\u00e1dza skript docker-endpoint.sh, ktor\u00fd zodpoved\u00e1 za prvotn\u00fa inicializ\u00e1ciu a za \u010fal\u0161ie spracovanie spustenia aplik\u00e1cie.<\/p>\n<p><\/p>\n<p>Taktie\u017e v tomto pr\u00edklade existuje mo\u017enos\u0165 konfigur\u00e1cie pomocou premenn\u00fdch prostredia. Ur\u010den\u00edm premenn\u00fdch prostredia pri spusten\u00ed jednotliv\u00e9ho kontajnera alebo cez docker-compose m\u00f4\u017eeme poveda\u0165, \u017ee potrebujeme nastavi\u0165 pr\u00e1zdne heslo pre docker pre root na MySQL alebo nejak\u00e9, ktor\u00e9 chceme.<\/p>\n<p><\/p>\n<p>Existuje mo\u017enos\u0165 vytvori\u0165 n\u00e1hodn\u00e9 heslo. Hovor\u00edme, \u017ee potrebujeme pou\u017e\u00edvate\u013ea, je potrebn\u00e9 nastavi\u0165 pou\u017e\u00edvate\u013eovi heslo a je potrebn\u00e9 vytvori\u0165 datab\u00e1zu.<\/p>\n<p><\/p>\n<p>Vo svojich projektoch sme trochu zjednotili Dockerfile, ktor\u00fd zodpoved\u00e1 za inicializ\u00e1ciu. Tam sme ho upravili pod\u013ea svojich potrieb na jednoduch\u00e9 roz\u0161\u00edrenie pr\u00e1v pou\u017e\u00edvate\u013ea, ktor\u00e9 pou\u017e\u00edva aplik\u00e1cia. To n\u00e1m umo\u017enilo jednoducho vytvori\u0165 datab\u00e1zu z konzoly aplik\u00e1cie. V Ruby aplik\u00e1ci\u00e1ch je pr\u00edkaz na vytvorenie, zmenu a odstr\u00e1nenie datab\u00e1z.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/4a9b56e21819d28dd39753134d23fee4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tento pr\u00edklad ukazuje, ako vyzer\u00e1 konkr\u00e9tna verzia MySQL na github.com. Dockerfile si m\u00f4\u017eete otvori\u0165 a pozrie\u0165 sa, ako prebieha in\u0161tal\u00e1cia.<\/p>\n<p><\/p>\n<p>docker-endpoint.sh je skript, ktor\u00fd zodpoved\u00e1 za vstupn\u00fd bod. Pri prvotnej inicializ\u00e1cii s\u00fa potrebn\u00e9 ur\u010dit\u00e9 \u010dinnosti na pr\u00edpravu a v\u0161etky tieto \u010dinnosti s\u00fa presunut\u00e9 pr\u00e1ve do skriptu inicializ\u00e1cie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/4153fa46526f3d802931dd1db48b08cd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prechod\u00edme k druhej \u010dasti.<\/p>\n<p><\/p>\n<p>Na ukladan\u00ed zdrojov\u00fdch k\u00f3dov sme pre\u0161li na gitlab. To je dos\u0165 siln\u00fd syst\u00e9m, ktor\u00fd m\u00e1 vizu\u00e1lne rozhranie.<\/p>\n<p><\/p>\n<p>Jednou z komponent Gitlab je Gitlab CI. Permituje opisova\u0165 sekvenciu pr\u00edkazov, ktor\u00e9 sa potom pou\u017eij\u00fa na organizovanie syst\u00e9mu dod\u00e1vky k\u00f3du alebo na spustenie automatick\u00e9ho testovania.<\/p>\n<p><\/p>\n<p>Prezent\u00e1cia o Gitlab CI 2 <noindex><a rel=\"nofollow\" href=\"https:\/\/goo.gl\/uohKjI\">https:\/\/goo.gl\/uohKjI<\/a><\/noindex> \u2014 prezent\u00e1cia z Ruby Russia klubu \u2014 dostato\u010dne podrobn\u00e1 a mo\u017eno v\u00e1s zaujme.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/5d26d20500f34eeb9768e6c3d91bbefa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz si prejdeme, \u010do je potrebn\u00e9 na aktivovanie Gitlab CI. Na spustenie Gitlab CI n\u00e1m sta\u010d\u00ed umiestni\u0165 s\u00fabor .gitlab-ci.yml do kore\u0148a projektu.<\/p>\n<p><\/p>\n<p>Tu opisujeme, \u010do chceme vykon\u00e1va\u0165 v sekvencii stavov ako testy a nasadenie.<\/p>\n<p><\/p>\n<p>Vykon\u00e1vame skripty, ktor\u00e9 priamo volaj\u00fa docker-compose na zostavenie na\u0161ej aplik\u00e1cie. Toto je ako pr\u00edklad backendu.<\/p>\n<p><\/p>\n<p>\u010ealej uv\u00e1dzame, \u017ee je potrebn\u00e9 spusti\u0165 migr\u00e1cie na zmenu datab\u00e1zy a vykona\u0165 testy.<\/p>\n<p><\/p>\n<p>Ak skripty prebehn\u00fa spr\u00e1vne a nevr\u00e1tia chybov\u00fd k\u00f3d, syst\u00e9m prech\u00e1dza do druhej f\u00e1zy nasadenia.<\/p>\n<p><\/p>\n<p>F\u00e1za nasadenia je moment\u00e1lne realizovan\u00e1 pre staging. Neorganizovali sme bezprobl\u00e9mov\u00fd re\u0161tart.<\/p>\n<p><\/p>\n<p>N\u00e1silne zastavujeme v\u0161etky kontajnery a potom ich znova sp\u00fa\u0161\u0165ame, pri\u010dom s\u00fa zostaven\u00e9 z prv\u00e9ho kroku po\u010das testovania.<\/p>\n<p><\/p>\n<p>Vykon\u00e1vame migr\u00e1cie datab\u00e1z pre aktu\u00e1lne premenn\u00e9 prostredie, ktor\u00e9 nap\u00edsali v\u00fdvoj\u00e1ri.<\/p>\n<p><\/p>\n<p>Existuje pozn\u00e1mka, \u017ee toto sa m\u00e1 aplikova\u0165 iba na vetvu master.<\/p>\n<p><\/p>\n<p>Pri zmene in\u00fdch vetiev sa nevykon\u00e1va.<\/p>\n<p><\/p>\n<p>Existuje mo\u017enos\u0165 organizova\u0165 vydania pod\u013ea vetiev.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/8a5b880bd9a0d4bab0b276568e2ba413.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aby sme to mohli \u010falej zorganizova\u0165, mus\u00edme nain\u0161talova\u0165 Gitlab Runner.<\/p>\n<p><\/p>\n<p>Tento n\u00e1stroj je nap\u00edsan\u00fd v Golangu. Je to jedine\u010dn\u00fd s\u00fabor, ako je obvykl\u00e9 vo svete Golang, ktor\u00fd nevy\u017eaduje \u017eiadne z\u00e1vislosti.<\/p>\n<p><\/p>\n<p>Pri spusten\u00ed registrujeme Gitlab Runner.<\/p>\n<p><\/p>\n<p>V webovom rozhran\u00ed Gitlab z\u00edskame k\u013e\u00fa\u010d.<\/p>\n<p><\/p>\n<p>Potom vol\u00e1me pr\u00edkaz na inicializ\u00e1ciu v pr\u00edkazovom riadku.<\/p>\n<p><\/p>\n<p>Nastavujeme Gitlab Runner v dial\u00f3govom re\u017eime (Shell, Docker, VirtualBox, SSH)<\/p>\n<p><\/p>\n<p>K\u00f3d na Gitlab Runner bude vykon\u00e1va\u0165 pri ka\u017edom komite v z\u00e1vislosti od nastavenia .gitlab-ci.yml.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/37c8ac7499f0cfba2eb07a84083e44e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ako to vyzer\u00e1 vizu\u00e1lne v Gitlab v webovom rozhran\u00ed. Po pripojen\u00ed Gitlab CI sa objav\u00ed vlajka, ktor\u00e1 ukazuje, v akom stave je zostavenie v s\u00fa\u010dasnosti.<\/p>\n<p><\/p>\n<p>Vid\u00edme, \u017ee pred 4 min\u00fatami bol vytvoren\u00fd commit, ktor\u00fd pre\u0161iel v\u0161etk\u00fdmi testami a nesp\u00f4sobil probl\u00e9my.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/33ac79c45f0651a5f8bde75092c4ac44.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00f4\u017eeme sa na buildy pozrie\u0165 podrobnej\u0161ie. Tu vid\u00edme, \u017ee sme u\u017e pre\u0161li dvoma stavmi. Stav testovania a stav nasadenia na staging.<\/p>\n<p><\/p>\n<p>Ak klikneme na konkr\u00e9tny build, zobraz\u00ed sa tu konzolov\u00fd v\u00fdstup pr\u00edkazov, ktor\u00e9 boli spusten\u00e9 pod\u013ea .gitlab-ci.yml.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/d26dd28708c7fc8a409af4be4d48f502.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Takto vyzer\u00e1 hist\u00f3ria n\u00e1\u0161ho produktu. Vid\u00edme, \u017ee existovali \u00faspe\u0161n\u00e9 pokusy. Ke\u010f testy zlyhaj\u00fa, nenastane prechod na \u010fal\u0161\u00ed krok a k\u00f3d na staging sa neaktualizuje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/ee7bd81dc283c7af0c194779d4230780.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak\u00e9 \u00falohy sme rie\u0161ili na staging, ke\u010f sme zaviedli docker? N\u00e1\u0161 syst\u00e9m sa sklad\u00e1 z komponentov a mali sme potrebu re\u0161tartova\u0165 iba tie komponenty, ktor\u00e9 boli aktualizovan\u00e9 v repozit\u00e1ri, nie cel\u00fd syst\u00e9m.<\/p>\n<p><\/p>\n<p>Na to sme museli rozmiestni\u0165 v\u0161etko do samostatn\u00fdch prie\u010dinkov.<\/p>\n<p><\/p>\n<p>Po tom, \u010do sme to urobili, sme narazili na probl\u00e9m, \u017ee Docker-compose vytv\u00e1ra pre ka\u017ed\u00fd prie\u010dinok svoje vlastn\u00e9 sie\u0165ov\u00e9 priestory, ktor\u00e9 nevidia susedn\u00e9 komponenty.<\/p>\n<p><\/p>\n<p>Aby sme to obhliadli, vytvorili sme sie\u0165 v Dockeri ru\u010dne. V Docker-compose sme uviedli, \u017ee pre tento projekt pou\u017e\u00edvame tak\u00fa sie\u0165.<\/p>\n<p><\/p>\n<p>Takto ka\u017ed\u00fd komponent, ktor\u00fd sa sp\u00fa\u0161\u0165a s touto sie\u0165ou, vid\u00ed komponenty v in\u00fdch \u010dastiach syst\u00e9mu.<\/p>\n<p><\/p>\n<p>\u010eal\u0161\u00ed probl\u00e9m \u2013 rozdelenie stagingu medzi viacer\u00fdmi projektmi.<\/p>\n<p><\/p>\n<p>Preto\u017ee aby to v\u0161etko vyzeralo pekne a \u010do najbli\u017e\u0161ie k produkcii, je dobr\u00e9 pou\u017e\u00edva\u0165 port 80 alebo 443, ktor\u00fd sa vo WEB-u pou\u017e\u00edva vo ve\u013ekom.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/f863cf1833271bf132455a70ad7d2706.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ako sme to vyrie\u0161ili? Priradili sme jeden Gitlab Runner v\u0161etk\u00fdm ve\u013ek\u00fdm projektom.<\/p>\n<p><\/p>\n<p>Gitlab umo\u017e\u0148uje spusti\u0165 nieko\u013eko distribuovan\u00fdch Gitlab Runnerov, ktor\u00e9 jednoducho v n\u00e1hodnom porad\u00ed preberaj\u00fa v\u0161etky \u00falohy a vykon\u00e1vaj\u00fa ich.<\/p>\n<p><\/p>\n<p>Aby sme predi\u0161li chaosu, obmedzili sme skupinu na\u0161ich projektov na jeden Gitlab Runner, ktor\u00fd pri na\u0161ich objemoch zvl\u00e1da bez probl\u00e9mov.<\/p>\n<p><\/p>\n<p>Nginx-proxy sme vy\u010dlenili do samostatn\u00e9ho sp\u00fa\u0161\u0165acieho skriptu a v \u0148om sme uviedli sie\u0165 v\u0161etk\u00fdch projektov. <\/p>\n<p><\/p>\n<p>N\u00e1\u0161 projekt m\u00e1 jednu sie\u0165, zatia\u013e \u010do vyrovn\u00e1va\u010d m\u00e1 nieko\u013eko siet\u00ed pod\u013ea n\u00e1zvov projektov. M\u00f4\u017ee sprostredkova\u0165 po dom\u00e9nov\u00fdch men\u00e1ch \u010falej.<\/p>\n<p><\/p>\n<p>\u017diadosti prich\u00e1dzaj\u00fa na dom\u00e9nu na porte 80 a s\u00fa smerovan\u00e9 do skupiny kontajnerov, ktor\u00e1 obsluhuje t\u00fato dom\u00e9nu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/25c769f029b272a17fd06bbe60cf0ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak\u00e9 \u010fal\u0161ie probl\u00e9my vznikli? Je to, \u017ee v\u0161etky kontajnery sa predvolene sp\u00fa\u0161\u0165aj\u00fa pod pou\u017e\u00edvate\u013eom root. Tento root nie je rovn\u00fd rootu hostite\u013esk\u00e9ho syst\u00e9mu.<\/p>\n<p><\/p>\n<p>Ak sa v\u0161ak dostanete do kontajnera, bude to root a s\u00fabor, ktor\u00fd vytvor\u00edme v tomto kontajneri, z\u00edska pr\u00e1va root.<\/p>\n<p><\/p>\n<p>Ak sa v\u00fdvoj\u00e1r prihl\u00e1sil do kontajnera a vykonal tam nejak\u00e9 pr\u00edkazy, ktor\u00e9 vytv\u00e1raj\u00fa s\u00fabory, potom po odhl\u00e1sen\u00ed sa z kontajnera m\u00e1 v svojej pracovnej prie\u010dinke s\u00fabor, k ktor\u00e9mu nem\u00e1 pr\u00edstup.<\/p>\n<p><\/p>\n<p>Ako sa to d\u00e1 vyrie\u0161i\u0165? M\u00f4\u017eeme prida\u0165 pou\u017e\u00edvate\u013eov, ktor\u00ed bud\u00fa v kontajneri.<\/p>\n<p><\/p>\n<p>Ak\u00e9 probl\u00e9my nastali, ke\u010f sme pridali pou\u017e\u00edvate\u013ea?<\/p>\n<p><\/p>\n<p>Pri vytv\u00e1ran\u00ed pou\u017e\u00edvate\u013ea sa n\u00e1m \u010dasto nezhoduj\u00fa ID skupiny (UID) a ID pou\u017e\u00edvate\u013ea (GID).<\/p>\n<p><\/p>\n<p>Aby sme tento probl\u00e9m vyrie\u0161ili, pou\u017e\u00edvame v kontajneri pou\u017e\u00edvate\u013eov s ID 1000.<\/p>\n<p><\/p>\n<p>V na\u0161om pr\u00edpade to zodpovedalo tomu, \u017ee takmer v\u0161etci v\u00fdvoj\u00e1ri pou\u017e\u00edvaj\u00fa OS Ubuntu. A u OS Ubuntu m\u00e1 prv\u00fd pou\u017e\u00edvate\u013e ID 1000.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/d4911374e4953fdcd807c387efeafec3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak\u00e9 s\u00fa na\u0161e pl\u00e1ny?<\/p>\n<p><\/p>\n<p>Pre\u010d\u00edta\u0165 si dokument\u00e1ciu k Dockeru. Projekt sa akt\u00edvne vyv\u00edja, dokument\u00e1cia sa men\u00ed. \u00dadaje, ktor\u00e9 boli z\u00edskan\u00e9 pred dvoma-tromi mesiacmi, u\u017e pomaly zastar\u00e1vaj\u00fa. <\/p>\n<p><\/p>\n<p>\u010cas\u0165 probl\u00e9mov, ktor\u00e9 sme rie\u0161ili, je celkom mo\u017en\u00e9, \u017ee u\u017e boli vyrie\u0161en\u00e9 \u0161tandardn\u00fdmi prostriedkami.<\/p>\n<p><\/p>\n<p>Ve\u013emi by sme chceli pokra\u010dova\u0165 a prejs\u0165 priamo k orchestr\u00e1cii.<\/p>\n<p><\/p>\n<p>Jedn\u00fdm z pr\u00edkladov je vstavan\u00fd mechanizmus Docker Swarm, ktor\u00fd je k dispoz\u00edcii priamo. Chceli by sme spusti\u0165 nie\u010do v produkcii na z\u00e1klade technol\u00f3gie Docker Swarm.<\/p>\n<p><\/p>\n<p>Vytv\u00e1ranie kontajnerov sp\u00f4sobuje nepohodlie pri pr\u00e1ci s logmi. Teraz s\u00fa logy izolovan\u00e9. S\u00fa rozpt\u00fdlen\u00e9 po kontajneroch. Jednou z \u00faloh je vytvori\u0165 pohodln\u00fd pr\u00edstup k logom cez webov\u00e9 rozhranie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Proces v\u00fdvoja a testovania s Docker a Gitlab CI\" src=\"\/wp-content\/uploads\/2019\/04\/cff8c72dd8af7de1fa0227601bd1d69c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449742\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u0433\u0430\u0447\u0435\u0432\u0430 \u0438\u0437 Inventos &#171;\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Docker + Gitlab CI&#187; \u0422\u0435, \u043a\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0431\u0430\u0437\u0435 Docker + Gitlab CI \u0447\u0430\u0441\u0442\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u0421 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u0442\u044c? \u041a\u0430\u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c? \u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c? \u042d\u0442\u043e\u0442 \u0434\u043e\u043a\u043b\u0430\u0434 \u0445\u043e\u0440\u043e\u0448 \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24326,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32526","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.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u0433\u0430\u0447\u0435\u0432\u0430 \u0438\u0437 Inventos &quot;\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Docker + Gitlab CI&quot; \u0422\u0435, \u043a\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \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\/sk\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\udd47\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Docker \u0438 Gitlab CI | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u0433\u0430\u0447\u0435\u0432\u0430 \u0438\u0437 Inventos &quot;\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Docker + Gitlab CI&quot; \u0422\u0435, \u043a\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci\" \/>\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=\"2019-10-31T18:47:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:47:32+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\udd47 Proces v\u00fdvoja a testovania s Docker a Gitlab CI | ProHoster","description":"Odpor\u00fa\u010dam prejs\u0165 na rozbor spr\u00e1vy Alexandra Sigacheva z Inventos \"Proces v\u00fdvoja a testovania s Docker + Gitlab CI\" pre t\u00fdch, ktor\u00ed sa len za\u010d\u00ednaj\u00fa zap\u00e1ja\u0165 do procesu v\u00fdvoja.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\udd47\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Docker \u0438 Gitlab CI | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u0433\u0430\u0447\u0435\u0432\u0430 \u0438\u0437 Inventos &quot;\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Docker + Gitlab CI&quot; \u0422\u0435, \u043a\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438.","og:url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci","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":"2019-10-31T18:47:32+00:00","article:modified_time":"2019-10-31T18:47:32+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32526","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":"2026-01-21 11:18:24","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:57:22","updated":"2026-01-21 11:18:24","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/32526","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=32526"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/32526\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/24326"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=32526"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=32526"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=32526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}