Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Soovitan tutvuda Aleksandr Sigachevi aruande tĂ”lgendusega Inventosest „Arenduse ja testimise protsess Docker + Gitlab CI'ga“

Need, kes alles hakkavad rakendama arenduse ja testimise protsessi Docker + Gitlab CI baasil, kĂŒsivad sageli pĂ”hikĂŒsimusi. Kust alustada? Kuidas korraldada? Kuidas testida?

See aruanne on hea, kuna struktureeritult rÀÀgib arenduse ja testimise protsessist Docker'i ja Gitlab CI kasutamisel. Aruanne on aastast 2017. Ma arvan, et sellest arutelust saab algteadmisi, metoodikat, mÔtteid ja kogemusi.

MĂ€ngi videot

Kellele see huvi pakub, palun lugege edasi.

Minu nimi on Aleksandr Sigachev. Töödan ettevÔttes Inventos. Jagame oma kogemusi Docker'i kasutamisest ja kuidas me seda jÀrk-jÀrgult meie projektides rakendame.

Aruande teema: Arenduse protsess Docker'i ja Gitlab CI kasutamisega.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

See on minu teine aruanne Docker'ist. Esimese aruande ajal kasutasime Docker'it ainult arenduses arendajate masinates. Meie töötajate hulk, kes Docker'it kasutas, oli umbes 2-3 inimest. Aja jooksul oleme meie kogemusi kogunud ja pisut edasi liikunud. Link meie esimesele aruandele.

Mida see aruanne sisaldab? Jagame oma kogemust selle kohta, milliseid takistusi kohtasime ja kuidas probleeme lahendasime. See ei olnud alati ilus, kuid vÔimaldas meil edasi liikuda.

Meie moto: dockerige kÔik, mille teeme.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Milliseid probleeme lahendame?

Kui ettevĂ”ttes on mitu meeskonda, siis on programmeerija jagatud ressurss. On etappe, kus programmeerija tĂ”stetakse ĂŒhest projektist vĂ€lja ja antakse mingiks ajaks teise projekti.

Kuna programmeerija peab kiiresti sisse elama, peab ta allalaadima projekti lĂ€htekoodi ja vĂ”imalikult kiiresti kĂ€ivitama keskkonna, mis vĂ”imaldab tal edasi liikuda, lahendades antud projekti ĂŒlesandeid.

Tavaliselt, kui alustatakse nullist, on projektides vĂ€he dokumentatsiooni. Teave seadistuste kohta on ainult vanade töötajate kĂ€es. Töötajad seadistavad oma töökoha iseseisvalt ĂŒhe kuni kahe pĂ€evaga. Selle kiirendamiseks kasutasime Docker'it.

JĂ€rgmiseks pĂ”hjuseks on arenduse seadistuste standardiseerimine. Oma kogemuse pĂ”hjal on arendajad alati algatusvĂ”imelised. Iga viienda juhtumi puhul kasutatakse kohandatud domeeni, nĂ€iteks vasya.dev. Tema kĂ”rval istub Peeter, kellel on domeen petya.dev. Nad arendavad veebilehte vĂ”i mĂ”nda sĂŒsteemi komponenti kasutades seda domeeninime.

Kui sĂŒsteem suureneb ja need domeeninimed hakkavad ilmuma seadistustes, siis tekib konflikt arenduskeskkondade vahel ning saidi tee kirjutatakse ĂŒle.

Sama juhtub ka andmebaasi seadistustega. Keegi ei mĂ”tle turvalisusele ja töötab tĂŒhja root-parooliga. Kusagil nĂ”udis MySQL paigaldamise kĂ€igus parooli ja parool osutus 123-ks. Tihti juhtub, et andmebaasi konfiguratsioon muutub pidevalt arendaja commit'ide sĂ”ltuvalt. Keegi parandas, keegi ei parandanud konfiguratsiooni. Oli viise, kuidas me viisime mingi testkonfiguratsiooni vĂ€lja .gitignore ja iga arendaja pidi andmebaasi paigaldama. See keeruliseks muudab kĂ€ivitamisprotsessi. Peab lisaks kĂ”ikidele muudele asjadele meeles pidama ka andmebaasi. Andmebaas tuleb initsialiseerida, peab mÀÀrama parooli, peab mÀÀrama kasutaja, looma tabeli ja nii edasi.

