Soovin tutvustada Alexander SigatĆĄovi ettekande analĂŒĂŒsi ettevĂ”ttest Inventos "Arenduse ja testimise protsess Dockeris + GitLab CI-s"
Need, kes just alustavad Docker + GitLab CI arenduse ja testimise protsessi rakendamist, kĂŒsivad sageli pĂ”hikĂŒsimusi. Kust alustada? Kuidas korraldada? Kuidas teste teha?
See ettekande on hea, kuna see struktureeritult rÀÀgib arenduse ja testimise protsessist Dockerit ja GitLab CI-d kasutades. Ettekande originaal on aastast 2017. Olen kindel, et selle ettekande kaudu on vÔimalik omandada pÔhialuseid, metoodikat, ideed ja kasutuskogemust.

Huvitav, palun vaata edasi.
Minu nimi on Alexander Sigatƥov. Töötan ettevÔttes Inventos. RÀÀgin oma kogemusest Dockerit kasutades ja sellest, kuidas me seda jÀrk-jÀrgult oma projektides rakendame.
Ettekande teema: Arendusprotsess Dockerit ja GitLab CI-d kasutades.

See on minu teine ettekande Dockerist. Esimese ettekande ajal kasutasime Dockerit ainult arenduses arendajate masinates. Töötajate arv, kes Dockerit kasutasid, oli umbes 2-3 inimest. Aja jooksul oleme omandanud kogemusi ja liikunud natuke edasi. Lingid meie .
Mida kÀsitletakse selles ettekandes? Jagame kogemusi, mida komistuskive oleme kohanud ja kuidas oleme probleeme lahendanud. See ei ole alati olnud ilus, kuid vÔimaldas edasi liikuda.
Meie moto: dockerige kÔik, mida meie kÀed ulatuvad.

Milliseid probleeme lahendame?
Kui ettevĂ”ttes on mitu meeskonda, on programmeerija jagatud ressurss. On etappe, kus programmeerija tĂ”mmatakse ĂŒhe projektist vĂ€lja ja antakse mĂ”neks ajaks teise projekti.
Et programmeerija saaks kiiresti sisse elada, 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 alustada nullist, on projekti dokumentatsioon napp. Teave seadistamise kohta on ainult vanadel töötajatel. Töötajad seadistavad oma töökoha iseseisvalt ĂŒhe kuni kahe pĂ€eva jooksul. Selle protsessi kiirendamiseks rakendasime Dockeri.
JĂ€rgmine pĂ”hjus on seadete standardiseerimine arenduses. Minu kogemuse jĂ€rgi on arendajad alati algatusvĂ”imelised. Igas viiendas juhtumis kasutatakse kohandatud domeeni, nĂ€iteks vasya.dev. KĂ”rval istub naaber Pjotr, kellel on domeen petya.dev. Nad arendavad veebisaiti vĂ”i mĂ”nda sĂŒsteemi komponenti, kasutades seda domeeninime.
Kui sĂŒsteem laienevad ja need domeeninimid hakkavad sattuma seadistustesse, siis tekib arenduse keskkondade konflikt ja veebisaidi tee kirjutatakse ĂŒmber.
Sama juhtub andmebaasi seadistustega. Keegi ei mĂ”tle turvalisusele ja töötab tĂŒhja root-parooliga. Kellegi installimise ajal nĂ”udis MySQL parooli ja see osutus 123. Sage on see, et andmebaasi konfi muudeti pidevalt arendaja commit'i pĂ”hjal. Keegi parandas, keegi ei parandanud konfi. Oli nutikusi, kus me tĂ”ime mĂ”ne testkonfi vĂ€lja. .gitignore ja iga arendaja pidi andmebaasi installima. See raskendas protsessi alustamist. Lisaks sellele tuleb meeles pidada ka andmebaasi. Andmebaas tuleb initsialiseerida, tuleb mÀÀrata parool, mÀÀrata kasutaja, luua tabel ja nii edasi.
Veel ĂŒks probleem on erinevad raamatukogude versioonid. Sageli juhtub, et arendaja töötab erinevate projektidega. On Legacy projekt, mida alustati viis aastat tagasi (2017. aastast â toim. mĂ€rkus). Alustamisel kasutati MySQL 5.5. On ka kaasaegseid projekte, kus pĂŒĂŒame rakendada juba uuemaid MySQL versioone, nĂ€iteks 5.7 vĂ”i vanemaid (2017. aastal â toim. mĂ€rkus).
Kes töötab MySQL-iga, teab, et need raamatukogud kaasnevad sĂ”ltuvustega. On ĂŒsna problemaatiline kĂ€ivitada kahte andmebaasi korraga. VĂ€hemalt vanade klientide ĂŒhendamine uue andmebaasiga on keeruline. See tekitab omakorda mitmeid probleeme.
JĂ€rgmine probleem tekib siis, kui arendaja töötab kohalikes keskkondades. Ta kasutab kohalikke ressursse, kohalikke faile ja kohalikku RAM-i. KĂ”ik interaktsioonid probleemide lahendamise hetkel toimuvad selle raames, et see töötab ĂŒhel seadmel. NĂ€iteks vĂ”ib tuua olukorra, kus meie tootmises on 3 tagapoolte serverit, kuid arendaja salvestab failid juurkatalooge ja Nginx vĂ”tab failid sealt vastamiseks. Kui selline kood jĂ”uab tootmisse, on fail siiski kohal vaid ĂŒhel kolmest serverist.
Praegu areneb mikroteenuste suund. Kui jagame oma suured rakendused vĂ€iksemate komponentideks, mis omavahel suhtlevad. See vĂ”imaldab valida tehnoloogiad vastavalt konkreetsele ĂŒlesande kogumile. Samuti vĂ”imaldab see jagada tööd ja vastutuse valdkondi arendajate vahel.
Frontend-arendaja, arendades JavaScripti, ei mÔjuta tagapoolt. Tagapoolte arendaja omakorda arendab, meie puhul, Ruby on Rails'i ja ei sega frontend'i. Suhtlus toimub API kaudu.
Boonusena kasutades suutsime Dockeriga Ă€ra kasutada ressursse Stagingus. Iga projekt nĂ”udis oma eripĂ€rast tingituna spetsiifilisi seadistusi. FĂŒĂŒsiliselt tuli kas eraldada igaĂŒhele virtuaalserver vĂ”i seada need eraldi, vĂ”i jagada mĂ”ni muutuv keskkond, mille tĂ”ttu projektide ĂŒksteisega sĂ”ltuvalt teegiversioonidest suhtlemine mĂ”jutas.

