{"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":"Arendamise ja testimise protsess Dockeris ja GitLab CI-s","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Soovin tutvuda Aleksandr Sigat\u0161evi Inventosest ettekande \"Arenduse ja testimise protsess Docker + Gitlab CI\" t\u00f5lgendusega<\/strong><\/p>\n<p><\/p>\n<p>Need, kes alles hakkavad rakendama arenduse ja testimise protsessi Docker + Gitlab CI baasil, k\u00fcsivad sageli p\u00f5hik\u00fcsimusi. Kust alustada? Kuidas korraldada? Kuidas testida?<\/p>\n<p><\/p>\n<p>See aruanne on hea, kuna struktureeritult r\u00e4\u00e4gib arenduse ja testimise protsessist Docker'i ja Gitlab CI kasutamisel. Aruanne on aastast 2017. Ma arvan, et sellest arutelust saab algteadmisi, metoodikat, m\u00f5tteid ja kogemusi. <\/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=\"M\u00e4ngi 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>Kellele see huvi pakub, palun lugege edasi. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<p>Minu nimi on Aleksandr Sigachev. T\u00f6\u00f6dan ettev\u00f5ttes Inventos. Jagame oma kogemusi Docker'i kasutamisest ja kuidas me seda j\u00e4rk-j\u00e4rgult meie projektides rakendame.<\/p>\n<p><\/p>\n<p>Aruande teema: Arenduse protsess Docker'i ja Gitlab CI kasutamisega. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 aruanne Docker'ist. Esimese aruande ajal kasutasime Docker'it ainult arenduses arendajate masinates. Meie t\u00f6\u00f6tajate hulk, kes Docker'it kasutas, oli umbes 2-3 inimest. Aja jooksul oleme meie kogemusi kogunud ja pisut edasi liikunud. Link meie <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/gled\/docker-development-70411088\">esimesele aruandele<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Mida see aruanne sisaldab? Jagame oma kogemust selle kohta, milliseid takistusi kohtasime ja kuidas probleeme lahendasime. See ei olnud alati ilus, kuid v\u00f5imaldas meil edasi liikuda.<\/p>\n<p><\/p>\n<p>Meie moto: dockerige k\u00f5ik, mille teeme.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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, siis on programmeerija jagatud ressurss. On etappe, kus programmeerija t\u00f5stetakse \u00fchest projektist v\u00e4lja ja antakse mingiks ajaks teise projekti.<\/p>\n<p><\/p>\n<p>Kuna programmeerija peab kiiresti sisse elama, 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 alustatakse nullist, on projektides v\u00e4he dokumentatsiooni. Teave seadistuste kohta on ainult vanade t\u00f6\u00f6tajate k\u00e4es. T\u00f6\u00f6tajad seadistavad oma t\u00f6\u00f6koha iseseisvalt \u00fche kuni kahe p\u00e4evaga. Selle kiirendamiseks kasutasime Docker'it.<\/p>\n<p><\/p>\n<p>J\u00e4rgmiseks p\u00f5hjuseks on arenduse seadistuste standardiseerimine. Oma kogemuse p\u00f5hjal on arendajad alati algatusv\u00f5imelised. Iga viienda juhtumi puhul kasutatakse kohandatud domeeni, n\u00e4iteks vasya.dev. Tema k\u00f5rval istub Peeter, kellel on domeen petya.dev. Nad arendavad veebilehte v\u00f5i m\u00f5nda s\u00fcsteemi komponenti kasutades seda domeeninime.<\/p>\n<p><\/p>\n<p>Kui s\u00fcsteem suureneb ja need domeeninimed hakkavad ilmuma seadistustes, siis tekib konflikt arenduskeskkondade vahel ning saidi tee kirjutatakse \u00fcle.<\/p>\n<p><\/p>\n<p>Sama juhtub ka andmebaasi seadistustega. Keegi ei m\u00f5tle turvalisusele ja t\u00f6\u00f6tab t\u00fchja root-parooliga. Kusagil n\u00f5udis MySQL paigaldamise k\u00e4igus parooli ja parool osutus 123-ks. Tihti juhtub, et andmebaasi konfiguratsioon muutub pidevalt arendaja commit'ide s\u00f5ltuvalt. Keegi parandas, keegi ei parandanud konfiguratsiooni. Oli viise, kuidas me viisime mingi testkonfiguratsiooni v\u00e4lja <code>.gitignore<\/code> ja iga arendaja pidi andmebaasi paigaldama. See keeruliseks muudab k\u00e4ivitamisprotsessi. Peab lisaks k\u00f5ikidele muudele asjadele meeles pidama ka andmebaasi. Andmebaas tuleb initsialiseerida, peab m\u00e4\u00e4rama parooli, peab m\u00e4\u00e4rama kasutaja, looma tabeli 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, mille alustasime viis aastat tagasi (2017. aastast \u2014 toimetaja m\u00e4rkus). Alustamisel kasutati MySQL 5.5. On ka kaasaegseid projekte, kus p\u00fc\u00fcame juurutada juba kaasaegsemaid MySQL versioone, n\u00e4iteks 5.7 v\u00f5i uuem (2017. aastal \u2014 toimetaja m\u00e4rkus)<\/p>\n<p><\/p>\n<p>Kes t\u00f6\u00f6tab MySQL-iga, teab, et need raamatukogud t\u00f5mbavad kaasa s\u00f5ltuvusi. Kahe andmebaasi samaaegne k\u00e4ivitamine on \u00fcsna probleemne. Eriti vanade klientide \u00fchendamine uue andmebaasiga on keeruline. See omakorda tekitab mitmeid probleeme.<\/p>\n<p><\/p>\n<p>J\u00e4rgmine probleem on see, et kui arendaja t\u00f6\u00f6tab kohaliku masinaga, kasutab ta kohalikke ressursse, kohalikke faile, kohalikku RAM-i. K\u00f5ik suhtlemine toimub lahenduste arendamise ajal raames, et see t\u00f6\u00f6tab \u00fchel masinal. N\u00e4iteks v\u00f5ib tuua olukorra, kus meil on tootmises 3 back-end serverit, kuid arendaja salvestab failid juurkatalooge ja sealt nginx v\u00f5tab faile, et vastata p\u00e4ringutele. Kui selline kood l\u00e4heb tootmisesse, siis selgub, et fail on olemas ainult \u00fches kolmest serverist.<\/p>\n<p><\/p>\n<p>Praegu areneb mikroteenuste suund. Kui jagame oma suured rakendused v\u00e4iksemateks komponentideks, mis omavahel suhtlevad. See v\u00f5imaldab valida konkreetse tehnoloogiakogumi jaoks sobivad tehnoloogiad. Samuti v\u00f5imaldab see jagada t\u00f6\u00f6 ja vastutuse arendajate vahel.<\/p>\n<p><\/p>\n<p>Frontend-arendaja, t\u00f6\u00f6tades JS-ga, ei m\u00f5juta praktiselt Backend'i. Backend-arendaja omakorda t\u00f6\u00f6tab meie puhul Ruby on Railsiga ega sega Frontendi. Suhtlemine toimub API abil.<\/p>\n<p><\/p>\n<p>Boonusena suutsime Dockerit kasutades optimeerida ressursse Stagingus. Iga projekt n\u00f5udis oma spetsiifilisuse t\u00f5ttu teatud seadistusi. F\u00fc\u00fcsiliselt pidi kas eraldama iga\u00fchele virtuaalse serveri ja need eraldi seadistama, v\u00f5i jagama mingit muutuvkeskkonda, sest projektid v\u00f5isid s\u00f5ltuvalt teekide versioonidest \u00fcksteisega l\u00f5imuda.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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>Otse Docker ise. Dockerfile'is kirjeldatakse \u00fche rakenduse s\u00f5ltuvusi. <\/li>\n<li>Docker-compose \u2014 see on sidumine, mis \u00fchendab mitu meie Docker rakendust.<\/li>\n<li>GitLab'i kasutame l\u00e4htekoodi hoidmiseks.<\/li>\n<li>GitLab-CI kasutame s\u00fcsteemsete integratsioonide jaoks.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 masinatel.<\/p>\n<p><\/p>\n<p>Teine osa r\u00e4\u00e4gib sellest, kuidas suhelda GitLabiga, kuidas k\u00e4ivitame teste ja kuidas me Stagingusse viime.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 on tehnoloogia, mis v\u00f5imaldab (kasutades deklaratiivset l\u00e4henemist) kirjeldada vajalikke komponente. See on n\u00e4ide Dockerfile'ist. Siin kuulutame v\u00e4lja, et p\u00e4rime ametlikult Docker-images Ruby:2.3.0. See sisaldab endas installitud Ruby versiooni 2.3. Me installime vajalikud raamistikud ja NodeJS. Kirjeldame, et loome katalooge. <code>\/app<\/code>M\u00e4\u00e4rame katalooge app t\u00f6\u00f6kataloogiks. Sellest kataloogist paneme vajalikud minimaalsed Gemfile ja Gemfile.lock. Seej\u00e4rel t\u00e4idame projektide kogumise, mis installivad need s\u00f5ltuvused. M\u00e4rgime, et konteiner on valmis kuulama v\u00e4lisel pordil 3000. Viimane k\u00e4sk \u2014 see on k\u00e4sk, mis otseselt k\u00e4ivitab meie rakenduse. Kui me t\u00e4idame projekti k\u00e4ivitamise k\u00e4sku, siis rakendus \u00fcritab k\u00e4ivituda ja j\u00e4tkab m\u00e4\u00e4ratud k\u00e4su t\u00e4itmist.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 on \u00fchendatud kaks konteinerit. Need on andmebaasi teenus ja veebi teenus. Meie veebi rakendused vajavad enamasti andmete salvestamiseks mingit andmebaasi. Kuna kasutame MySQL-i, on see n\u00e4ide MySQL-ist \u2014 kuid pole midagi, mis takistaks kasutada m\u00f5nda muud andmebaasi (PostgreSQL, Redis).<\/p>\n<p><\/p>\n<p>Me v\u00f5tame ametlikest allikatest Docker Hub-ist MySQL 5.7.14 kuva muutumatult. Kuvat, mis vastutab meie veebi rakenduse eest, kogume hetke kataloogist. See kogub meile pildi esmakordsel k\u00e4ivitamisel. P\u00e4rast seda k\u00e4ivitab k\u00e4sku, mille me siin t\u00e4idame. Kui tagasi vaatame, n\u00e4eme, et k\u00e4ivitamise k\u00e4sk on m\u00e4\u00e4ratletud Puma abil. Puma on teenus, mis on kirjutatud Ruby keeles. Teisel juhul \u00fcledefineerime. See k\u00e4sk v\u00f5ib olla omav\u00e4\u00e4rne s\u00f5ltuvalt meie vajadustest v\u00f5i \u00fclesannetest.<\/p>\n<p><\/p>\n<p>Kaasajame ka, et meie arendaja hostmasinas tuleb edastada port 3000 konteineri porti 3000. See toimub automaatselt iptables'i abil ja Dockerisse sisseehitatud mehanismiga. <\/p>\n<p><\/p>\n<p>Arendaja v\u00f5ib nagu varem p\u00f6\u00f6rduda igasuguste v\u00f5imalike IP-aadresside poole, n\u00e4iteks kohaliku 127.0.0.1 v\u00f5i masina v\u00e4lise IP-aadressi poole.<\/p>\n<p><\/p>\n<p>Viimane rida \u00fctleb, et veebi konteiner s\u00f5ltub andmebaasi konteinerist. Kui me kutsume veebi konteineri k\u00e4ivitama, k\u00e4ivitab docker-compose enne andmebaasi konteineri. Andmebaasi k\u00e4ivitamisel (tegelikult konteineri k\u00e4ivitamise j\u00e4rel! Andmebaasi valmisolek ei ole garanteeritud) k\u00e4ivitab see meile rakenduse, meie backend-i.<\/p>\n<p><\/p>\n<p>See aitab v\u00e4ltida vigu, kui andmebaas ei ole \u00fclesse seatud, ja s\u00e4\u00e4sta ressursse, kui peatame andmebaasi konteineri, vabastades sellega ressursse teiste projektide jaoks. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 annab meile andmebaasi dockeriseerimine projektis. Me fikseerime k\u00f5ikide arendajate jaoks MySQL versiooni. See aitab v\u00e4ltida m\u00f5ningaid vigu, mis v\u00f5ivad esineda versioonide erinevuse t\u00f5ttu, kui s\u00fcntaks, konfiguratsioon ja vaikeseaded muutuvad. See v\u00f5imaldab meil m\u00e4\u00e4rata \u00fchiselt andmebaasi hostname'i, kasutajanime ja parooli. Me eemaldume varasemast konfigureerimisfailide purustamisasust ja konfliktidest. <\/p>\n<p><\/p>\n<p>Meil on v\u00f5imalus kasutada arenduskeskkonnale optimeeritud konfiguratsiooni, mis erineb vaikeseadistusest. Vaikimisi on MySQL seadistatud n\u00f5rgemale riistvarale ja selle j\u00f5udlus on algselt v\u00e4ga madal.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 Python, Ruby, NodeJS, PHP versiooni. Vabanevad vajadusest kasutada mingeid versioonihaldureid. Varem kasutasime Ruby jaoks rpm-paketti, mis v\u00f5imaldas versiooni muuta projekti j\u00e4rgi. Samuti v\u00f5imaldab Docker-konteiner sujuvat koodi migreerimist ja versioonimise koos s\u00f5ltuvustega. Meil ei teki probleeme, et m\u00f5ista versiooni nii interpreteerijalt kui ka koodilt. Versiooni uuendamiseks tuleb vana konteiner peatada ja uus konteiner k\u00e4ivitada. Kui midagi l\u00e4heb valesti, saame uue konteineri peatada ja vana konteineri k\u00e4ivitada.<\/p>\n<p><\/p>\n<p>P\u00e4rast pildi koostamist on konteinerid nii arendus- kui ka tootmises samad. See on eriti oluline suuremate paigalduste puhul.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise ja testimise protsess Dockeris ja GitLab CI-s\" src=\"\/wp-content\/uploads\/2019\/04\/185a1bfe257f7e3e0eecdc6e0e0d330f.jpg\" style=\"display:block;margin: 0 auto;\" \/> Esipaneelil kasutame JavaScipti ja NodeJS-i.<\/p>\n<p><\/p>\n<p>Meie viimane projekt on ReacJS-i peal. Arendaja k\u00e4ivitas k\u00f5ik konteinerid ja t\u00f6\u00f6tas v\u00e4lja, kasutades kuumlaadimist.<\/p>\n<p><\/p>\n<p>Seej\u00e4rel k\u00e4ivitub JavaScipti koostamis\u00fclesanne ja staatiline kood edastatakse l\u00e4bi nginx-i, s\u00e4\u00e4stes ressursse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 toodud skeem meie viimasest projektist.<\/p>\n<p><\/p>\n<p>Milliseid \u00fclesandeid lahendasime? Meil oli vajalik ehitada s\u00fcsteem, millega suhtlevad mobiilseadmed. Need saavad andmeid. \u00dcks v\u00f5imalusi on saata push-teateid sellele seadmele. <\/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 Ruby on Railsi REST-liidese kaudu. Backend suhtleb andmebaasiga. Tulemused, mis genereeritakse, edastatakse kliendile. Administraator suhtleb backend'i ja andmebaasiga REST-liidese kaudu.<\/p>\n<p><\/p>\n<p>Meil oli ka vajadus saata push-teateid. Enne seda oli meil projekt, kus oli rakendatud mehhanism, mis vastutab teadete edastamise eest mobiilplatvormidele. <\/p>\n<p><\/p>\n<p>Me v\u00e4lja t\u00f6\u00f6tasime sellise skeemi: operaator brauserist suhtleb administraatoriga, administraator suhtleb backendiga, 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>Seonelad t\u00e4rkavad j\u00e4rjekorrad ja edastamine toimub oma mehhanismi kaudu.<\/p>\n<p><\/p>\n<p>Siin on kujutatud kahte andmebaasi. Praegu kasutame Dockerit kaht s\u00f5ltumatut andmebaasi, mis ei ole omavahel seotud. Seejuures on neil \u00fchine virtuaalv\u00f5rk, samas hoiustatakse f\u00fc\u00fcsilisi andmeid arendaja masina erinevates kataloogides.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 aga numbrites. Siin on oluline koodi taaskasutamine.<\/p>\n<p><\/p>\n<p>Kui varem r\u00e4\u00e4kisime koodi taaskasutamisest raamatukogudena, siis antud n\u00e4ites kasutatakse meie teenust, mis vastutab Push-teatiste eest, t\u00e4ismahus serverina. See pakub API-d. Ja selle kaudu suheldakse meie uue arendusega.<\/p>\n<p><\/p>\n<p>Sel ajal kasutasime NodeJS versiooni 4. Praegu (2017. aasta \u2014 toimetuse m\u00e4rkus) uutes arendustes kasutame versiooni 7. Uute komponentide puhul ei ole probleeme uute raamatukogude versioonide kasutamisega. <\/p>\n<p><\/p>\n<p>Vajadusel saab teostada refaktooringut ja t\u00f5sta NodeJS versiooni Push-teatiste teenusele. <\/p>\n<p><\/p>\n<p>Kui suudame s\u00e4ilitada API \u00fchilduvuse, saame seda asendada teistes projektides, mida varem kasutati.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 reposse Dockerfile, mis kirjeldab vajalikud s\u00f5ltuvused. Antud n\u00e4ites on komponendid jagatud loogika alusel. See on minimaalne komplekt backend-arendajale.<\/p>\n<p><\/p>\n<p>Uue projekti loomisel loome Dockerfile'i, kirjeldame vajaliku \u00f6kos\u00fcsteemi (Python, Ruby, NodeJS). Docker-compose'is kirjeldame vajaliku s\u00f5ltuvuse \u2014 andmebaasi. Kirjeldame, et on vajalik andmebaas sellise versiooniga, andmed hoitakse seal-seal.<\/p>\n<p><\/p>\n<p>Kasutame staatika edastamiseks eraldi kolmandat konteinerit koos nginx-iga. On ette n\u00e4htud v\u00f5imalus piltide \u00fcleslaadimiseks. Backend paneb need eelnevalt ettevalmistatud mahtudesse, mis on samuti \u00fchendatud nginx konteinerisse, mis edastab staatikat.<\/p>\n<p><\/p>\n<p>Nginxi ja mysql konfi jaoks lisasime kausta Docker, kus hoiame vajalikke konfi faile. Kui arendaja kloonib repot enda masinasse, on tal juba projekt, mis on valmis kohalikuks arendamiseks. Ei ole k\u00fcsimust, millist porti v\u00f5i milliseid seadistusi rakendada.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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-teated.<\/p>\n<p><\/p>\n<p>Selleks, et k\u00f5ik k\u00e4ivitada, l\u00f5ime veel \u00fche repo, mille nimetasime dockerized-app. Praegu kasutame mitut repositooriumi iga komponendi jaoks. Need erinevad lihtsalt loogiliselt \u2014 GitLabis n\u00e4eb see v\u00e4lja nagu kaust, ja arendaja masinas on see kaust konkreetse projekti jaoks. Madalamal tasemel asuvad komponendid, mis \u00fchenduvad.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 n\u00e4ide dockerized-app'i sisust. Toome siia v\u00e4lja ka Docker'i katalooge, kuhu t\u00e4idame konfiguratsioonid, mis on vajalikud k\u00f5igi komponentide vaheliseks suhtlemiseks. Olemas on README.md, kus on l\u00fchidalt kirjas, kuidas projekti k\u00e4ivitada.<\/p>\n<p><\/p>\n<p>Siin rakendasime kahte docker-compose faili. See on tehtud selleks, et saaksime k\u00e4ivitada astmeliselt. Kui arendaja t\u00f6\u00f6tab p\u00f5hikoosluses, ei vaja ta Push-teateid, siis k\u00e4ivitab ta lihtsalt docker-compose faili ja vastavalt sellele kulusid hoitakse kokku.<\/p>\n<p><\/p>\n<p>Kui on vajadus integreerimiseks Push-teated, siis k\u00e4ivitatakse 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=\"Arendamise 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 p\u00f5hjalikum fail, mis vastutab komponentide kogumise eest. Mis siin on t\u00e4helepanuv\u00e4\u00e4rne? Siin tutvustame komponendi tasakaalustajat.<\/p>\n<p><\/p>\n<p>See on valmis Docker'i pilt, milles k\u00e4ivitatakse nginx ja rakendus, mis kuulab Docker socket'i. D\u00fcnaamiliselt, konteinerite sisse- ja v\u00e4ljal\u00fclitamise ajal, genereerib uuesti nginx'i konfiguraator. Komponentidega suhtlemine jagatakse kolmanda taseme domeeninimede kaupa.<\/p>\n<p><\/p>\n<p>Arenduskeskkonna jaoks kasutame .dev domeeni \u2014 api.informer.dev. Rakendused domeeniga .dev on arendaja kohaliku masina peal ligip\u00e4\u00e4setavad.<\/p>\n<p><\/p>\n<p>Edasi edastatakse konfiguratsioonid iga projekti juurde ja k\u00f5iki projekte k\u00e4ivitatakse samal ajal koos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 graafikaliselt, siis klient on meie brauser v\u00f5i m\u00f5ni t\u00f6\u00f6riist, millega teeme p\u00e4ringud tasakaalustajale.<\/p>\n<p><\/p>\n<p>Tasakaalustaja m\u00e4\u00e4rab domeeninime j\u00e4rgi, millise konteineri poole p\u00f6\u00f6rduda.<\/p>\n<p><\/p>\n<p>See v\u00f5ib olla nginx, mis edastab JS haldustarkvara. See v\u00f5ib olla nginx, mis edastab API-d v\u00f5i staatilisi faile, mida edastatakse nginx'i kaudu piltide laadimise n\u00e4ol.<\/p>\n<p><\/p>\n<p>Skeemilt on n\u00e4ha, et konteinerid on \u00fchendatud virtuaalsesse v\u00f5rku ja peidetud proxy taha.<\/p>\n<p><\/p>\n<p>Arenduskeskkonnas saab konteinerisse p\u00e4\u00e4seda, teades IP-aadressi, kuid me ei kasuta seda p\u00f5him\u00f5tteliselt. Otse\u00fchenduse vajadus ei tekki peaaegu kunagi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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>Milliseid n\u00e4iteid vaadata, et oma rakendus dockerisse panna? Minu arvates on hea n\u00e4ide ametlik MySQL docker pilt.<\/p>\n<p><\/p>\n<p>See on piisavalt keeruline. Seal on palju versioone. Kuid selle funktsionaalsus katab mitmeid vajadusi, mis v\u00f5ivad tekkida edasise arendamise k\u00e4igus. Kui investeerite aega ja m\u00f5istate, kuidas see k\u00f5ik omavahel toimib, siis ei tohiks teil iseseisva rakendamisega probleeme tekkida.<\/p>\n<p><\/p>\n<p>Hub.docker.com-is on tavaliselt lingid github.com-ile, kus on antud toored andmed, mille p\u00f5hjal saab ise pildi koguda.<\/p>\n<p><\/p>\n<p>Edasi on selles hoidlas olemas skript docker-endpoint.sh, mis vastutab algse initsialiseerimise ja rakenduse k\u00e4ivitamise t\u00f6\u00f6tlemise eest.<\/p>\n<p><\/p>\n<p>Samuti on selles n\u00e4ites olemas v\u00f5imalus konfigureerida keskkonnamuutujate abil. M\u00e4\u00e4rates keskkonnamuutuja, kui k\u00e4itate \u00fchte konteinerit v\u00f5i kasutate docker-compose'i, saate \u00f6elda, et peame m\u00e4\u00e4rama 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 meil on vajalik kasutaja, peame kasutajale parooli seadma ja andmebaasi looma.<\/p>\n<p><\/p>\n<p>Oma projektides oleme veidi \u00fchtlustanud Dockerfile'i, mis vastutab initsialiseerimise eest. Oleme seda oma vajadustele kohandanud, et teha lihtsalt kasutaja \u00f5iguste laiendamine, mida rakendus kasutab. See v\u00f5imaldas hiljem lihtsalt rakenduse konsoolist andmebaasi luua. Ruby rakendustes on olemas k\u00e4sk andmebaaside loomiseks, muutmiseks ja kustutamiseks.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 versioon github.com-il v\u00e4lja n\u00e4eb. Dockerfile'i saab avada ja vaadata, kuidas seal installatsioon toimub.<\/p>\n<p><\/p>\n<p>Docker-endpoint.sh on skript, mis vastutab sisenemispunkti eest. Algse initsialiseerimise ajal on vajalikud teatud ettevalmistavad toimingud ning k\u00f5ik need toimingud on just kokku v\u00f5etud initsialiseerimise skripti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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>Koodi hoidmiseks oleme \u00fcle l\u00e4inud gitlabile. 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\u00e4suk\u00e4ike, mida hiljem kasutatakse koodi edastamise v\u00f5i automaatsete testide k\u00e4ivitamise korraldamiseks.<\/p>\n<p><\/p>\n<p>Ettekande teema: GitLab CI 2 <noindex><a rel=\"nofollow\" href=\"https:\/\/goo.gl\/uohKjI\">https:\/\/goo.gl\/uohKjI<\/a><\/noindex> \u2014 ettekande Ruby Russia klubi kohta \u2014 see on piisavalt p\u00f5hjalik ja v\u00f5ib teid huvitada.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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>N\u00fc\u00fcd vaatame, mida on vaja GitLab CI aktiveerimiseks. GitLab CI k\u00e4ivitamiseks piisab, kui panna projekti juurkausta fail .gitlab-ci.yml.<\/p>\n<p><\/p>\n<p>Siin kirjeldame, mida me soovime teha t\u00fc\u00fcpi testide ja juurutuste j\u00e4rjekorra.<\/p>\n<p><\/p>\n<p>K\u00e4ivitame skriptid, mis k\u00e4ivitavad otse docker-compose'i meie rakenduse koostamiseks. See on n\u00e4ide tagaplaanist.<\/p>\n<p><\/p>\n<p>Seej\u00e4rel \u00fctleme, et on vajalik k\u00e4ivitada andmebaasi migratsioonid ja teostada testid.<\/p>\n<p><\/p>\n<p>Kui skriptid k\u00e4ivitatakse korras ega tagasta t\u00f5rke koodi, j\u00e4tkab s\u00fcsteem vastavalt teise juurutuse etapi juurde.<\/p>\n<p><\/p>\n<p>Juurutuse etapp on hetkel rakendatud stagingule. Me ei ole organiseerinud katkestusteta taask\u00e4ivitust.<\/p>\n<p><\/p>\n<p>Katsume k\u00f5ik konteinerid v\u00e4lja l\u00fclitada ja seej\u00e4rel k\u00e4ivitame k\u00f5ik konteinerid uuesti, mis on testimise esimesel etapil ehitatud.<\/p>\n<p><\/p>\n<p>K\u00e4ivitame juba praeguses muutuvates keskkondades andmebaasi migratsioonid, mille on kirjutanud arendajad.<\/p>\n<p><\/p>\n<p>On m\u00e4rge, et seda tuleks rakendada ainult master harule.<\/p>\n<p><\/p>\n<p>Teiste harude muutmisest ei teostata.<\/p>\n<p><\/p>\n<p>On v\u00f5imalik korraldada versioonide juurutusi harude kaupa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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>Kuna seda korraldada, peame installima GitLab Runneri.<\/p>\n<p><\/p>\n<p>See utiliit on kirjutatud Go-s. See on \u00fche failiga, nagu Go maailmas tavaks, milleks ei ole vaja mingeid s\u00f5ltuvusi.<\/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 v\u00e4lja initsialiseerimise k\u00e4su k\u00e4surealt.<\/p>\n<p><\/p>\n<p>Seame GitLab Runneri dialoogire\u017eiimis (Shell, Docker, VirtualBox, SSH).<\/p>\n<p><\/p>\n<p>Kood GitLab Runneri peal k\u00e4ivitub igal commitil s\u00f5ltuvalt .gitlab-ci.yml seadistustest.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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>Nii see visuaalselt v\u00e4lja n\u00e4eb GitLabis veebiliideses. P\u00e4rast GitLab CI \u00fchendamist ilmub meil lipp, mis n\u00e4itab, millises seisus on praegu ehitus.<\/p>\n<p><\/p>\n<p>Me n\u00e4eme, et 4 minutit tagasi tehti commit, mis l\u00e4bis k\u00f5ik testid ja ei p\u00f5hjustanud probleeme.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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>Me saame vaadata konstruktsioonide \u00fcle l\u00e4hemalt. Siin n\u00e4eme, et oleme l\u00e4binud kaks olekut. Testimise olek ja staging'u olek.<\/p>\n<p><\/p>\n<p>Kui me klikime konkreetsele konstruktioonile, siis seal on konsooliv\u00e4ljund k\u00e4sudest, mis k\u00e4idi protsessi jooksul vastavalt .gitlab-ci.yml.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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>Nii n\u00e4eb v\u00e4lja meie toote ajalugu. N\u00e4eme, et on olnud edukaid katseid. Kui testid eba\u00f5nnestuvad, siis j\u00e4rgmisse sammu ei liikuda ja kood staging'il ei uuene.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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>Millised \u00fclesanded me lahendasime staging'il, kui juurutame dockerit? Meie s\u00fcsteem koosneb komponentidest ja meil tekkis vajadus k\u00e4ivitada ainult need komponendid, mis olid repozitooriumis uuendatud, mitte kogu s\u00fcsteemi korraga.<\/p>\n<p><\/p>\n<p>Sellega seoses pidime k\u00f5ik eraldi kaustadesse jagama.<\/p>\n<p><\/p>\n<p>P\u00e4rast seda, kui me seda tegime, tekkis meil probleem, et Docker-compose loob iga kausta jaoks oma v\u00f5rguruumi ja ei n\u00e4e naabrite komponente.<\/p>\n<p><\/p>\n<p>Selle \u00e4rahoidmiseks l\u00f5ime k\u00e4sitsi Dockeris v\u00f5rgu. Docker-compose'is m\u00e4\u00e4rasime, et selle projekti jaoks kasutatakse seda v\u00f5rku.<\/p>\n<p><\/p>\n<p>Nii n\u00e4eb iga komponent, mis k\u00e4ivitub koos selle v\u00f5rguga, teisi s\u00fcsteemi komponente.<\/p>\n<p><\/p>\n<p>J\u00e4rgmine probleem on staging'i jagamine mitme projekti vahel.<\/p>\n<p><\/p>\n<p>Et see k\u00f5ik n\u00e4eks kena ja v\u00f5imalikult tootmisv\u00e4gagi sarnane v\u00e4lja, on hea kasutada 80 v\u00f5i 443 porti, mida kasutatakse veebis laialdaselt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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? Me m\u00e4\u00e4rasime \u00fche Gitlab Runner'i k\u00f5ikidele suurtele projektidele.<\/p>\n<p><\/p>\n<p>Gitlab v\u00f5imaldab k\u00e4ivitada mitmeid jaotatud Gitlab Runner'e, mis lihtsalt kordam\u00f6\u00f6da v\u00f5tavad k\u00f5ik \u00fclesanded ja t\u00f6\u00f6tlevad neid.<\/p>\n<p><\/p>\n<p>Et meil ei tekiks segadust, piirates meie projektide gruppi \u00fche Gitlab Runner'iga, mis meie mahtude juures t\u00f6\u00f6tab probleemideta.<\/p>\n<p><\/p>\n<p>Me viisime nginx-proxy eraldi k\u00e4ivitusskripti ja m\u00e4\u00e4rasime selles k\u00f5ikide projektide v\u00f5rgud. <\/p>\n<p><\/p>\n<p>Meie projektil on \u00fcks v\u00f5rk, samas kui koormuse tasakaalustaja omab mitu v\u00f5rku projektide nimede j\u00e4rgi. Ta v\u00f5ib domeeninimede j\u00e4rgi edasi suunata.<\/p>\n<p><\/p>\n<p>Meie p\u00e4ringud tulevad domeeni kaudu 80 porti ja suunatakse konteinerite gruppi, mis teenindab seda domeeni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 olid veel probleemid? See, et vaikimisi k\u00e4ivad k\u00f5ik konteinerid root kasutajana. See root ei ole v\u00f5rreldav s\u00fcsteemi hosti root'iga.<\/p>\n<p><\/p>\n<p>Kuid kui siseneda konteinerisse, on see root ja fail, mille me selles konteineris loome, saab root \u00f5igused.<\/p>\n<p><\/p>\n<p>Kui arendaja on konteinerisse sisenenud ja teinud seal mingeid k\u00e4ske, mis genereerivad faile, ning seej\u00e4rel konteinerist v\u00e4lja l\u00e4inud, siis oma t\u00f6\u00f6kaustas tal on fail, millele tal ei ole juurdep\u00e4\u00e4su.<\/p>\n<p><\/p>\n<p>Kuidas seda lahendada? Saame lisada kasutajaid, kes on konteineris.<\/p>\n<p><\/p>\n<p>Millised probleemid tekkisid, kui me kasutasime kasutajat?<\/p>\n<p><\/p>\n<p>Kasutaja loomisel ei vaste sageli grupi ID (UID) ja kasutaja ID (GID).<\/p>\n<p><\/p>\n<p>Selle probleemi lahendamiseks kasutame konteineris kasutajaid, kelle ID on 1000.<\/p>\n<p><\/p>\n<p>Meie juhul vastas see sellele, et enamus arendajatest kasutab Ubuntu operatsioonis\u00fcsteemi. Ubuntu OS-is on esimesel kasutajal ID 1000.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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>Lugeda l\u00e4bi Docker'i dokumentatsioon. Projekt areneb aktiivselt, dokumentatsioon muutub. Teated, mis saadi kaks-kolm kuud tagasi, hakkavad juba aeglaselt aeguma. <\/p>\n<p><\/p>\n<p>Osad probleemid, millega me tegelesime, on t\u00f5en\u00e4oliselt juba lahendatud standardsete vahenditega.<\/p>\n<p><\/p>\n<p>Tahaks v\u00e4ga edasi liikuda ja minna otseselt orkestreerimise juurde.<\/p>\n<p><\/p>\n<p>\u00dcks n\u00e4ide on Dockerisse sisse ehitatud mehhanism nimega Docker Swarm, mis on pakitud koos. Tahaksin k\u00e4ivitada midagi tootmises Docker Swarmi tehnoloogia baasil.<\/p>\n<p><\/p>\n<p>Konteinerite genereerimine muudab logide t\u00f6\u00f6tamise ebamugavaks. Praegu on logid isoleeritud. Need on hajutatud konteinerite vahel. \u00dcks \u00fclesanne on teha logide mugav juurdep\u00e4\u00e4s veebiliidese kaudu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Arendamise 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 5.0.1.1 - 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\/et\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\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.\" \/>\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 Dockeriga ning Gitlab CI | ProHoster","description":"Kutsun \u00fcles tutvuma Aleksandr Sigat\u0161evi ettekande t\u00f5lgendusega Inventosest \"Arenduse ja testimise protsess Docker + Gitlab CI\". Need, kes alles alustavad arendusprotsessi rakendamist.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}