Veel ĂŒks probleem on erinevad raamatukogude versioonid. Sageli juhtub, et arendaja töötab erinevate projektidega. On Legacy projekt, mille alustasime viis aastat tagasi (2017. aastast — toimetaja mĂ€rkus). Alustamisel kasutati MySQL 5.5. On ka kaasaegseid projekte, kus pĂŒĂŒame juurutada juba kaasaegsemaid MySQL versioone, nĂ€iteks 5.7 vĂ”i uuem (2017. aastal — toimetaja mĂ€rkus)

Kes töötab MySQL-iga, teab, et need raamatukogud tĂ”mbavad kaasa sĂ”ltuvusi. Kahe andmebaasi samaaegne kĂ€ivitamine on ĂŒsna probleemne. Eriti vanade klientide ĂŒhendamine uue andmebaasiga on keeruline. See omakorda tekitab mitmeid probleeme.

JĂ€rgmine probleem on see, et kui arendaja töötab kohaliku masinaga, kasutab ta kohalikke ressursse, kohalikke faile, kohalikku RAM-i. KĂ”ik suhtlemine toimub lahenduste arendamise ajal raames, et see töötab ĂŒhel masinal. NĂ€iteks vĂ”ib tuua olukorra, kus meil on tootmises 3 back-end serverit, kuid arendaja salvestab failid juurkatalooge ja sealt nginx vĂ”tab faile, et vastata pĂ€ringutele. Kui selline kood lĂ€heb tootmisesse, siis selgub, et fail on olemas ainult ĂŒhes kolmest serverist.

Praegu areneb mikroteenuste suund. Kui jagame oma suured rakendused vÀiksemateks komponentideks, mis omavahel suhtlevad. See vÔimaldab valida konkreetse tehnoloogiakogumi jaoks sobivad tehnoloogiad. Samuti vÔimaldab see jagada töö ja vastutuse arendajate vahel.

Frontend-arendaja, töötades JS-ga, ei mÔjuta praktiselt Backend'i. Backend-arendaja omakorda töötab meie puhul Ruby on Railsiga ega sega Frontendi. Suhtlemine toimub API abil.

Boonusena suutsime Dockerit kasutades optimeerida ressursse Stagingus. Iga projekt nĂ”udis oma spetsiifilisuse tĂ”ttu teatud seadistusi. FĂŒĂŒsiliselt pidi kas eraldama igaĂŒhele virtuaalse serveri ja need eraldi seadistama, vĂ”i jagama mingit muutuvkeskkonda, sest projektid vĂ”isid sĂ”ltuvalt teekide versioonidest ĂŒksteisega lĂ”imuda.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Tööriistad. Mida me kasutame?

  • Otse Docker ise. Dockerfile'is kirjeldatakse ĂŒhe rakenduse sĂ”ltuvusi.
  • Docker-compose — see on sidumine, mis ĂŒhendab mitu meie Docker rakendust.
  • GitLab'i kasutame lĂ€htekoodi hoidmiseks.
  • GitLab-CI kasutame sĂŒsteemsete integratsioonide jaoks.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Ettekanne koosneb kahest osast.

Esimene osa rÀÀgib sellest, kuidas kÀivitasime Dockerit arendajate masinatel.

Teine osa rÀÀgib sellest, kuidas suhelda GitLabiga, kuidas kÀivitame teste ja kuidas me Stagingusse viime.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Docker on tehnoloogia, mis vĂ”imaldab (kasutades deklaratiivset lĂ€henemist) kirjeldada vajalikke komponente. See on nĂ€ide Dockerfile'ist. Siin kuulutame vĂ€lja, et pĂ€rime 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. /appMÀÀrame katalooge app töökataloogiks. Sellest kataloogist paneme vajalikud minimaalsed Gemfile ja Gemfile.lock. SeejĂ€rel tĂ€idame projektide kogumise, mis installivad need sĂ”ltuvused. MĂ€rgime, et konteiner on valmis kuulama vĂ€lisel pordil 3000. Viimane kĂ€sk — see on kĂ€sk, mis otseselt kĂ€ivitab meie rakenduse. Kui me tĂ€idame projekti kĂ€ivitamise kĂ€sku, siis rakendus ĂŒritab kĂ€ivituda ja jĂ€tkab mÀÀratud kĂ€su tĂ€itmist.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