Tööriistad. Mida me kasutame?
- Otseselt ise Dockerit. Dockerfile'is mÀÀratakse ĂŒhe rakenduse sĂ”ltuvused.
- Docker-compose on kombinatsioon, mis ĂŒhendab mitmeid meie Docker rakendusi.
- GitLabit kasutame lÀhtekoodi hoidmiseks.
- GitLab-CI't kasutame sĂŒsteemseks integreerimiseks.

Ettekanne koosneb kahest osast.
Esimene osa rÀÀgib sellest, kuidas kÀivitasime Dockerit arendajate masinates.
Teine osa rÀÀgib, kuidas suhelda GitLabiga, kuidas kÀivitame teste ja kuidas viime Stagingusse.

Docker â see tehnoloogia, mis vĂ”imaldab (kasutades deklareerivat lĂ€henemist) kirjeldada vajalikke komponente. See on nĂ€idis Dockerfile'ist. Siin kuulutame, et me pĂ€rime ametlikust Docker-pildist Ruby: 2.3.0. See sisaldab installitud Ruby versiooni 2.3. Me installime vajalikud ehitusraamatukogud ja NodeJS. Kirjeldame, et loome katalooge. /appMÀÀrame katalooge app töökaustaks. Selle katalooge paigutame vajaliku minimaalset Gemfile'i ja Gemfile.lock'i. SeejĂ€rel tĂ€idame projektide koostamise, mis installivad sĂ”ltuvused, mis on selle pildi jaoks vajalikud. NĂ€itame, et konteiner on valmis kuulama vĂ€lisel pordil 3000. Viimane kĂ€sk on kĂ€sk, mis kĂ€ivitab meie rakenduse. Kui me kĂ€ivitame projekti, siis rakendus pĂŒĂŒab töötada ja kĂ€ivitab antud kĂ€su.

