{"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\/et\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci","title":{"rendered":"Arenduse ja testimise protsess Dockeris ja GitLab CI-s","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>\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;<\/strong><\/p>\n<p><\/p>\n<p>Need, kes just alustavad Docker + GitLab CI arenduse ja testimise protsessi rakendamist, k\u00fcsivad sageli p\u00f5hik\u00fcsimusi. Kust alustada? Kuidas korraldada? Kuidas teste teha?<\/p>\n<p><\/p>\n<p>See ettekande on hea, kuna see struktureeritult r\u00e4\u00e4gib arenduse ja testimise protsessist Dockerit ja GitLab CI-d kasutades. Ettekande originaal on aastast 2017. Olen kindel, et selle ettekande kaudu on v\u00f5imalik omandada p\u00f5hialuseid, metoodikat, ideed ja kasutuskogemust. <\/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=\"Vaata videot\" 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>Huvitav, palun vaata edasi. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<p>Minu nimi on Alexander Sigat\u0161ov. T\u00f6\u00f6tan ettev\u00f5ttes Inventos. R\u00e4\u00e4gin oma kogemusest Dockerit kasutades ja sellest, kuidas me seda j\u00e4rk-j\u00e4rgult oma projektides rakendame.<\/p>\n<p><\/p>\n<p>Ettekande teema: Arendusprotsess Dockerit ja GitLab CI-d kasutades. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/e30c4757e4bda1bcc3e20b16e8e2709e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>See on minu teine ettekande Dockerist. Esimese ettekande ajal kasutasime Dockerit ainult arenduses arendajate masinates. T\u00f6\u00f6tajate arv, kes Dockerit kasutasid, oli umbes 2-3 inimest. Aja jooksul oleme omandanud kogemusi ja liikunud natuke edasi. Lingid meie <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/gled\/docker-development-70411088\">esimene ettekande<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Mida k\u00e4sitletakse selles ettekandes? Jagame kogemusi, mida komistuskive oleme kohanud ja kuidas oleme probleeme lahendanud. See ei ole alati olnud ilus, kuid v\u00f5imaldas edasi liikuda.<\/p>\n<p><\/p>\n<p>Meie moto: dockerige k\u00f5ik, mida meie k\u00e4ed ulatuvad.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/25ae4f97f1c502384abfe697bac502b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Milliseid probleeme lahendame?<\/p>\n<p><\/p>\n<p>Kui ettev\u00f5ttes on mitu meeskonda, on programmeerija jagatud ressurss. On etappe, kus programmeerija t\u00f5mmatakse \u00fche projektist v\u00e4lja ja antakse m\u00f5neks ajaks teise projekti.<\/p>\n<p><\/p>\n<p>Et programmeerija saaks kiiresti sisse elada, peab ta allalaadima projekti l\u00e4htekoodi ja v\u00f5imalikult kiiresti k\u00e4ivitama keskkonna, mis v\u00f5imaldab tal edasi liikuda, lahendades antud projekti \u00fclesandeid.<\/p>\n<p><\/p>\n<p>Tavaliselt, kui alustada nullist, on projekti dokumentatsioon napp. Teave seadistamise kohta on ainult vanadel t\u00f6\u00f6tajatel. T\u00f6\u00f6tajad seadistavad oma t\u00f6\u00f6koha iseseisvalt \u00fche kuni kahe p\u00e4eva jooksul. Selle protsessi kiirendamiseks rakendasime Dockeri.<\/p>\n<p><\/p>\n<p>J\u00e4rgmine p\u00f5hjus on seadete standardiseerimine arenduses. Minu kogemuse j\u00e4rgi on arendajad alati algatusv\u00f5imelised. Igas viiendas juhtumis kasutatakse kohandatud domeeni, n\u00e4iteks vasya.dev. K\u00f5rval istub naaber Pjotr, kellel on domeen petya.dev. Nad arendavad veebisaiti v\u00f5i m\u00f5nda s\u00fcsteemi komponenti, kasutades seda domeeninime.<\/p>\n<p><\/p>\n<p>Kui s\u00fcsteem laienevad ja need domeeninimid hakkavad sattuma seadistustesse, siis tekib arenduse keskkondade konflikt ja veebisaidi tee kirjutatakse \u00fcmber.<\/p>\n<p><\/p>\n<p>Sama juhtub andmebaasi seadistustega. Keegi ei m\u00f5tle turvalisusele ja t\u00f6\u00f6tab t\u00fchja root-parooliga. Kellegi installimise ajal n\u00f5udis MySQL parooli ja see osutus 123. Sage on see, et andmebaasi konfi muudeti pidevalt arendaja commit'i p\u00f5hjal. Keegi parandas, keegi ei parandanud konfi. Oli nutikusi, kus me t\u00f5ime m\u00f5ne testkonfi v\u00e4lja. <code>.gitignore<\/code> ja iga arendaja pidi andmebaasi installima. See raskendas protsessi alustamist. Lisaks sellele tuleb meeles pidada ka andmebaasi. Andmebaas tuleb initsialiseerida, tuleb m\u00e4\u00e4rata parool, m\u00e4\u00e4rata kasutaja, luua tabel ja nii edasi.<\/p>\n<p><\/p>\n<p>Veel \u00fcks probleem on erinevad raamatukogude versioonid. Sageli juhtub, et arendaja t\u00f6\u00f6tab erinevate projektidega. On Legacy projekt, mida alustati viis aastat tagasi (2017. aastast \u2014 toim. m\u00e4rkus). Alustamisel kasutati MySQL 5.5. On ka kaasaegseid projekte, kus p\u00fc\u00fcame rakendada juba uuemaid MySQL versioone, n\u00e4iteks 5.7 v\u00f5i vanemaid (2017. aastal \u2014 toim. m\u00e4rkus).<\/p>\n<p><\/p>\n<p>Kes t\u00f6\u00f6tab MySQL-iga, teab, et need raamatukogud kaasnevad s\u00f5ltuvustega. On \u00fcsna problemaatiline k\u00e4ivitada kahte andmebaasi korraga. V\u00e4hemalt vanade klientide \u00fchendamine uue andmebaasiga on keeruline. See tekitab omakorda mitmeid probleeme.<\/p>\n<p><\/p>\n<p>J\u00e4rgmine probleem tekib siis, kui arendaja t\u00f6\u00f6tab kohalikes keskkondades. Ta kasutab kohalikke ressursse, kohalikke faile ja kohalikku RAM-i. K\u00f5ik interaktsioonid probleemide lahendamise hetkel toimuvad selle raames, et see t\u00f6\u00f6tab \u00fchel seadmel. N\u00e4iteks v\u00f5ib tuua olukorra, kus meie tootmises on 3 tagapoolte serverit, kuid arendaja salvestab failid juurkatalooge ja Nginx v\u00f5tab failid sealt vastamiseks. Kui selline kood j\u00f5uab tootmisse, on fail siiski kohal vaid \u00fchel kolmest serverist.<\/p>\n<p><\/p>\n<p>Praegu areneb mikroteenuste suund. Kui jagame oma suured rakendused v\u00e4iksemate komponentideks, mis omavahel suhtlevad. See v\u00f5imaldab valida tehnoloogiad vastavalt konkreetsele \u00fclesande kogumile. Samuti v\u00f5imaldab see jagada t\u00f6\u00f6d ja vastutuse valdkondi arendajate vahel.<\/p>\n<p><\/p>\n<p>Frontend-arendaja, arendades JavaScripti, ei m\u00f5juta tagapoolt. Tagapoolte arendaja omakorda arendab, meie puhul, Ruby on Rails'i ja ei sega frontend'i. Suhtlus toimub API kaudu.<\/p>\n<p><\/p>\n<p>Boonusena kasutades suutsime Dockeriga \u00e4ra kasutada ressursse Stagingus. Iga projekt n\u00f5udis oma erip\u00e4rast tingituna spetsiifilisi seadistusi. F\u00fc\u00fcsiliselt tuli kas eraldada iga\u00fchele virtuaalserver v\u00f5i seada need eraldi, v\u00f5i jagada m\u00f5ni muutuv keskkond, mille t\u00f5ttu projektide \u00fcksteisega s\u00f5ltuvalt teegiversioonidest suhtlemine m\u00f5jutas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/fa5c99f90faef84a356d4791fd915830.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>T\u00f6\u00f6riistad. Mida me kasutame? <\/p>\n<p><\/p>\n<ul>\n<li>Otseselt ise Dockerit. Dockerfile'is m\u00e4\u00e4ratakse \u00fche rakenduse s\u00f5ltuvused. <\/li>\n<li>Docker-compose on kombinatsioon, mis \u00fchendab mitmeid meie Docker rakendusi.<\/li>\n<li>GitLabit kasutame l\u00e4htekoodi hoidmiseks.<\/li>\n<li>GitLab-CI't kasutame s\u00fcsteemseks integreerimiseks.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/b6041827a6ba928e0d33add6b79c581c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ettekanne koosneb kahest osast.<\/p>\n<p><\/p>\n<p>Esimene osa r\u00e4\u00e4gib sellest, kuidas k\u00e4ivitasime Dockerit arendajate masinates.<\/p>\n<p><\/p>\n<p>Teine osa r\u00e4\u00e4gib, kuidas suhelda GitLabiga, kuidas k\u00e4ivitame teste ja kuidas viime Stagingusse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/45746d3323d35e0d18f066c8bfcb2214.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Docker \u2014 see tehnoloogia, mis v\u00f5imaldab (kasutades deklareerivat l\u00e4henemist) kirjeldada vajalikke komponente. See on n\u00e4idis Dockerfile'ist. Siin kuulutame, et me p\u00e4rime ametlikust Docker-pildist Ruby: 2.3.0. See sisaldab installitud Ruby versiooni 2.3. Me installime vajalikud ehitusraamatukogud ja NodeJS. Kirjeldame, et loome katalooge. <code>\/app<\/code>M\u00e4\u00e4rame katalooge app t\u00f6\u00f6kaustaks. Selle katalooge paigutame vajaliku minimaalset Gemfile'i ja Gemfile.lock'i. Seej\u00e4rel t\u00e4idame projektide koostamise, mis installivad s\u00f5ltuvused, mis on selle pildi jaoks vajalikud. N\u00e4itame, et konteiner on valmis kuulama v\u00e4lisel pordil 3000. Viimane k\u00e4sk on k\u00e4sk, mis k\u00e4ivitab meie rakenduse. Kui me k\u00e4ivitame projekti, siis rakendus p\u00fc\u00fcab t\u00f6\u00f6tada ja k\u00e4ivitab antud k\u00e4su.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/ba503c305ae90f49b39f4ae2cbda1668.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>See on minimaalne n\u00e4ide docker-compose failist. Antud juhul n\u00e4itame, kuidas \u00fchendatakse kahte konteinerit: andmebaasi teenus ja veebi teenus. Meie veebi rakendused vajavad peamiselt andmete salvestamiseks mingit andmebaasi. Kuna kasutame MySQL-i, toome n\u00e4ite MySQL-i pealt, kuid pole midagi takistada ka m\u00f5ne teise andmebaasi (PostgreSQL, Redis) kasutamisel.<\/p>\n<p><\/p>\n<p>V\u00f5tame ametlikust allikast Docker hub-ist MySQL 5.7.14 pildi ilma muudatusteta. Pilt, mis vastutab meie veebi rakenduse eest, kogume k\u00e4esolevast kataloogist. Esimese k\u00e4ivitamise ajal loob see meile pildi. P\u00e4rast seda k\u00e4ivitab k\u00e4su, mida siin t\u00e4idame. Kui l\u00e4heme tagasi, n\u00e4eme, et k\u00e4ivitamise k\u00e4sk on m\u00e4\u00e4ratud Puma kaudu. Puma on Ruby-s kirjutatud teenus. Teises puhul \u00fcle kirjutame. See k\u00e4sk v\u00f5ib olla suvaline, s\u00f5ltuvalt meie vajadustest v\u00f5i \u00fclesannetest.<\/p>\n<p><\/p>\n<p>Kirjeldame ka, et tuleb edastada port meie arendaja host-masinas, mis on 3000 ja konteineri 3000 port. See toimub automaatselt iptables'i ja Dockerisse sisseehitatud mehhanismi abil. <\/p>\n<p><\/p>\n<p>Arendaja saab nagu varem p\u00f6\u00f6rduda mis tahes saadaval oleva IP-aadressi poole, n\u00e4iteks 127.0.0.1 kohaliku v\u00f5i v\u00e4list IP-aadressi poole.<\/p>\n<p><\/p>\n<p>Viimane rida \u00fctleb, et web konteiner s\u00f5ltub db konteinerist. Kui kutsume \u00fcles web konteineri k\u00e4ivitamist, k\u00e4ivitab docker-compose eelnevalt meie andmebaasi. Andmebaasi k\u00e4ivitamine (tegelikult p\u00e4rast konteineri k\u00e4ivitamist! Andmebaasi valmidust see ei garanteeri) k\u00e4ivitab meie rakenduse, meie backend'i.<\/p>\n<p><\/p>\n<p>See v\u00f5imaldab v\u00e4ltida vigu, kui andmebaas ei ole k\u00e4ivitatud, ja aitab s\u00e4\u00e4sta ressursse, kui peatame andmebaasi konteineri, vabastades seel\u00e4bi ressursid teiste projektide jaoks. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/4acbcf5de89b98db055e8abc419202de.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mida me saame projekti andmebaasi dockeriseerimisega. Me fikseerime k\u00f5igile arendajatele MySQL versiooni. See aitab v\u00e4ltida m\u00f5ningaid vigu, mis v\u00f5ivad tekkida versioonide lahknevuse t\u00f5ttu, kui muutub s\u00fcntaks, konfiguratsioon v\u00f5i vaike seadistused. See v\u00f5imaldab m\u00e4\u00e4rata \u00fchised hostname, login ja password andmebaasi jaoks. Loodame loobuda varasemast konfigureerimist failide nimetuste segadusest ja konfliktidest. <\/p>\n<p><\/p>\n<p>Meil on v\u00f5imalus kasutada arenduskeskkonnas optimeeritumat seadistust, mis erineb vaikeseadistusest. MySQL on vaikimisi seadistatud n\u00f5rkade masinate jaoks ja selle j\u00f5udlus on algselt v\u00e4ga madal.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/417d77a06b18e2df9b71440c0f2a1653.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Docker v\u00f5imaldab kasutada vajalikku versiooni Python, Ruby, NodeJS, PHP t\u00f5lgendajat. Me vabaneme vajadusest kasutada mingit versioonihaldurit. Varem kasutasime Ruby jaoks rpm-paketti, mis v\u00f5imaldas muuta versiooni vastavalt projektile. See v\u00f5imaldab Docker-konteineri kaudu sujuvalt migreerida koodi ja versioonida seda koos s\u00f5ltuvustega. Meil ei teki probleemi teada, milline on nii t\u00f5lgendaja kui ka koodi versioon. Versiooniuuendamiseks tuleb vana konteiner peatada ja uus konteiner \u00fcles t\u00f5sta. Kui midagi l\u00e4heb valesti, saame uue konteineri peatada ja vana konteineri taas \u00fcles t\u00f5sta.<\/p>\n<p><\/p>\n<p>P\u00e4rast pildi koostamist on konteinerid nii arenduses kui tootmises identsed. See on eriti oluline suurte paigaldiste korral.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/185a1bfe257f7e3e0eecdc6e0e0d330f.jpg\" style=\"display:block;margin: 0 auto;\" \/> Frondendis kasutame JavaScripti ja NodeJS-i.<\/p>\n<p><\/p>\n<p>Meie viimane projekt on praegu ReacJS-is. Arendaja k\u00e4ivitas k\u00f5ik konteinerid ja t\u00f6\u00f6tas kuumlaadimisega.<\/p>\n<p><\/p>\n<p>See rikas JavaScript'i \u00fclesanne ja koondatud kood antakse nginx'i kaudu edasi, s\u00e4\u00e4stes ressursse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/4c2e28319d56d7fc81845b4133a1bfe6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Siin on meie viimane projekti skeem.<\/p>\n<p><\/p>\n<p>Milliseid \u00fclesandeid lahendasime? Meil oli vajalik luua s\u00fcsteem, millega suhtlevad mobiilseadmed. Need saavad andmeid. \u00dcks v\u00f5imalus on saata push-teateid sellesse seadmesse. <\/p>\n<p><\/p>\n<p>Mida me selleks tegime?<\/p>\n<p><\/p>\n<p>Jagasime rakenduse sellisteks komponentideks nagu: administraatori osa JS'is, backend, mis t\u00f6\u00f6tab REST-liidese kaudu Ruby on Rails'is. Backend suhtleb andmebaasiga. Tulemused, mis genereeritakse, antakse kliendile. Administraator ja backend suhtlevad ja andmebaas REST-liidese kaudu.<\/p>\n<p><\/p>\n<p>Samuti oli meil vajadus saata Push-teateid. Enne seda oli meil projekt, kus oli rakendatud mehhanism, mis vastutas teadete edastamise eest mobiilplatvormidele. <\/p>\n<p><\/p>\n<p>Me t\u00f6\u00f6tasime v\u00e4lja sellise skeemi: operaator brauserist suhtleb administraatori osaga, administraator suhtleb backend'iga, seatakse \u00fclesanne saata Push-teateid.<\/p>\n<p><\/p>\n<p>Push-teated suhtlevad teise komponendiga, mis on rakendatud NodeJS'is.<\/p>\n<p><\/p>\n<p>Oote j\u00e4rjekorrad ja edasine teavitamise mehhanism toimib selle j\u00e4rgi.<\/p>\n<p><\/p>\n<p>Siin on joonistatud kaks andmebaasi. Hetkel kasutame me Dockerit, et hallata 2 iseseisvat andmebaasi, mis ei ole omavahel seotud. Ainus seos on see, et neil on \u00fchine virtuaalne v\u00f5rk, samas kui f\u00fc\u00fcsilised andmed on salvestatud arendaja masina erinevatesse kataloogidesse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/dfde59db7e6886d2d851dcf884049318.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sama asi, kuid numbritega. Siin on koodide taaskasutamine oluline.<\/p>\n<p><\/p>\n<p>Kui varem r\u00e4\u00e4kisime koodide taaskasutamisest raamatukogudena, siis antud n\u00e4ites meie teenus, mis vastutab Push-teavituste eest, taaskasutatakse t\u00e4ieliku serverina. See pakub API-d. Ja meie uus arendus suhtleb sellega.<\/p>\n<p><\/p>\n<p>Sel hetkel kasutasime me NodeJS versiooni 4. Praegu (2017. aastal \u2014 m\u00e4rkus toimetajalt) kasutame me uutes arendustes NodeJS versiooni 7. Uutes komponentides ei ole probleemiks kasutada uusi raamatukogude versioone. <\/p>\n<p><\/p>\n<p>Vajadusel saab l\u00e4bi viia refaktoreerimise ja t\u00f5sta NodeJS versiooni Push-teavituste teenuses. <\/p>\n<p><\/p>\n<p>Ja kui suudame s\u00e4ilitada API \u00fchilduvuse, saame selle asendada teiste projektidega, millega oleme varem t\u00f6\u00f6tanud.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/5c58c65be078a5a1b9fc17ee2e7b4ad4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mida on vaja, et lisada Docker? Lisame meie hoidlasse Dockerfile'i, mis kirjeldab vajalikke s\u00f5ltuvusi. Antud n\u00e4ites on komponendid jagatud loogika j\u00e4rgi. See on minimaalne komplekt backend-arendajale.<\/p>\n<p><\/p>\n<p>Uue projekti loomisel loome Dockerfile'i, kirjeldame vajalikku \u00f6kos\u00fcsteemi (Python, Ruby, NodeJS). Docker-compose'is kirjeldame vajalike s\u00f5ltuvuste \u2014 andmebaasi. Kirjeldame, et vajame andmebaasi teatud versioonis, andmete salvestamiseks seal ja seal.<\/p>\n<p><\/p>\n<p>Kasutame staatika edastamiseks eraldi kolmandat konteinerit nginx'iga. On ette n\u00e4htud piltide laadimise v\u00f5imalus. Backend paigutab need juba ette valmistatud mahutisse, mis on samuti monteeritud nginx'iga konteinerisse, mis edastab staatikat.<\/p>\n<p><\/p>\n<p>Nginx'i ja mysql'i konfiguratsiooni hoidmiseks lisasime kausta Docker, kus hoiame vajalikke konfiguratsioone. Kui arendaja teeb git clone'i hoidlast oma arvutisse, on tal juba projekt valmis kohalikuks arendamiseks. K\u00fcsimust ei teki, millist porti v\u00f5i milliseid seadeid rakendada.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/e7a6b308a75cacf8ce60687a9e6081dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Edasi on meil mitu komponenti: admin, inform-API, push-teavitused.<\/p>\n<p><\/p>\n<p>Selle k\u00f5ike k\u00e4ivitamiseks oleme loonud veel \u00fche reposti, mille nimeks panime dockerized-app. Praegu kasutame mitu reposti igale komponendile. Need erinevad lihtsalt loogiliselt \u2014 GitLabis n\u00e4eb see v\u00e4lja nagu kaust, ja arendaja seadmes on see konkreetse projekti kaust. Madalamal tasemel asuvad komponendid, mis saavad \u00fchenduda.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/f4e2c45c8ec20fca0bac74b3a3892543.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>See on just dockerized-app sisu n\u00e4ide. Toome siia ka Docker katalooge, kuhu t\u00e4idame konfiguratsioonid, mis on vajalikud k\u00f5igi komponentide vaheliseks suhtlemiseks. Seal on README.md, kus on l\u00fchidalt seletatud, kuidas projekti k\u00e4ivitada.<\/p>\n<p><\/p>\n<p>Siin oleme kasutanud kahte docker-compose faili. See on tehtud selleks, et arendaja saaks seda k\u00e4itada samm-sammult. Kui arendaja t\u00f6\u00f6tab p\u00f5hikomplektiga ja Push-teavitusi ei vaja, k\u00e4ivitab ta lihtsalt docker-compose faili, s\u00e4\u00e4stes seel\u00e4bi ressursse.<\/p>\n<p><\/p>\n<p>Kui on vaja integreerida Push-teavitusi, siis k\u00e4ivitub docker-compose.yaml ja docker-compose-push.yaml.<\/p>\n<p><\/p>\n<p>Kuna docker-compose.yaml ja docker-compose-push.yaml asuvad kaustas, luuakse automaatselt \u00fchine virtuaalne v\u00f5rk.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/535019c82c72c1602176fbaf4aa5640f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Komponentide kirjeldus. See on ulatuslikum fail, mis vastutab komponentide kogumise eest. Mis siin t\u00e4helepanuv\u00e4\u00e4rne? Siin me tutvustame tasakaalustajat.<\/p>\n<p><\/p>\n<p>See on valmis Docker-pilt, kus t\u00f6\u00f6tab nginx ja rakendus, mis kuulab Docker soket. D\u00fcnaamiliselt, konteinerite sisse- ja v\u00e4ljal\u00fclitamise k\u00e4igus, genereeritakse nginx konfiguraatsioon uuesti. Komponentidega suhtlemine toimub kolmanda tasandi domeeninimede kaudu.<\/p>\n<p><\/p>\n<p>Arenduskeskkonnas kasutame domeeni .dev \u2014 api.informer.dev. Rakendused domeeniga .dev on arendaja kohalikul masinal kergesti ligip\u00e4\u00e4setavad.<\/p>\n<p><\/p>\n<p>Seej\u00e4rel edastatakse konfiguraatsioonid iga projekti juurde ja k\u00e4ivitatakse k\u00f5ik projektid koos samal ajal.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/bc1e11e6f1fd1c837d2c8087d04145c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kui joonistada graafiliselt, siis klient on meie brauser v\u00f5i m\u00f5ni muu t\u00f6\u00f6riist, millega me esitame taotlusi tasakaalustajale.<\/p>\n<p><\/p>\n<p>Tasakaalustaja m\u00e4\u00e4rab domeeninime kaudu, millise konteineriga \u00fchendust v\u00f5tta.<\/p>\n<p><\/p>\n<p>See v\u00f5ib olla nginx, mis edastab JS administraatoreid. See v\u00f5ib olla nginx, mis edastab API-d v\u00f5i staatilisi faile, mida nginx edastab piltide allalaadimisel.<\/p>\n<p><\/p>\n<p>Kavas on n\u00e4htav, et konteinerid on \u00fchendatud virtuaalsesse v\u00f5rku ja peidetud proksi taha.<\/p>\n<p><\/p>\n<p>Arendaja masinasse on v\u00f5imalik konteinerile juurde p\u00e4\u00e4seda, tundes IP-d, kuid me ei kasuta seda p\u00f5him\u00f5tteliselt. Otsese juurdep\u00e4\u00e4su vajadusi praktiliselt ei esine.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/2908c31fd9d3c79f6189bdbeeb6d028f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Millist n\u00e4idet peaks vaatama, et oma rakendust dockeriseerida? Minu arvates on ametlik MySQL docker pilt hea n\u00e4ide.<\/p>\n<p><\/p>\n<p>See on piisavalt keeruline. Seal on palju versioone. Kuid selle funktsionaalsus katab mitmeid vajadusi, mis v\u00f5ivad arenguprotsessis tekkida. Kui kulutate aega ja m\u00f5istate, kuidas k\u00f5ik see omavahel toimib, siis arvan, et iseseisvas rakenduses teil probleeme ei teki.<\/p>\n<p><\/p>\n<p>Hub.docker.com lehelt leiate tavaliselt lingid github.com-ile, kus on toodud toored andmed, mille p\u00f5hjal saate ise pildi kokku panna.<\/p>\n<p><\/p>\n<p>Edasi, selles repos on olemas skript docker-endpoint.sh, mis vastutab esialgse initsialiseerimise ja rakenduse k\u00e4ivitamise edasise t\u00f6\u00f6tlemise eest.<\/p>\n<p><\/p>\n<p>Selles n\u00e4ites on samuti olemas seadistusv\u00f5imalus keskkonnamuutujate kaudu. M\u00e4\u00e4rates keskkonnamuutujat kas \u00fcksiku konteineri k\u00e4ivitamisel v\u00f5i docker-compose'i kaudu, saame \u00f6elda, et peame seadma MySQL-i root-kasutajale t\u00fchja parooli v\u00f5i m\u00f5ne muu, mille soovime.<\/p>\n<p><\/p>\n<p>On v\u00f5imalus luua juhuslik parool. \u00dctleme, et vajame kasutajat, peame kasutajale parooli seadma ja looma andmebaasi.<\/p>\n<p><\/p>\n<p>Oma projektides oleme natuke \u00fchtlustanud Dockerfile'i, mis vastutab initsialiseerimise eest. Oleme selle oma vajadustele vastavaks muutnud, et lihtsalt laiendada rakenduse kasutaja \u00f5igusi. See v\u00f5imaldas hiljem lihtsalt luua andmebaasi rakenduse konsolist. Ruby rakendustes on k\u00e4sk andmebaaside loomise, muutmise ja kustutamise jaoks.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/4a9b56e21819d28dd39753134d23fee4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>See on n\u00e4ide sellest, kuidas konkreetne MySQL-i versioon v\u00e4lja n\u00e4eb github.com-is. Dockerfile'i saab avada ja vaadata, kuidas seal installimine toimub.<\/p>\n<p><\/p>\n<p>docker-endpoint.sh skript, mis vastutab sisenemispunkti eest. Algse seadistamise k\u00e4igus on vajalikud teatud ettevalmistustegevused ja k\u00f5ik need tegevused on koondatud just algatusskripti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/4153fa46526f3d802931dd1db48b08cd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Liigume teise osa juurde.<\/p>\n<p><\/p>\n<p>Allikakoodide salvestamiseks oleme l\u00e4inud gitlabi. See on piisavalt v\u00f5imas s\u00fcsteem, millel on visuaalne liides.<\/p>\n<p><\/p>\n<p>\u00dcks Gitlabi komponente on Gitlab CI. See v\u00f5imaldab kirjeldada k\u00e4ske, mis hiljem kasutatakse koodide tarnes\u00fcsteemi korraldamiseks v\u00f5i automaatsete testide k\u00e4ivitamiseks.<\/p>\n<p><\/p>\n<p>Gitlab CI ettekannet 2 <noindex><a rel=\"nofollow\" href=\"https:\/\/goo.gl\/uohKjI\">https:\/\/goo.gl\/uohKjI<\/a><\/noindex> \u2014 ettekanne Ruby Russia klubist \u2014 piisavalt p\u00f5hjalik ja v\u00f5ib-olla huvitab see teid.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/5d26d20500f34eeb9768e6c3d91bbefa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Praegu vaatame, mida on vaja, et aktiveerida Gitlab CI. Gitlab CI k\u00e4ivitamiseks piisab, kui panna projekti juure faili .gitlab-ci.yml.<\/p>\n<p><\/p>\n<p>Siin kirjeldame, mida soovime teha testimise ja juurutamise sarnaste olekute j\u00e4rjestuses.<\/p>\n<p><\/p>\n<p>K\u00e4ivitame skripte, mis kutsuvad esile docker-compose'i meie rakenduse koostamise. See on n\u00e4iteks backend.<\/p>\n<p><\/p>\n<p>Seej\u00e4rel \u00fctleme, et on vajalik migratsioonide k\u00e4itamine andmebaasi muutmiseks ja testide l\u00e4biviimine.<\/p>\n<p><\/p>\n<p>Kui skriptid t\u00f6\u00f6tavad korrektselt ja ei tagasta viga, siis l\u00e4heb s\u00fcsteem vastavalt teise etappi.<\/p>\n<p><\/p>\n<p>Deploy-etapp on hetkel rakendatud staging-platvormil. Me ei ole korraldanud katkestusteta s\u00f5ltumatut taask\u00e4ivitust.<\/p>\n<p><\/p>\n<p>Sundime k\u00f5ik konteinerid kinni ja t\u00f5stame need seej\u00e4rel uuesti \u00fcles, kasutades esimeses etapis testimiseks kokku pandud konteinerite pilte.<\/p>\n<p><\/p>\n<p>K\u00e4ivitame jooksva muutujate keskkonna andmebaasi migreerimised, mille on kirjutanud arendajad.<\/p>\n<p><\/p>\n<p>On m\u00e4rk, et seda tuleks rakendada ainult haru 'master' puhul.<\/p>\n<p><\/p>\n<p>Teiste harude puhul ei toimu t\u00f5stmist.<\/p>\n<p><\/p>\n<p>On v\u00f5imalik korraldada versioonide t\u00f5stmisi harude j\u00e4rgi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/8a5b880bd9a0d4bab0b276568e2ba413.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Selle edasise korraldamiseks peame installima GitLab Runneri.<\/p>\n<p><\/p>\n<p>See utiliit on kirjutatud Golangis. See on \u00fchekordne fail, nagu Golangi maailmas tavaline, mis ei vaja \u00fchtegi s\u00f5ltuvust.<\/p>\n<p><\/p>\n<p>K\u00e4ivitamisel registreerime GitLab Runneri.<\/p>\n<p><\/p>\n<p>Saame GitLabi veebiliideses v\u00f5tme.<\/p>\n<p><\/p>\n<p>Seej\u00e4rel kutsume esile algatamise k\u00e4su k\u00e4surealt.<\/p>\n<p><\/p>\n<p>Konfigureerime GitLab Runneri dialoogire\u017eiimis (Shell, Docker, VirtualBox, SSH).<\/p>\n<p><\/p>\n<p>Kood GitLab Runneris k\u00e4ivitub iga commit'i korral s\u00f5ltuvalt .gitlab-ci.yml seadistusest.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/37c8ac7499f0cfba2eb07a84083e44e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kuidas see Gitlabis veebiliideses visuaalselt v\u00e4lja n\u00e4eb. P\u00e4rast Gitlab CI \u00fchendamist ilmub meile lipp, mis n\u00e4itab, millises olekus praegu build on.<\/p>\n<p><\/p>\n<p>N\u00e4eme, et 4 minutit tagasi tehti commit, mis l\u00e4bis k\u00f5ik testid ja ei tekitanud probleeme.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/33ac79c45f0651a5f8bde75092c4ac44.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Saame l\u00e4hemalt vaadata build'e. Siit n\u00e4eme, et oleme l\u00e4binud kaks etappi: testimise etapp ja deploy etapp staging'is.<\/p>\n<p><\/p>\n<p>Kui kl\u00f5psame konkreetse build'i peal, n\u00e4eme seal konsooliv\u00e4ljundit k\u00e4skudest, mis k\u00e4idi vastavalt .gitlab-ci.yml failile.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/d26dd28708c7fc8a409af4be4d48f502.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Selline on meie toote ajalugu. N\u00e4eme, et oleme olnud edukaid katseid. Kui testid nurjusid, siis j\u00e4rgmisse etappi ei liikuda ja koodi staging'is ei uuendata.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/ee7bd81dc283c7af0c194779d4230780.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Milliseid \u00fclesandeid lahendasime staging'is dockerit rakendades? Meie s\u00fcsteem koosneb komponentidest ja meil tekkis vajadus taask\u00e4ivitada ainult osi komponentidest, mis olid repostos uuendatud, mitte kogu s\u00fcsteemi korraga.<\/p>\n<p><\/p>\n<p>Selleks pidime k\u00f5ik eraldi kaustadesse jaotama.<\/p>\n<p><\/p>\n<p>P\u00e4rast seda, kui olime selle teinud, tekkis meil probleem, et Docker-compose loob iga kausta jaoks oma v\u00f5rgu, mist\u00f5ttu ei n\u00e4e komponentide naabrid.<\/p>\n<p><\/p>\n<p>Kuna selle \u00fcletamiseks l\u00f5ime me v\u00f5rgu Dockeris k\u00e4sitsi. Docker-compose'is m\u00e4\u00e4rasime, et see projekt kasutaks seda v\u00f5rku.<\/p>\n<p><\/p>\n<p>Seega n\u00e4eb iga komponent, mis k\u00e4ivitatakse selle v\u00f5rguga, teisi komponente s\u00fcsteemi erinevates osades.<\/p>\n<p><\/p>\n<p>J\u00e4rgmine probleem on staging'i jagamine mitme projekti vahel.<\/p>\n<p><\/p>\n<p>Kuna k\u00f5ik see peaks v\u00e4lja n\u00e4gema ilus ja olema v\u00f5imalikult l\u00e4hedal tootmisversioonile, on parem kasutada porti 80 v\u00f5i 443, mida kasutatakse laialdaselt veebis.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/f863cf1833271bf132455a70ad7d2706.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kuidas me selle lahendasime? M\u00e4\u00e4rasime \u00fche Gitlab Runner'i k\u00f5ikidele suurtele projektidele.<\/p>\n<p><\/p>\n<p>Gitlab v\u00f5imaldab k\u00e4ivitada mitu jaotatud Gitlab Runner'it, mis lihtsalt j\u00e4rjekorras ja kaootiliselt v\u00f5tavad k\u00f5ik \u00fclesanded ja t\u00e4idavad need.<\/p>\n<p><\/p>\n<p>Et meil ei tekiks segadust, piirasime meie projektide grupi \u00fche Gitlab Runner'iga, mis meie mahud arvestades t\u00f6\u00f6tab probleemideta.<\/p>\n<p><\/p>\n<p>Me t\u00f5stsime nginx-proxy eraldi k\u00e4ivitusskripti ja m\u00e4\u00e4rasime sinna k\u00f5igi projektide v\u00f5rgud. <\/p>\n<p><\/p>\n<p>Meie projektil on \u00fcks v\u00f5rk, samas kui koormuse tasakaalustaja haldab mitmeid v\u00f5rke projektinimede j\u00e4rgi. See suudab domeeninimede alusel edasi proksida.<\/p>\n<p><\/p>\n<p>Meie p\u00e4ringud tulevad domeeni kaudu porti 80 ja suunatakse konteinerigruppi, mis teenindab seda domeeni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/25c769f029b272a17fd06bbe60cf0ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Millised probleemid veel ilmnesid? Probleemiks on see, et vaikimisi t\u00f6\u00f6tavad k\u00f5ik konteinerid kasutaja root all. See root ei ole v\u00f5rreldav s\u00fcsteemi root-hosti omaga.<\/p>\n<p><\/p>\n<p>Kuna aga konteinerisse sisenedes on tegemist rootiga, saavad seal loodud failid root \u00f5igused.<\/p>\n<p><\/p>\n<p>Kui arendaja siseneb konteinerisse ja k\u00e4ivitab seal k\u00e4ske, mis loovad faile, ja seej\u00e4rel konteinerist v\u00e4ljub, siis tema t\u00f6\u00f6kaustas on fail, millele tal pole juurdep\u00e4\u00e4su.<\/p>\n<p><\/p>\n<p>Kuidas saaksime seda lahendada? Saame lisada kasutajaid, kes t\u00f6\u00f6tavad konteineris.<\/p>\n<p><\/p>\n<p>Millised probleemid tekkisid, kui lisasime kasutaja?<\/p>\n<p><\/p>\n<p>Kasutaja loomisel katsetame tihti, et grupi ID (UID) ja kasutaja ID (GID) ei kattu.<\/p>\n<p><\/p>\n<p>Selle probleemi lahendamiseks kasutame konteineris kasutajaid, kelle ID on 1000.<\/p>\n<p><\/p>\n<p>Meie puhul kattus see sellega, et praktiliselt k\u00f5ik arendajad kasutavad Ubuntu operatsioonis\u00fcsteemi. Ubuntu operatsioonis\u00fcsteemis on esimesel kasutajal ID 1000.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/d4911374e4953fdcd807c387efeafec3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Millised on meie plaanid?<\/p>\n<p><\/p>\n<p>Korrata dokumentatsiooni Docker kohta. Projekt areneb aktiivselt, dokumentatsioon muutub. Andmed, mis saadi kaks-kolm kuud tagasi, muutuvad aeglaselt vananenuks. <\/p>\n<p><\/p>\n<p>M\u00f5ned probleemid, millega me tegelesime, on t\u00f5en\u00e4oliselt juba lahendatud tavap\u00e4raste vahenditega.<\/p>\n<p><\/p>\n<p>On nii raske edasi liikuda ja minna otse orkestreerimise juurde.<\/p>\n<p><\/p>\n<p>\u00dcks n\u00e4ide on Dockeri sisse ehitatud mehhanism nimega Docker Swarm, mis on juba v\u00e4lja pakutud. Tahaks k\u00e4ivitada midagi tootmises, mis p\u00f5hineb Docker Swarm tehnoloogial.<\/p>\n<p><\/p>\n<p>Konteinerite genereerimine teeb logide haldamise ebamugavaks. Praegu on logid isoleeritud. Need on hajutatud konteinerite vahel. \u00dcks \u00fclesanne on tagada mugav juurdep\u00e4\u00e4s logidele veebivahendi kaudu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arenduse ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/cff8c72dd8af7de1fa0227601bd1d69c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Allikas: <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 4.9.10 - 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 \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\" \/>\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\/et\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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 \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/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\udd47Arenduse ja testimise protsess Docker ja Gitlab CI | ProHoster","description":"Tutvustan Aleksandr Sigat\u0161ovi ettekande \"Arenduse ja testimise protsess Docker + Gitlab CI-ga\" t\u00f5lgendust Inventosest. Need, kes alles hakkavad rakendama arenduse ja testimise protsessi, mis p\u00f5hineb Dockeril + Gitlab CI-l, k\u00fcsivad sageli p\u00f5hiprobleeme. Kust alustada? Kuidas korraldada? Kuidas testida? See ettekande eelis on, et see struktureeritult tutvustab arendusprotsessi ja","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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 \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","og:url":"https:\/\/prohoster.info\/et\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/32526","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=32526"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/32526\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/24326"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=32526"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=32526"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=32526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}