See on minimaalne nĂ€ide docker-compose failist. Antud juhul nĂ€itame, kuidas on ĂŒhendatud 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Ă€ide MySQL-ist — kuid pole midagi, mis takistaks kasutada mĂ”nda muud andmebaasi (PostgreSQL, Redis).

Me vĂ”tame 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Ă€ivitamisel. PĂ€rast seda kĂ€ivitab kĂ€sku, mille me siin tĂ€idame. Kui tagasi vaatame, nĂ€eme, et kĂ€ivitamise kĂ€sk on mÀÀratletud Puma abil. Puma on teenus, mis on kirjutatud Ruby keeles. Teisel juhul ĂŒledefineerime. See kĂ€sk vĂ”ib olla omavÀÀrne sĂ”ltuvalt meie vajadustest vĂ”i ĂŒlesannetest.

Kaasajame ka, et meie arendaja hostmasinas tuleb edastada port 3000 konteineri porti 3000. See toimub automaatselt iptables'i abil ja Dockerisse sisseehitatud mehanismiga.

Arendaja vÔib nagu varem pöörduda igasuguste vÔimalike IP-aadresside poole, nÀiteks kohaliku 127.0.0.1 vÔi masina vÀlise IP-aadressi poole.

Viimane rida ĂŒtleb, et veebi konteiner sĂ”ltub andmebaasi konteinerist. Kui me kutsume veebi konteineri kĂ€ivitama, kĂ€ivitab docker-compose enne andmebaasi konteineri. Andmebaasi kĂ€ivitamisel (tegelikult konteineri kĂ€ivitamise jĂ€rel! Andmebaasi valmisolek ei ole garanteeritud) kĂ€ivitab see meile rakenduse, meie backend-i.

See aitab vĂ€ltida vigu, kui andmebaas ei ole ĂŒlesse seatud, ja sÀÀsta ressursse, kui peatame andmebaasi konteineri, vabastades sellega ressursse teiste projektide jaoks.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Mida annab meile andmebaasi dockeriseerimine projektis. Me fikseerime kĂ”ikide arendajate jaoks MySQL versiooni. See aitab vĂ€ltida mĂ”ningaid vigu, mis vĂ”ivad esineda versioonide erinevuse tĂ”ttu, kui sĂŒntaks, konfiguratsioon ja vaikeseaded muutuvad. See vĂ”imaldab meil mÀÀrata ĂŒhiselt andmebaasi hostname'i, kasutajanime ja parooli. Me eemaldume varasemast konfigureerimisfailide purustamisasust ja konfliktidest.

Meil on vÔimalus kasutada arenduskeskkonnale optimeeritud konfiguratsiooni, mis erineb vaikeseadistusest. Vaikimisi on MySQL seadistatud nÔrgemale riistvarale ja selle jÔudlus on algselt vÀga madal.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Docker vÔimaldab kasutada vajalikku Python, Ruby, NodeJS, PHP versiooni. Vabanevad vajadusest kasutada mingeid versioonihaldureid. Varem kasutasime Ruby jaoks rpm-paketti, mis vÔimaldas versiooni muuta projekti jÀrgi. Samuti vÔimaldab Docker-konteiner sujuvat koodi migreerimist ja versioonimise koos sÔltuvustega. Meil ei teki probleeme, et mÔista versiooni nii interpreteerijalt kui ka koodilt. Versiooni uuendamiseks tuleb vana konteiner peatada ja uus konteiner kÀivitada. Kui midagi lÀheb valesti, saame uue konteineri peatada ja vana konteineri kÀivitada.

PĂ€rast pildi koostamist on konteinerid nii arendus- kui ka tootmises samad. See on eriti oluline suuremate paigalduste puhul.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s Esipaneelil kasutame JavaScipti ja NodeJS-i.

Meie viimane projekt on ReacJS-i peal. Arendaja kÀivitas kÔik konteinerid ja töötas vÀlja, kasutades kuumlaadimist.

SeejĂ€rel kĂ€ivitub JavaScipti koostamisĂŒlesanne ja staatiline kood edastatakse lĂ€bi nginx-i, sÀÀstes ressursse.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Siin on toodud skeem meie viimasest projektist.