See on minimaalne nĂ€ide docker-compose failist. Antud juhul nĂ€itame, kuidas ĂŒhendatakse kahte konteinerit: andmebaasi teenus ja veebi teenus. Meie veebi rakendused vajavad peamiselt andmete salvestamiseks mingit andmebaasi. Kuna kasutame MySQL-i, toome nĂ€ite MySQL-i pealt, kuid pole midagi takistada ka mĂ”ne teise andmebaasi (PostgreSQL, Redis) kasutamisel.
VĂ”tame ametlikust allikast Docker hub-ist MySQL 5.7.14 pildi ilma muudatusteta. Pilt, mis vastutab meie veebi rakenduse eest, kogume kĂ€esolevast kataloogist. Esimese kĂ€ivitamise ajal loob see meile pildi. PĂ€rast seda kĂ€ivitab kĂ€su, mida siin tĂ€idame. Kui lĂ€heme tagasi, nĂ€eme, et kĂ€ivitamise kĂ€sk on mÀÀratud Puma kaudu. Puma on Ruby-s kirjutatud teenus. Teises puhul ĂŒle kirjutame. See kĂ€sk vĂ”ib olla suvaline, sĂ”ltuvalt meie vajadustest vĂ”i ĂŒlesannetest.
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.
Arendaja saab nagu varem pöörduda mis tahes saadaval oleva IP-aadressi poole, nÀiteks 127.0.0.1 kohaliku vÔi vÀlist IP-aadressi poole.
Viimane rida ĂŒtleb, et web konteiner sĂ”ltub db konteinerist. Kui kutsume ĂŒles web konteineri kĂ€ivitamist, kĂ€ivitab docker-compose eelnevalt meie andmebaasi. Andmebaasi kĂ€ivitamine (tegelikult pĂ€rast konteineri kĂ€ivitamist! Andmebaasi valmidust see ei garanteeri) kĂ€ivitab meie rakenduse, meie backend'i.
See vÔimaldab vÀltida vigu, kui andmebaas ei ole kÀivitatud, ja aitab sÀÀsta ressursse, kui peatame andmebaasi konteineri, vabastades seelÀbi ressursid teiste projektide jaoks.

Mida me saame projekti andmebaasi dockeriseerimisega. Me fikseerime kĂ”igile arendajatele MySQL versiooni. See aitab vĂ€ltida mĂ”ningaid vigu, mis vĂ”ivad tekkida versioonide lahknevuse tĂ”ttu, kui muutub sĂŒntaks, konfiguratsioon vĂ”i vaike seadistused. See vĂ”imaldab mÀÀrata ĂŒhised hostname, login ja password andmebaasi jaoks. Loodame loobuda varasemast konfigureerimist failide nimetuste segadusest ja konfliktidest.
Meil on vÔimalus kasutada arenduskeskkonnas optimeeritumat seadistust, mis erineb vaikeseadistusest. MySQL on vaikimisi seadistatud nÔrkade masinate jaoks ja selle jÔudlus on algselt vÀga madal.

Docker vĂ”imaldab kasutada vajalikku versiooni Python, Ruby, NodeJS, PHP tĂ”lgendajat. Me vabaneme vajadusest kasutada mingit versioonihaldurit. Varem kasutasime Ruby jaoks rpm-paketti, mis vĂ”imaldas muuta versiooni vastavalt projektile. See vĂ”imaldab Docker-konteineri kaudu sujuvalt migreerida koodi ja versioonida seda koos sĂ”ltuvustega. Meil ei teki probleemi teada, milline on nii tĂ”lgendaja kui ka koodi versioon. Versiooniuuendamiseks tuleb vana konteiner peatada ja uus konteiner ĂŒles tĂ”sta. Kui midagi lĂ€heb valesti, saame uue konteineri peatada ja vana konteineri taas ĂŒles tĂ”sta.
PĂ€rast pildi koostamist on konteinerid nii arenduses kui tootmises identsed. See on eriti oluline suurte paigaldiste korral.
Frondendis kasutame JavaScripti ja NodeJS-i.
Meie viimane projekt on praegu ReacJS-is. Arendaja kÀivitas kÔik konteinerid ja töötas kuumlaadimisega.
See rikas JavaScript'i ĂŒlesanne ja koondatud kood antakse nginx'i kaudu edasi, sÀÀstes ressursse.