Milliseid ĂŒlesandeid lahendasime? Meil oli vajalik ehitada sĂŒsteem, millega suhtlevad mobiilseadmed. Need saavad andmeid. Üks vĂ”imalusi on saata push-teateid sellele seadmele.

Mida me selleks tegime?

Jagasime rakenduse sellisteks komponentideks nagu: administraatori osa JS-is, backend, mis töötab Ruby on Railsi REST-liidese kaudu. Backend suhtleb andmebaasiga. Tulemused, mis genereeritakse, edastatakse kliendile. Administraator suhtleb backend'i ja andmebaasiga REST-liidese kaudu.

Meil oli ka vajadus saata push-teateid. Enne seda oli meil projekt, kus oli rakendatud mehhanism, mis vastutab teadete edastamise eest mobiilplatvormidele.

Me vĂ€lja töötasime sellise skeemi: operaator brauserist suhtleb administraatoriga, administraator suhtleb backendiga, seatakse ĂŒlesanne saata push-teateid.

Push-teated suhtlevad teise komponendiga, mis on rakendatud NodeJS-is.

Seonelad tÀrkavad jÀrjekorrad ja edastamine toimub oma mehhanismi kaudu.

Siin on kujutatud kahte andmebaasi. Praegu kasutame Dockerit kaht sĂ”ltumatut andmebaasi, mis ei ole omavahel seotud. Seejuures on neil ĂŒhine virtuaalvĂ”rk, samas hoiustatakse fĂŒĂŒsilisi andmeid arendaja masina erinevates kataloogides.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Sama asi aga numbrites. Siin on oluline koodi taaskasutamine.

Kui varem rÀÀkisime koodi taaskasutamisest raamatukogudena, siis antud nÀites kasutatakse meie teenust, mis vastutab Push-teatiste eest, tÀismahus serverina. See pakub API-d. Ja selle kaudu suheldakse meie uue arendusega.

Sel ajal kasutasime NodeJS versiooni 4. Praegu (2017. aasta — toimetuse mĂ€rkus) uutes arendustes kasutame versiooni 7. Uute komponentide puhul ei ole probleeme uute raamatukogude versioonide kasutamisega.

Vajadusel saab teostada refaktooringut ja tÔsta NodeJS versiooni Push-teatiste teenusele.

Kui suudame sĂ€ilitada API ĂŒhilduvuse, saame seda asendada teistes projektides, mida varem kasutati.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Mida on vaja, et lisada Docker? Lisame meie reposse Dockerfile, mis kirjeldab vajalikud sÔltuvused. Antud nÀites on komponendid jagatud loogika alusel. See on minimaalne komplekt backend-arendajale.

Uue projekti loomisel loome Dockerfile'i, kirjeldame vajaliku ökosĂŒsteemi (Python, Ruby, NodeJS). Docker-compose'is kirjeldame vajaliku sĂ”ltuvuse — andmebaasi. Kirjeldame, et on vajalik andmebaas sellise versiooniga, andmed hoitakse seal-seal.

Kasutame staatika edastamiseks eraldi kolmandat konteinerit koos nginx-iga. On ette nĂ€htud vĂ”imalus piltide ĂŒleslaadimiseks. Backend paneb need eelnevalt ettevalmistatud mahtudesse, mis on samuti ĂŒhendatud nginx konteinerisse, mis edastab staatikat.

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ĂŒsimust, millist porti vĂ”i milliseid seadistusi rakendada.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Edasi on meil mitu komponenti: admin, inform-API, push-teated.

Selleks, et kĂ”ik kĂ€ivitada, lĂ”ime veel ĂŒhe repo, mille nimetasime dockerized-app. Praegu kasutame mitut repositooriumi iga komponendi jaoks. Need erinevad lihtsalt loogiliselt — GitLabis nĂ€eb see vĂ€lja nagu kaust, ja arendaja masinas on see kaust konkreetse projekti jaoks. Madalamal tasemel asuvad komponendid, mis ĂŒhenduvad.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

See on nĂ€ide dockerized-app'i sisust. Toome siia vĂ€lja ka Docker'i katalooge, kuhu tĂ€idame konfiguratsioonid, mis on vajalikud kĂ”igi komponentide vaheliseks suhtlemiseks. Olemas on README.md, kus on lĂŒhidalt kirjas, kuidas projekti kĂ€ivitada.

Siin rakendasime kahte docker-compose faili. See on tehtud selleks, et saaksime kÀivitada astmeliselt. Kui arendaja töötab pÔhikoosluses, ei vaja ta Push-teateid, siis kÀivitab ta lihtsalt docker-compose faili ja vastavalt sellele kulusid hoitakse kokku.

Kui on vajadus integreerimiseks Push-teated, siis kÀivitatakse docker-compose.yaml ja docker-compose-push.yaml.

Kuna docker-compose.yaml ja docker-compose-push.yaml asuvad kaustas, luuakse automaatselt ĂŒhine virtuaalne vĂ”rk.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Komponentide kirjeldus. See on pÔhjalikum fail, mis vastutab komponentide kogumise eest. Mis siin on tÀhelepanuvÀÀrne? Siin tutvustame komponendi tasakaalustajat.

See on valmis Docker'i pilt, milles kĂ€ivitatakse nginx ja rakendus, mis kuulab Docker socket'i. DĂŒnaamiliselt, konteinerite sisse- ja vĂ€ljalĂŒlitamise ajal, genereerib uuesti nginx'i konfiguraator. Komponentidega suhtlemine jagatakse kolmanda taseme domeeninimede kaupa.

Arenduskeskkonna jaoks kasutame .dev domeeni — api.informer.dev. Rakendused domeeniga .dev on arendaja kohaliku masina peal ligipÀÀsetavad.

Edasi edastatakse konfiguratsioonid iga projekti juurde ja kÔiki projekte kÀivitatakse samal ajal koos.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Kui joonistada graafikaliselt, siis klient on meie brauser vÔi mÔni tööriist, millega teeme pÀringud tasakaalustajale.

Tasakaalustaja mÀÀrab domeeninime jÀrgi, millise konteineri poole pöörduda.

See vÔib olla nginx, mis edastab JS haldustarkvara. See vÔib olla nginx, mis edastab API-d vÔi staatilisi faile, mida edastatakse nginx'i kaudu piltide laadimise nÀol.

Skeemilt on nĂ€ha, et konteinerid on ĂŒhendatud virtuaalsesse vĂ”rku ja peidetud proxy taha.

Arenduskeskkonnas saab konteinerisse pÀÀseda, teades IP-aadressi, kuid me ei kasuta seda pĂ”himĂ”tteliselt. OtseĂŒhenduse vajadus ei tekki peaaegu kunagi.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Milliseid nÀiteid vaadata, et oma rakendus dockerisse panna? Minu arvates on hea nÀide ametlik MySQL docker pilt.

See on piisavalt keeruline. Seal on palju versioone. Kuid selle funktsionaalsus katab mitmeid vajadusi, mis vÔivad tekkida edasise arendamise kÀigus. Kui investeerite aega ja mÔistate, kuidas see kÔik omavahel toimib, siis ei tohiks teil iseseisva rakendamisega probleeme tekkida.

Hub.docker.com-is on tavaliselt lingid github.com-ile, kus on antud toored andmed, mille pÔhjal saab ise pildi koguda.

Edasi on selles hoidlas olemas skript docker-endpoint.sh, mis vastutab algse initsialiseerimise ja rakenduse kÀivitamise töötlemise eest.

Samuti on selles nĂ€ites olemas vĂ”imalus konfigureerida keskkonnamuutujate abil. MÀÀrates keskkonnamuutuja, kui kĂ€itate ĂŒhte konteinerit vĂ”i kasutate docker-compose'i, saate öelda, et peame mÀÀrama MySQL-i root kasutajale tĂŒhja parooli vĂ”i mĂ”ne muu, mille soovime.

On vĂ”imalus luua juhuslik parool. Ütleme, et meil on vajalik kasutaja, peame kasutajale parooli seadma ja andmebaasi looma.

Oma projektides oleme veidi ĂŒhtlustanud Dockerfile'i, mis vastutab initsialiseerimise eest. Oleme seda oma vajadustele kohandanud, et teha lihtsalt kasutaja Ă”iguste laiendamine, mida rakendus kasutab. See vĂ”imaldas hiljem lihtsalt rakenduse konsoolist andmebaasi luua. Ruby rakendustes on olemas kĂ€sk andmebaaside loomiseks, muutmiseks ja kustutamiseks.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