Siin on meie viimane projekti skeem.
Milliseid ĂŒlesandeid lahendasime? Meil oli vajalik luua sĂŒsteem, millega suhtlevad mobiilseadmed. Need saavad andmeid. Ăks vĂ”imalus on saata push-teateid sellesse seadmesse.
Mida me selleks tegime?
Jagasime rakenduse sellisteks komponentideks nagu: administraatori osa JS'is, backend, mis töötab REST-liidese kaudu Ruby on Rails'is. Backend suhtleb andmebaasiga. Tulemused, mis genereeritakse, antakse kliendile. Administraator ja backend suhtlevad ja andmebaas REST-liidese kaudu.
Samuti oli meil vajadus saata Push-teateid. Enne seda oli meil projekt, kus oli rakendatud mehhanism, mis vastutas teadete edastamise eest mobiilplatvormidele.
Me töötasime vĂ€lja sellise skeemi: operaator brauserist suhtleb administraatori osaga, administraator suhtleb backend'iga, seatakse ĂŒlesanne saata Push-teateid.
Push-teated suhtlevad teise komponendiga, mis on rakendatud NodeJS'is.
Oote jÀrjekorrad ja edasine teavitamise mehhanism toimib selle jÀrgi.
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 ĂŒhine virtuaalne vĂ”rk, samas kui fĂŒĂŒsilised andmed on salvestatud arendaja masina erinevatesse kataloogidesse.

Sama asi, kuid numbritega. Siin on koodide taaskasutamine oluline.
Kui varem rÀÀkisime koodide taaskasutamisest raamatukogudena, siis antud nÀites meie teenus, mis vastutab Push-teavituste eest, taaskasutatakse tÀieliku serverina. See pakub API-d. Ja meie uus arendus suhtleb sellega.
Sel hetkel kasutasime me NodeJS versiooni 4. Praegu (2017. aastal â mĂ€rkus toimetajalt) kasutame me uutes arendustes NodeJS versiooni 7. Uutes komponentides ei ole probleemiks kasutada uusi raamatukogude versioone.
Vajadusel saab lÀbi viia refaktoreerimise ja tÔsta NodeJS versiooni Push-teavituste teenuses.
Ja kui suudame sĂ€ilitada API ĂŒhilduvuse, saame selle asendada teiste projektidega, millega oleme varem töötanud.

Mida on vaja, et lisada Docker? Lisame meie hoidlasse Dockerfile'i, mis kirjeldab vajalikke sÔltuvusi. Antud nÀites on komponendid jagatud loogika jÀrgi. See on minimaalne komplekt backend-arendajale.
Uue projekti loomisel loome Dockerfile'i, kirjeldame vajalikku ökosĂŒsteemi (Python, Ruby, NodeJS). Docker-compose'is kirjeldame vajalike sĂ”ltuvuste â andmebaasi. Kirjeldame, et vajame andmebaasi teatud versioonis, andmete salvestamiseks seal ja seal.
Kasutame staatika edastamiseks eraldi kolmandat konteinerit nginx'iga. On ette nÀhtud piltide laadimise vÔimalus. Backend paigutab need juba ette valmistatud mahutisse, mis on samuti monteeritud nginx'iga konteinerisse, mis edastab staatikat.
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ĂŒsimust ei teki, millist porti vĂ”i milliseid seadeid rakendada.

Edasi on meil mitu komponenti: admin, inform-API, push-teavitused.
Selle kĂ”ike kĂ€ivitamiseks oleme loonud veel ĂŒhe reposti, mille nimeks panime dockerized-app. Praegu kasutame mitu reposti igale komponendile. Need erinevad lihtsalt loogiliselt â GitLabis nĂ€eb see vĂ€lja nagu kaust, ja arendaja seadmes on see konkreetse projekti kaust. Madalamal tasemel asuvad komponendid, mis saavad ĂŒhenduda.

See on just dockerized-app sisu nĂ€ide. Toome siia ka Docker katalooge, kuhu tĂ€idame konfiguratsioonid, mis on vajalikud kĂ”igi komponentide vaheliseks suhtlemiseks. Seal on README.md, kus on lĂŒhidalt seletatud, kuidas projekti kĂ€ivitada.
Siin oleme kasutanud kahte docker-compose faili. See on tehtud selleks, et arendaja saaks seda kÀitada samm-sammult. Kui arendaja töötab pÔhikomplektiga ja Push-teavitusi ei vaja, kÀivitab ta lihtsalt docker-compose faili, sÀÀstes seelÀbi ressursse.
Kui on vaja integreerida Push-teavitusi, siis kÀivitub 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.

Komponentide kirjeldus. See on ulatuslikum fail, mis vastutab komponentide kogumise eest. Mis siin tÀhelepanuvÀÀrne? Siin me tutvustame tasakaalustajat.
See on valmis Docker-pilt, kus töötab nginx ja rakendus, mis kuulab Docker soket. DĂŒnaamiliselt, konteinerite sisse- ja vĂ€ljalĂŒlitamise kĂ€igus, genereeritakse nginx konfiguraatsioon uuesti. Komponentidega suhtlemine toimub kolmanda tasandi domeeninimede kaudu.
Arenduskeskkonnas kasutame domeeni .dev â api.informer.dev. Rakendused domeeniga .dev on arendaja kohalikul masinal kergesti ligipÀÀsetavad.
SeejÀrel edastatakse konfiguraatsioonid iga projekti juurde ja kÀivitatakse kÔik projektid koos samal ajal.

Kui joonistada graafiliselt, siis klient on meie brauser vÔi mÔni muu tööriist, millega me esitame taotlusi tasakaalustajale.
Tasakaalustaja mÀÀrab domeeninime kaudu, millise konteineriga ĂŒhendust vĂ”tta.
See vÔib olla nginx, mis edastab JS administraatoreid. See vÔib olla nginx, mis edastab API-d vÔi staatilisi faile, mida nginx edastab piltide allalaadimisel.
Kavas on nĂ€htav, et konteinerid on ĂŒhendatud virtuaalsesse vĂ”rku ja peidetud proksi taha.
Arendaja masinasse on vÔimalik konteinerile juurde pÀÀseda, tundes IP-d, kuid me ei kasuta seda pÔhimÔtteliselt. Otsese juurdepÀÀsu vajadusi praktiliselt ei esine.

Millist nÀidet peaks vaatama, et oma rakendust dockeriseerida? Minu arvates on ametlik MySQL docker pilt hea nÀide.
See on piisavalt keeruline. Seal on palju versioone. Kuid selle funktsionaalsus katab mitmeid vajadusi, mis vÔivad arenguprotsessis tekkida. Kui kulutate aega ja mÔistate, kuidas kÔik see omavahel toimib, siis arvan, et iseseisvas rakenduses teil probleeme ei teki.
Hub.docker.com lehelt leiate tavaliselt lingid github.com-ile, kus on toodud toored andmed, mille pÔhjal saate ise pildi kokku panna.
Edasi, selles repos on olemas skript docker-endpoint.sh, mis vastutab esialgse initsialiseerimise ja rakenduse kÀivitamise edasise töötlemise eest.
Selles nĂ€ites on samuti olemas seadistusvĂ”imalus keskkonnamuutujate kaudu. MÀÀrates keskkonnamuutujat kas ĂŒksiku konteineri kĂ€ivitamisel vĂ”i docker-compose'i kaudu, saame öelda, et peame seadma MySQL-i root-kasutajale tĂŒhja parooli vĂ”i mĂ”ne muu, mille soovime.
On vĂ”imalus luua juhuslik parool. Ătleme, et vajame kasutajat, peame kasutajale parooli seadma ja looma andmebaasi.
Oma projektides oleme natuke ĂŒhtlustanud Dockerfile'i, mis vastutab initsialiseerimise eest. Oleme selle oma vajadustele vastavaks muutnud, et lihtsalt laiendada rakenduse kasutaja Ă”igusi. See vĂ”imaldas hiljem lihtsalt luua andmebaasi rakenduse konsolist. Ruby rakendustes on kĂ€sk andmebaaside loomise, muutmise ja kustutamise jaoks.