See on nÀide sellest, kuidas konkreetne MySQL versioon github.com-il vÀlja nÀeb. Dockerfile'i saab avada ja vaadata, kuidas seal installatsioon toimub.

Docker-endpoint.sh on skript, mis vastutab sisenemispunkti eest. Algse initsialiseerimise ajal on vajalikud teatud ettevalmistavad toimingud ning kÔik need toimingud on just kokku vÔetud initsialiseerimise skripti.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Liigume teise osa juurde.

Koodi hoidmiseks oleme ĂŒle lĂ€inud gitlabile. See on piisavalt vĂ”imas sĂŒsteem, millel on visuaalne liides.

Üks GitLabi komponente on GitLab CI. See vĂ”imaldab kirjeldada kĂ€sukĂ€ike, mida hiljem kasutatakse koodi edastamise vĂ”i automaatsete testide kĂ€ivitamise korraldamiseks.

Ettekande teema: GitLab CI 2 https://goo.gl/uohKjI — ettekande Ruby Russia klubi kohta — see on piisavalt pĂ”hjalik ja vĂ”ib teid huvitada.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

NĂŒĂŒd vaatame, mida on vaja GitLab CI aktiveerimiseks. GitLab CI kĂ€ivitamiseks piisab, kui panna projekti juurkausta fail .gitlab-ci.yml.

Siin kirjeldame, mida me soovime teha tĂŒĂŒpi testide ja juurutuste jĂ€rjekorra.

KÀivitame skriptid, mis kÀivitavad otse docker-compose'i meie rakenduse koostamiseks. See on nÀide tagaplaanist.

SeejĂ€rel ĂŒtleme, et on vajalik kĂ€ivitada andmebaasi migratsioonid ja teostada testid.

Kui skriptid kĂ€ivitatakse korras ega tagasta tĂ”rke koodi, jĂ€tkab sĂŒsteem vastavalt teise juurutuse etapi juurde.

Juurutuse etapp on hetkel rakendatud stagingule. Me ei ole organiseerinud katkestusteta taaskÀivitust.

Katsume kĂ”ik konteinerid vĂ€lja lĂŒlitada ja seejĂ€rel kĂ€ivitame kĂ”ik konteinerid uuesti, mis on testimise esimesel etapil ehitatud.

KĂ€ivitame juba praeguses muutuvates keskkondades andmebaasi migratsioonid, mille on kirjutanud arendajad.

On mÀrge, et seda tuleks rakendada ainult master harule.

Teiste harude muutmisest ei teostata.

On vÔimalik korraldada versioonide juurutusi harude kaupa.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Kuna seda korraldada, peame installima GitLab Runneri.

See utiliit on kirjutatud Go-s. See on ĂŒhe failiga, nagu Go maailmas tavaks, milleks ei ole vaja mingeid sĂ”ltuvusi.

KĂ€ivitamisel registreerime GitLab Runneri.

Saame GitLabi veebiliideses vÔtme.

SeejÀrel kutsume vÀlja initsialiseerimise kÀsu kÀsurealt.

Seame GitLab Runneri dialoogireĆŸiimis (Shell, Docker, VirtualBox, SSH).

Kood GitLab Runneri peal kÀivitub igal commitil sÔltuvalt .gitlab-ci.yml seadistustest.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Nii see visuaalselt vĂ€lja nĂ€eb GitLabis veebiliideses. PĂ€rast GitLab CI ĂŒhendamist ilmub meil lipp, mis nĂ€itab, millises seisus on praegu ehitus.

Me nÀeme, et 4 minutit tagasi tehti commit, mis lÀbis kÔik testid ja ei pÔhjustanud probleeme.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Me saame vaadata konstruktsioonide ĂŒle lĂ€hemalt. Siin nĂ€eme, et oleme lĂ€binud kaks olekut. Testimise olek ja staging'u olek.

Kui me klikime konkreetsele konstruktioonile, siis seal on konsoolivÀljund kÀsudest, mis kÀidi protsessi jooksul vastavalt .gitlab-ci.yml.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Nii nÀeb vÀlja meie toote ajalugu. NÀeme, et on olnud edukaid katseid. Kui testid ebaÔnnestuvad, siis jÀrgmisse sammu ei liikuda ja kood staging'il ei uuene.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Millised ĂŒlesanded me lahendasime staging'il, kui juurutame dockerit? Meie sĂŒsteem koosneb komponentidest ja meil tekkis vajadus kĂ€ivitada ainult need komponendid, mis olid repozitooriumis uuendatud, mitte kogu sĂŒsteemi korraga.