See on nÀide sellest, kuidas konkreetne MySQL-i versioon vÀlja nÀeb github.com-is. Dockerfile'i saab avada ja vaadata, kuidas seal installimine toimub.
docker-endpoint.sh skript, mis vastutab sisenemispunkti eest. Algse seadistamise kÀigus on vajalikud teatud ettevalmistustegevused ja kÔik need tegevused on koondatud just algatusskripti.

Liigume teise osa juurde.
Allikakoodide salvestamiseks oleme lĂ€inud gitlabi. See on piisavalt vĂ”imas sĂŒsteem, millel on visuaalne liides.
Ăks Gitlabi komponente on Gitlab CI. See vĂ”imaldab kirjeldada kĂ€ske, mis hiljem kasutatakse koodide tarnesĂŒsteemi korraldamiseks vĂ”i automaatsete testide kĂ€ivitamiseks.
Gitlab CI ettekannet 2 â ettekanne Ruby Russia klubist â piisavalt pĂ”hjalik ja vĂ”ib-olla huvitab see teid.

Praegu vaatame, mida on vaja, et aktiveerida Gitlab CI. Gitlab CI kÀivitamiseks piisab, kui panna projekti juure faili .gitlab-ci.yml.
Siin kirjeldame, mida soovime teha testimise ja juurutamise sarnaste olekute jÀrjestuses.
KÀivitame skripte, mis kutsuvad esile docker-compose'i meie rakenduse koostamise. See on nÀiteks backend.
SeejĂ€rel ĂŒtleme, et on vajalik migratsioonide kĂ€itamine andmebaasi muutmiseks ja testide lĂ€biviimine.
Kui skriptid töötavad korrektselt ja ei tagasta viga, siis lĂ€heb sĂŒsteem vastavalt teise etappi.
Deploy-etapp on hetkel rakendatud staging-platvormil. Me ei ole korraldanud katkestusteta sÔltumatut taaskÀivitust.
Sundime kĂ”ik konteinerid kinni ja tĂ”stame need seejĂ€rel uuesti ĂŒles, kasutades esimeses etapis testimiseks kokku pandud konteinerite pilte.
KĂ€ivitame jooksva muutujate keskkonna andmebaasi migreerimised, mille on kirjutanud arendajad.
On mÀrk, et seda tuleks rakendada ainult haru 'master' puhul.
Teiste harude puhul ei toimu tÔstmist.
On vÔimalik korraldada versioonide tÔstmisi harude jÀrgi.

Selle edasise korraldamiseks peame installima GitLab Runneri.
See utiliit on kirjutatud Golangis. See on ĂŒhekordne fail, nagu Golangi maailmas tavaline, mis ei vaja ĂŒhtegi sĂ”ltuvust.
KĂ€ivitamisel registreerime GitLab Runneri.
Saame GitLabi veebiliideses vÔtme.
SeejÀrel kutsume esile algatamise kÀsu kÀsurealt.
Konfigureerime GitLab Runneri dialoogireĆŸiimis (Shell, Docker, VirtualBox, SSH).
Kood GitLab Runneris kÀivitub iga commit'i korral sÔltuvalt .gitlab-ci.yml seadistusest.

Kuidas see Gitlabis veebiliideses visuaalselt vĂ€lja nĂ€eb. PĂ€rast Gitlab CI ĂŒhendamist ilmub meile lipp, mis nĂ€itab, millises olekus praegu build on.
NÀeme, et 4 minutit tagasi tehti commit, mis lÀbis kÔik testid ja ei tekitanud probleeme.

Saame lÀhemalt vaadata build'e. Siit nÀeme, et oleme lÀbinud kaks etappi: testimise etapp ja deploy etapp staging'is.
Kui klÔpsame konkreetse build'i peal, nÀeme seal konsoolivÀljundit kÀskudest, mis kÀidi vastavalt .gitlab-ci.yml failile.

Selline on meie toote ajalugu. NÀeme, et oleme olnud edukaid katseid. Kui testid nurjusid, siis jÀrgmisse etappi ei liikuda ja koodi staging'is ei uuendata.

Milliseid ĂŒlesandeid lahendasime staging'is dockerit rakendades? Meie sĂŒsteem koosneb komponentidest ja meil tekkis vajadus taaskĂ€ivitada ainult osi komponentidest, mis olid repostos uuendatud, mitte kogu sĂŒsteemi korraga.
Selleks pidime kÔik eraldi kaustadesse jaotama.
PÀrast seda, kui olime selle teinud, tekkis meil probleem, et Docker-compose loob iga kausta jaoks oma vÔrgu, mistÔttu ei nÀe komponentide naabrid.
Kuna selle ĂŒletamiseks lĂ”ime me vĂ”rgu Dockeris kĂ€sitsi. Docker-compose'is mÀÀrasime, et see projekt kasutaks seda vĂ”rku.
Seega nĂ€eb iga komponent, mis kĂ€ivitatakse selle vĂ”rguga, teisi komponente sĂŒsteemi erinevates osades.
JĂ€rgmine probleem on staging'i jagamine mitme projekti vahel.
Kuna kÔik see peaks vÀlja nÀgema ilus ja olema vÔimalikult lÀhedal tootmisversioonile, on parem kasutada porti 80 vÔi 443, mida kasutatakse laialdaselt veebis.

Kuidas me selle lahendasime? MÀÀrasime ĂŒhe Gitlab Runner'i kĂ”ikidele suurtele projektidele.
Gitlab vĂ”imaldab kĂ€ivitada mitu jaotatud Gitlab Runner'it, mis lihtsalt jĂ€rjekorras ja kaootiliselt vĂ”tavad kĂ”ik ĂŒlesanded ja tĂ€idavad need.
Et meil ei tekiks segadust, piirasime meie projektide grupi ĂŒhe Gitlab Runner'iga, mis meie mahud arvestades töötab probleemideta.
Me tÔstsime nginx-proxy eraldi kÀivitusskripti ja mÀÀrasime sinna kÔigi projektide vÔrgud.
Meie projektil on ĂŒks vĂ”rk, samas kui koormuse tasakaalustaja haldab mitmeid vĂ”rke projektinimede jĂ€rgi. See suudab domeeninimede alusel edasi proksida.
Meie pÀringud tulevad domeeni kaudu porti 80 ja suunatakse konteinerigruppi, mis teenindab seda domeeni.

Millised probleemid veel ilmnesid? Probleemiks on see, et vaikimisi töötavad kĂ”ik konteinerid kasutaja root all. See root ei ole vĂ”rreldav sĂŒsteemi root-hosti omaga.
Kuna aga konteinerisse sisenedes on tegemist rootiga, saavad seal loodud failid root Ôigused.
Kui arendaja siseneb konteinerisse ja kÀivitab seal kÀske, mis loovad faile, ja seejÀrel konteinerist vÀljub, siis tema töökaustas on fail, millele tal pole juurdepÀÀsu.
Kuidas saaksime seda lahendada? Saame lisada kasutajaid, kes töötavad konteineris.
Millised probleemid tekkisid, kui lisasime kasutaja?
Kasutaja loomisel katsetame tihti, et grupi ID (UID) ja kasutaja ID (GID) ei kattu.
Selle probleemi lahendamiseks kasutame konteineris kasutajaid, kelle ID on 1000.
Meie puhul kattus see sellega, et praktiliselt kĂ”ik arendajad kasutavad Ubuntu operatsioonisĂŒsteemi. Ubuntu operatsioonisĂŒsteemis on esimesel kasutajal ID 1000.

Millised on meie plaanid?
Korrata dokumentatsiooni Docker kohta. Projekt areneb aktiivselt, dokumentatsioon muutub. Andmed, mis saadi kaks-kolm kuud tagasi, muutuvad aeglaselt vananenuks.
MÔned probleemid, millega me tegelesime, on tÔenÀoliselt juba lahendatud tavapÀraste vahenditega.
On nii raske edasi liikuda ja minna otse orkestreerimise juurde.
Ăks nĂ€ide on Dockeri sisse ehitatud mehhanism nimega Docker Swarm, mis on juba vĂ€lja pakutud. Tahaks kĂ€ivitada midagi tootmises, mis pĂ”hineb Docker Swarm tehnoloogial.
Konteinerite genereerimine teeb logide haldamise ebamugavaks. Praegu on logid isoleeritud. Need on hajutatud konteinerite vahel. Ăks ĂŒlesanne on tagada mugav juurdepÀÀs logidele veebivahendi kaudu.

Allikas: habr.com