Sellega seoses pidime kÔik eraldi kaustadesse jagama.

PÀrast seda, kui me seda tegime, tekkis meil probleem, et Docker-compose loob iga kausta jaoks oma vÔrguruumi ja ei nÀe naabrite komponente.

Selle Àrahoidmiseks lÔime kÀsitsi Dockeris vÔrgu. Docker-compose'is mÀÀrasime, et selle projekti jaoks kasutatakse seda vÔrku.

Nii nĂ€eb iga komponent, mis kĂ€ivitub koos selle vĂ”rguga, teisi sĂŒsteemi komponente.

JĂ€rgmine probleem on staging'i jagamine mitme projekti vahel.

Et see kÔik nÀeks kena ja vÔimalikult tootmisvÀgagi sarnane vÀlja, on hea kasutada 80 vÔi 443 porti, mida kasutatakse veebis laialdaselt.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Kuidas me selle lahendasime? Me mÀÀrasime ĂŒhe Gitlab Runner'i kĂ”ikidele suurtele projektidele.

Gitlab vĂ”imaldab kĂ€ivitada mitmeid jaotatud Gitlab Runner'e, mis lihtsalt kordamööda vĂ”tavad kĂ”ik ĂŒlesanded ja töötlevad neid.

Et meil ei tekiks segadust, piirates meie projektide gruppi ĂŒhe Gitlab Runner'iga, mis meie mahtude juures töötab probleemideta.

Me viisime nginx-proxy eraldi kÀivitusskripti ja mÀÀrasime selles kÔikide projektide vÔrgud.

Meie projektil on ĂŒks vĂ”rk, samas kui koormuse tasakaalustaja omab mitu vĂ”rku projektide nimede jĂ€rgi. Ta vĂ”ib domeeninimede jĂ€rgi edasi suunata.

Meie pÀringud tulevad domeeni kaudu 80 porti ja suunatakse konteinerite gruppi, mis teenindab seda domeeni.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Millised olid veel probleemid? See, et vaikimisi kĂ€ivad kĂ”ik konteinerid root kasutajana. See root ei ole vĂ”rreldav sĂŒsteemi hosti root'iga.

Kuid kui siseneda konteinerisse, on see root ja fail, mille me selles konteineris loome, saab root Ôigused.

Kui arendaja on konteinerisse sisenenud ja teinud seal mingeid kÀske, mis genereerivad faile, ning seejÀrel konteinerist vÀlja lÀinud, siis oma töökaustas tal on fail, millele tal ei ole juurdepÀÀsu.

Kuidas seda lahendada? Saame lisada kasutajaid, kes on konteineris.

Millised probleemid tekkisid, kui me kasutasime kasutajat?

Kasutaja loomisel ei vaste sageli grupi ID (UID) ja kasutaja ID (GID).

Selle probleemi lahendamiseks kasutame konteineris kasutajaid, kelle ID on 1000.

Meie juhul vastas see sellele, et enamus arendajatest kasutab Ubuntu operatsioonisĂŒsteemi. Ubuntu OS-is on esimesel kasutajal ID 1000.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Millised on meie plaanid?

Lugeda lÀbi Docker'i dokumentatsioon. Projekt areneb aktiivselt, dokumentatsioon muutub. Teated, mis saadi kaks-kolm kuud tagasi, hakkavad juba aeglaselt aeguma.

Osad probleemid, millega me tegelesime, on tÔenÀoliselt juba lahendatud standardsete vahenditega.

Tahaks vÀga edasi liikuda ja minna otseselt orkestreerimise juurde.

Üks nĂ€ide on Dockerisse sisse ehitatud mehhanism nimega Docker Swarm, mis on pakitud koos. Tahaksin kĂ€ivitada midagi tootmises Docker Swarmi tehnoloogia baasil.

Konteinerite genereerimine muudab logide töötamise ebamugavaks. Praegu on logid isoleeritud. Need on hajutatud konteinerite vahel. Üks ĂŒlesanne on teha logide mugav juurdepÀÀs veebiliidese kaudu.

Arendamise ja testimise protsess Dockeris ja GitLab CI-s

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster