{"id":69351,"date":"2020-02-18T14:44:06","date_gmt":"2020-02-18T11:44:06","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker"},"modified":"2020-03-03T16:15:00","modified_gmt":"2020-03-03T13:15:00","slug":"sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker","title":{"rendered":"CI\/CD-voo loomine ja t\u00f6\u00f6 automatiseerimine Dockeriga","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ma tahtsin oma esimesi saite 90ndate l\u00f5pus. Toona oli nende t\u00f6\u00f6le saamine v\u00e4ga lihtne. \u00dcksk\u00f5ik milline jagatud hostings, kus oli Apache-server, v\u00f5imaldas FTP-dele siseneda, kirjutades brauseri aadressiribale midagi sellist nagu <code>ftp:\/\/ftp.example.com<\/code>. Siis tuli sisestada nimi ja parool ning failid serverisse laadida. Need olid teised ajad, k\u00f5ik oli toona lihtsam kui n\u00fc\u00fcd.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/488668\/\"><img decoding=\"async\" alt=\"CI\/CD-voo loomine ja t\u00f6\u00f6 automatiseerimine Dockeriga\" src=\"\/wp-content\/uploads\/2020\/02\/0861cdd82770ef4695ffac7a09777c52.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Viimase kahek\u00fcmne aasta jooksul on asjad t\u00f5siselt muutunud. Saite on keerukamaks muutunud, neid tuleb enne tootmisse saatmist kokku panna. \u00dcksik server on muutunud paljudeks serveriteks, mis t\u00f6\u00f6tavad koormuste tasakaalustajate taga, ja versioonikontrolli s\u00fcsteemide kasutamine on tavaline.<\/p>\n<p>Minu isikliku projekti jaoks oli mul eriline konfigureerimine. Ja ma teadsin, et mul on vaja, et saaksin saiti tootmisesse tuua, tehes vaid \u00fche tegevuse: koodi salvestamine harusse <code>master<\/code> GitHubis. Samuti teadsin, et ma ei soovi oma v\u00e4ikese veebirakenduse toimimise tagamiseks hallata suurt Kubernetes-klastri v\u00f5i kasutada Docker Swarm'i tehnoloogiat v\u00f5i hooldada serverite parki, millel on podid, agentuurid ja muud keerukused. Maximaalse lihtsuse saavutamiseks oli mul vaja tutvuda CI\/CD'ga.<\/p>\n<p>Kui teil on v\u00e4ike projekt (meie puhul r\u00e4\u00e4gime Node.js projektist) ja te soovite teada, kuidas selle projekti juurutamist automatiseerida, tehes samas nii, et sellesse repos olev sisaldus vastab t\u00e4pselt sellele, mis t\u00f6\u00f6tab tootmises, siis usun, et teid v\u00f5ib see artikkel huvitada.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Eeltingimused<\/h2>\n<p>\nOodatav on, et selle artikli lugejal on p\u00f5hilised teadmised k\u00e4surea kasutamisest ja Bash-skriptide kirjutamisest. Samuti on vaja arve <noindex><a rel=\"nofollow\" href=\"https:\/\/travis-ci.org\/\">Travis CI<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/\">Docker Hub<\/a><\/noindex>.<\/p>\n<h2>Eesm\u00e4rgid<\/h2>\n<p>\nMa ei \u00fctle, et see artikkel on \u00fcheselt m\u00f5istetav \"\u00f5pik\". Pigem on see dokument, kus r\u00e4\u00e4gin sellest, mida \u00f5ppisin, ja kirjeldan enda rahuldavat protsessi koodi testimise ja juurutamise kohta tootmises, mis toimub \u00fche automatiseeritud l\u00e4bimisega.<\/p>\n<p>Nii see l\u00f5ppkokkuv\u00f5ttes v\u00e4lja n\u00e4eb mu t\u00f6\u00f6protsess.<\/p>\n<p>Koodi, mis saadetakse mis tahes harusse repos, v\u00e4lja arvatud <code>master<\/code>, viiakse ellu j\u00e4rgmised tegevused:<\/p>\n<ul>\n<li>Projekt ehitatakse Travis CI's.<\/li>\n<li>K\u00e4ideldakse k\u00f5ik moodulitest, integreerimisest ja l\u00f5pp-punktitest testid.<\/li>\n<\/ul>\n<p>\nAinult koodi jaoks, mis langeb <code>master<\/code>, kehtib j\u00e4rgmine:<\/p>\n<ul>\n<li>K\u00d5IK, mis on eespool \u00f6eldud, pluss\u2026<\/li>\n<li>Docker-pildi koostamine praeguse koodi, seadistuste ja keskkonna p\u00f5hjal.<\/li>\n<li>Pildi paigutamine Docker Hub'i.<\/li>\n<li>\u00dchendamine tootmisserveriga.<\/li>\n<li>Pildi laadimine Docker Hub'ist serverisse.<\/li>\n<li>Praeguse konteineri peatamine ja uue k\u00e4ivitamine, mis p\u00f5hineb uuel pildil.<\/li>\n<\/ul>\n<p>\nKui sa ei tea absoluutselt midagi Dockerist, piltidest ja konteineritest \u2014 \u00e4ra muretse. R\u00e4\u00e4gin sellest k\u00f5igest sulle.<\/p>\n<h2>Mis on CI\/CD?<\/h2>\n<p>\nL\u00fchend CI\/CD t\u00e4histab \u00abcontinuous integration\/continuous deployment\u00bb \u2014 \u00abpidev integraatsioon\/pidev juurutamine\u00bb.<\/p>\n<h3>\u258dPidev integraatsioon<\/h3>\n<p>\nPidev integraatsioon on protsess, kus arendajad teevad muudatusi projekti koodihoidlas (tavaliselt harus <code>master<\/code>). Sellega tagatakse koodi kvaliteet automatiseeritud testimise kaudu.<\/p>\n<h3>\u258dPidev juurutamine<\/h3>\n<p>\nPidev juurutamine on sagedane automatiseeritud koodi juurutamine tootmis\u00fcksuses. CI\/CD l\u00fchendi teine osa avatakse m\u00f5nikord kui \u00abcontinuous delivery\u00bb (\u00abpidev kohaletoimetamine\u00bb). See on sisuliselt sama mis \u00abpidev juurutamine\u00bb, kuid \u00abpidev kohaletoimetamine\u00bb eeldab muudatuste k\u00e4sitsi kinnitamist enne projekti juurutamisprotsessi k\u00e4ivitamist.<\/p>\n<h2>Esimene samm<\/h2>\n<p>\nRakendus, millega ma seda k\u00f5ike \u00f5ppisin, on nimega <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/taniarascia\/takenote\">TakeNote<\/a><\/noindex>. See on veebiprojekt, millega ma t\u00f6\u00f6tan, et teha m\u00e4rkmeid. Alguses proovisin ma teha <noindex><a rel=\"nofollow\" href=\"https:\/\/jamstack.org\/\">JAMStack<\/a><\/noindex>-projekti v\u00f5i lihtsalt front-end rakendust ilma serverita, et kasutada standardseid v\u00f5imalusi projektide hostimiseks ja juurutamiseks, mida pakub <noindex><a rel=\"nofollow\" href=\"https:\/\/www.netlify.com\/\">Netlify<\/a><\/noindex>. Kui rakenduse keerukus kasvas, pidin looma ka serveri osa, mis t\u00e4hendas, et mul tuli v\u00e4lja t\u00f6\u00f6tada oma automatiseeritud integreerimise ja automatiseeritud juurutamise strateegia.<\/p>\n<p>Minu puhul on rakendus Express-server, mis t\u00f6\u00f6tab Node.js keskkonnas, teenindab \u00fchtset React-rakendust ja toetab turvalist serveri API-d. See arhitektuur j\u00e4rgib strateegiat, mille leiad <noindex><a rel=\"nofollow\" href=\"https:\/\/www.taniarascia.com\/full-stack-cookies-localstorage-react-express\/\">sellest<\/a><\/noindex> t\u00e4ieliku stacki autentimise juhendist.<\/p>\n<p>Konsulteerisin <noindex><a rel=\"nofollow\" href=\"http:\/\/qualitytesting.tech\/\">teises<\/a><\/noindex>, kes on automatiseerimise ekspert, ja k\u00fcsisin temalt, mida pean tegema, et k\u00f5ik see toimiks nagu ma vajasin. Ta viskas mulle idee, milline peaks olema automatiseeritud t\u00f6\u00f6voog, mis on toodud k\u00e4esoleva artikli jaotises \"Eesm\u00e4rgid\". See, et ma seadsin endale sellised eesm\u00e4rgid, t\u00e4hendas, et pean aru saama, kuidas kasutada Dockerit.<\/p>\n<h2>Docker<\/h2>\n<p>\nDocker on t\u00f6\u00f6riist, mis t\u00e4nu konteineritehnoloogiale v\u00f5imaldab h\u00f5lpsasti levitada rakendusi ning k\u00e4ivitada ja juurutada neid \u00fches ja samas keskkonnas, isegi kui Docker ise t\u00f6\u00f6tab erinevates keskkondades. Alguses pidin hankima endale Docker CLI k\u00e4surea t\u00f6\u00f6riistad. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/install\/\">Juhend<\/a><\/noindex> Docker'i installimiseks ei saa nimetada v\u00e4ga selgeks ja arusaadavaks, kuid sellest saab teada, et esimese paigaldusastme tegemiseks tuleb alla laadida Docker Desktop (Maci v\u00f5i Windowsi jaoks).<\/p>\n<p>Docker Hub on ligikaudu sama, mis <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/\">GitHub<\/a><\/noindex> git-reposiitide jaoks, v\u00f5i registri <noindex><a rel=\"nofollow\" href=\"https:\/\/www.npmjs.com\/\">npm<\/a><\/noindex> JavaScripti pakettide jaoks. See on veebip\u00f5hine register Docker'i piltide jaoks. Just sellele on \u00fchendatud Docker Desktop.<\/p>\n<p>Nii et, et alustada Docker'iga t\u00f6\u00f6tamist, peate tegema kaks asja:<\/p>\n<ul>\n<li>Installige <noindex><a rel=\"nofollow\" href=\"https:\/\/www.docker.com\/get-started\">Docker Desktop<\/a><\/noindex>.<\/li>\n<li>Registreerige end <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/\">Docker Hub<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nP\u00e4rast seda saate kontrollida Docker CLI toimivust, k\u00e4ivitades j\u00e4rgmise k\u00e4su Docker'i versiooni kontrollimiseks:<\/p>\n<pre><code class=\"plaintext\">docker -v<\/code><\/pre>\n<p>\nSeej\u00e4rel logige sisse Docker Hubi, sisestades, kui teilt seda k\u00fcsitakse, oma kasutajanime ja parooli:<\/p>\n<pre><code class=\"plaintext\">docker login<\/code><\/pre>\n<p>\nDocker'iga t\u00f6\u00f6tamiseks peate m\u00f5istma kujundite ja konteinerite kontseptsioone.<\/p>\n<h3>\u258dKujundid<\/h3>\n<p>\nKujund on midagi nagu plaan, mis sisaldab juhiseid konteineri kokkupanekuks. See on muutumatu failis\u00fcsteemi ja rakenduse seadete pilt. Arendajad saavad kujundeid h\u00f5lpsasti vahetada.<\/p>\n<pre><code class=\"plaintext\"># \u0412\u044b\u0432\u043e\u0434 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u043e\u0431\u0440\u0430\u0437\u0430\u0445\ndocker images<\/code><\/pre>\n<p>\nSee k\u00e4sk toob v\u00e4lja tabeli j\u00e4rgmise pealkirjaga:<\/p>\n<pre><code class=\"plaintext\">REPOSITORY \u00a0 \u00a0 TAG     IMAGE ID \u00a0 \u00a0 CREATED     SIZE\n---<\/code><\/pre>\n<p>\nSeej\u00e4rel vaatame m\u00f5ningaid k\u00e4skude n\u00e4iteid samas formaadis \u2013 esmalt k\u00e4sk koos kommentaariga ja seej\u00e4rel n\u00e4ide sellest, mida see v\u00f5ib v\u00e4lja anda.<\/p>\n<h3>\u258dKonteinerid<\/h3>\n<p>\nKonteiner on teostatav paket, mis sisaldab k\u00f5ike, mis on vajalik rakenduse k\u00e4itamiseks. Sellise l\u00e4henemisega t\u00f6\u00f6tab rakendus alati \u00fchtemoodi, s\u00f5ltumata infrastruktuurist: isoleeritud keskkonnas ja samas keskkonnas. See t\u00e4hendab, et erinevates keskkondades k\u00e4ivitatakse sama pildi eksemplare.<\/p>\n<pre><code class=\"plaintext\"># \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\ndocker ps -a\nCONTAINER ID \u00a0 \u00a0 IMAGE     COMMAND \u00a0 \u00a0 CREATED     STATUS     PORTS \u00a0 \u00a0 NAMES\n---<\/code><\/pre>\n<p><\/p>\n<h3>\u258dSildid<\/h3>\n<p>\nSilt on viide konkreetsele pildi versioonile.<\/p>\n<h3>\u258dL\u00fchike \u00fclevaade Docker k\u00e4skudest<\/h3>\n<p>\nSiin on \u00fclevaade m\u00f5nest sageli kasutatavast Docker k\u00e4sust.<\/p>\n<p>Meeskond<\/p>\n<p>Kontekst<\/p>\n<p>Tegevus<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/build\/\">docker build<\/a><\/noindex><\/p>\n<p>T\u00fc\u00fcp<\/p>\n<p>Pildi koostamine Dockerfile'ist<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/tag\/\">docker tag<\/a><\/noindex><\/p>\n<p>T\u00fc\u00fcp<\/p>\n<p>Pildi sildistamine<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/images\/\">docker images<\/a><\/noindex><\/p>\n<p>T\u00fc\u00fcp<\/p>\n<p>Piltide nimekirja kuvamine<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/run\/\">docker run<\/a><\/noindex><\/p>\n<p>Konteiner<\/p>\n<p>Konteineri k\u00e4ivitamine pildi alusel<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/push\/\">docker push<\/a><\/noindex><\/p>\n<p>T\u00fc\u00fcp<\/p>\n<p>Pildi saatmine registrisse<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/about:blank\">docker pull<\/a><\/noindex><\/p>\n<p>T\u00fc\u00fcp<\/p>\n<p>Pildi allalaadimine registrist<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/ps\/\">docker ps<\/a><\/noindex><\/p>\n<p>Konteiner<\/p>\n<p>Konteinerite nimekirja kuvamine<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/system_prune\/\">docker system prune<\/a><\/noindex><\/p>\n<p>Pilt\/Konteiner<\/p>\n<p>Nelikud ja mittekasutatud konteinerite ja piltide eemaldamine<\/p>\n<h3>\u258dDockerfile<\/h3>\n<p>\nMa tean, kuidas k\u00e4itada rakendust kohalikult tootmises. Mul on Webpack konfiguratsioon, mis on m\u00f5eldud valmis React rakenduse koostamiseks. Edasi on mul k\u00e4sk, mis k\u00e4ivitab Node.js baasil serveri, port. <code>5000<\/code>. See n\u00e4eb v\u00e4lja nii:<\/p>\n<pre><code class=\"plaintext\">npm i          # s\u00f5ltuvuste installimine\nnpm run build # React rakenduse koostamine\nnpm run start # Node serveri k\u00e4ivitamine<\/code><\/pre>\n<p>\nPean m\u00e4rkima, et mul ei ole selle materjali jaoks n\u00e4idisarendust. Kuid siia sobib katsetamiseks iga lihtne Node rakendus.<\/p>\n<p>Konteineri kasutamiseks peate andma Dockerile juhised. Seda tehakse faili abil, mida nimetatakse. <code>Dockerfile<\/code>, mis asub projekti juurkataloogis. Alguses n\u00e4ib see fail \u00fcsna segane.<\/p>\n<p>Kuid see, mis selles sisaldub, kirjeldab lihtsalt eriliste k\u00e4skudega midagi, mis sarnaneb t\u00f6\u00f6keskkonna seadistamisele. Siin on m\u00f5ned nendest k\u00e4skudest:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/#from\">KUST<\/a><\/noindex> \u2014 See k\u00e4sk alustab faili. See m\u00e4\u00e4ratleb baaspildi, mille alusel konteiner ehitatakse.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/#copy\">COPY<\/a><\/noindex> \u2014 Failide kopeerimine kohalikust allikast konteinerisse.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/#workdir\">WORKDIR<\/a><\/noindex> \u2014 J\u00e4rgmiste k\u00e4skude t\u00f6\u00f6direktori seadmine.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/#run\">K\u00c4IVITA<\/a><\/noindex> \u2014 K\u00e4skude k\u00e4ivitamine.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/#expose\">EXPOSE<\/a><\/noindex> \u2014 Sadama seadistamine.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/#entrypoint\">ENTRYPOINT<\/a><\/noindex> \u2014 Teostatava k\u00e4sku m\u00e4\u00e4ramine.<\/li>\n<\/ul>\n<p>\n<code>Dockerfile<\/code> v\u00f5ib v\u00e4lja n\u00e4ha umbes nii:<\/p>\n<pre><code class=\"plaintext\"># \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437\nFROM node:12-alpine\n\n# \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e app\/\nCOPY . app\/\n\n# \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c app\/ \u0432 \u0440\u043e\u043b\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438\nWORKDIR app\/\n\n# \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 npm ci \u043f\u043e\u0445\u043e\u0436\u0430 npm i, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a)\nRUN npm ci --only-production\n\n# \u0421\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0435 React-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d\u0430\nRUN npm run build\n\n# \u041f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0440\u0442\nEXPOSE 5000\n\n# \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Node-\u0441\u0435\u0440\u0432\u0435\u0440\nENTRYPOINT npm run start<\/code><\/pre>\n<p>\nS\u00f5ltuvalt valitud baasipildist v\u00f5ib olla vajalik lisade installimine. Teatud baasipildid (nagu Node Alpine Linux) on loodud v\u00f5imalikult kompaktsena, mist\u00f5ttu v\u00f5ivad need sisaldada puuduvaid programme, millele te lootsite.<\/p>\n<h3>\u258dKonteineri ehitamine, m\u00e4rgistamine ja k\u00e4ivitamine<\/h3>\n<p>\nKohalik konteineri ehitamine ja k\u00e4ivitamine \u2014 see on see, kui meil on <code>Dockerfile<\/code>, \u00fclesanded on \u00fcsna lihtsad. Enne, kui pildi Docker Hub'i saatmisega edasi minna, tuleb see kohapeal testida.<\/p>\n<h3>\u258dEhitus<\/h3>\n<p>\nEsiteks tuleb ehitada <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/build\/\">pilt<\/a><\/noindex>, m\u00e4\u00e4rates nime ja valikuliselt ka m\u00e4rgise (kui m\u00e4rgis pole m\u00e4\u00e4ratud, m\u00e4\u00e4rab s\u00fcsteem automaatselt pildile m\u00e4rgise <code>latest<\/code>).<\/p>\n<pre><code class=\"plaintext\"># \u0421\u0431\u043e\u0440\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u0430\ndocker build -t &lt;image&gt;:&lt;tag&gt; .<\/code><\/pre>\n<p>\nP\u00e4rast selle k\u00e4su t\u00e4itmist saab j\u00e4lgida, kuidas Docker pildi ehitamise l\u00f5pule viib.<\/p>\n<pre><code class=\"plaintext\">Sending build context to Docker daemon   2.88MB\nStep 1\/9 : FROM node:12-alpine\n  ---&gt; ...ehitusetappide t\u00e4itmine...\nSuccessfully built 123456789123\nSuccessfully tagged &lt;image&gt;:&lt;tag&gt;<\/code><\/pre>\n<p>\nEhitus v\u00f5ib v\u00f5tta paar minutit \u2014 see s\u00f5ltub teie s\u00f5ltuvustest. Kui ehitus on l\u00f5petatud, saab v\u00e4lja anda k\u00e4su <code>docker images<\/code> ja vaadata oma uue pildi kirjeldust.<\/p>\n<pre><code class=\"plaintext\">REPOSITORY          TAG               IMAGE ID            CREATED              SIZE\n&lt;image&gt;            latest            123456789123        About a minute ago   x.xxGB<\/code><\/pre>\n<p><\/p>\n<h3>\u258dK\u00e4ivitamine<\/h3>\n<p>\nPilt on loodud. See t\u00e4hendab, et selle alusel saab k\u00e4ivitada konteineri. Kuna ma tahan, et mul oleks v\u00f5imalik lugeda konteinerit\u00f6\u00f6tavat rakendust aadressilt <code>localhost:5000<\/code>, siis olen vasakus osas m\u00e4\u00e4ranud <code>5000:5000<\/code> . Paremas osas on konteineri port. <code>5000<\/code>N\u00fc\u00fcd, kui konteiner on loodud ja k\u00e4ivitatud, saab kasutada k\u00e4sku<\/p>\n<pre><code class=\"plaintext\"># \u0417\u0430\u043f\u0443\u0441\u043a \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430 5000 \u0438 \u043f\u043e\u0440\u0442\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 5000\ndocker run -p 5000:5000 &lt;image&gt;:&lt;tag&gt;<\/code><\/pre>\n<p>\net vaadata selle konteineri teavet (v\u00f5i v\u00f5ib kasutada k\u00e4sku <code>docker ps<\/code> docker ps -a <code>, mis kuvab teavet k\u00f5igi konteinerite kohta, mitte ainult t\u00f6\u00f6tavate kohta).<\/code>CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                    PORTS                    NAMES\n987654321234        &lt;image&gt;            \"\\\/bin\\\/sh -c 'npm run\u2026\"   6 seconds ago        Up 6 seconds              0.0.0.0:5000-&gt;5000\\\/tcp   stoic_darwin<\/p>\n<pre><code class=\"plaintext\">CONTAINER ID\u00a0 \u00a0 \u00a0 \u00a0 IMAGE               COMMAND\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 CREATED              STATUS                  \u00a0 \u00a0 PORTS                    NAMES\n987654321234\u00a0 \u00a0 \u00a0 \u00a0 &lt;image&gt;             &quot;\/bin\/sh -c 'npm run\u2026&quot; \u00a0 6 seconds ago        Up 6 seconds            \u00a0 \u00a0 0.0.0.0:5000-&gt;5000\/tcp   stoic_darwin<\/code><\/pre>\n<p>\n\u2014 saab n\u00e4ha t\u00f6\u00f6tava rakenduse lehte, mis n\u00e4eb v\u00e4lja t\u00e4pselt nagu tootmiskeskkonnas t\u00f6\u00f6tava rakenduse leht. <code>localhost:5000<\/code> \u258dM\u00e4rgise m\u00e4\u00e4ramine ja avaldamine<\/p>\n<h3>\u258d\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u0433\u0430 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f<\/h3>\n<p>\nEtte, et kasutada \u00fchte loodud pilti tootmisserveris, peab meil olema v\u00f5imalus see pilt laadida Docker Hub'ist. See t\u00e4hendab, et k\u00f5igepealt tuleb luua Docker Hub'is projekti jaoks repository. P\u00e4rast seda on meil koht, kuhu pilti saata. Pilt tuleb nimetada nii, et selle nimi algab meie kasutajanimeniga Docker Hub'is. Seej\u00e4rel peab olema repository nimi. Nime l\u00f5pus v\u00f5ib olla \u00fcksk\u00f5ik milline silt. Allpool on n\u00e4idatud n\u00e4ide piltide nimetamisest selle skeemi j\u00e4rgi.<\/p>\n<p>N\u00fc\u00fcd saab pildi kokku panna, andes sellele uue nime ja k\u00e4ivitades k\u00e4su <code>docker push<\/code> selle saatmiseks Docker Hub'i repository'sse.<\/p>\n<pre><code class=\"plaintext\">docker build -t \/: .\ndocker tag \/: \/:latest\ndocker push \/:\n\n# Praktiliselt v\u00f5iks see v\u00e4lja n\u00e4ha n\u00e4iteks nii:\ndocker build -t user\/app:v1.0.0 .\ndocker tag user\/app:v1.0.0 user\/app:latest\ndocker push user\/app:v1.0.0<\/code><\/pre>\n<p>\nKui k\u00f5ik l\u00e4heb nagu peab, siis on pilt saadaval Docker Hub'is ja seda on lihtne serverisse laadida v\u00f5i teistele arendajatele edastada.<\/p>\n<h2>J\u00e4rgmised sammud<\/h2>\n<p>\nPraeguseks oleme veendunud, et rakendus Docker konteinerina t\u00f6\u00f6tab kohapeal. Oleme konteineri laadinud Docker Hub'i. See k\u00f5ik t\u00e4hendab, et oleme juba \u00fcsna kaugele eesm\u00e4rgi suunas liikunud. N\u00fc\u00fcd tuleb lahendada veel kaks k\u00fcsimust:<\/p>\n<ul>\n<li>CI t\u00f6\u00f6riista seadistamine koodi testimiseks ja juurutamiseks.<\/li>\n<li>Tootmisserveri seadistamine nii, et see suudab meie koodi laadida ja k\u00e4ivitada.<\/li>\n<\/ul>\n<p>\nMeie juhul kasutatakse CI\/CD lahendusena <noindex><a rel=\"nofollow\" href=\"https:\/\/travis-ci.org\/\">Travis CI<\/a><\/noindex>. Serverina \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.digitalocean.com\/\">DigitalOcean<\/a><\/noindex>.<\/p>\n<p>Tuleb m\u00e4rkida, et siin saab kasutada ka teist kombinatsiooni teenustest. N\u00e4iteks, Travis CI asemel v\u00f5ib kasutada CircleCI v\u00f5i Github Actions. Ja DigitalOcean'i asemel \u2014 AWS v\u00f5i Linode.<\/p>\n<p>Oleme otsustanud t\u00f6\u00f6tada Travis CI-ga, ja selle teenuse osas on mul juba midagi seadistatud. Seet\u00f5ttu r\u00e4\u00e4gin n\u00fc\u00fcd l\u00fchidalt, kuidas seda t\u00f6\u00f6ks ette valmistada.<\/p>\n<h2>Travis CI<\/h2>\n<p>\nTravis CI on t\u00f6\u00f6riist koodi testimiseks ja juurutamiseks. Ma ei sooviks minna Travis CI seadistamise n\u00fcanssidesse, kuna iga projekt on unikaalne ning see ei tooks erilist kasu. Kuid r\u00e4\u00e4gin p\u00f5hialustest, mis v\u00f5imaldavad teil alustada, juhul kui otsustate kasutada Travis CI-d. \u00dcksk\u00f5ik, mida te valite \u2014 Travis CI, CircleCI, Jenkins v\u00f5i midagi muud, on k\u00f5ikjal rakendatavad sarnased seadistamismeetodid.<\/p>\n<p>Ettevalmistamiseks Travis CI-ga minge <noindex><a rel=\"nofollow\" href=\"https:\/\/travis-ci.org\/\">projekti sait<\/a><\/noindex> ja looge konto. Integreerige seej\u00e4rel Travis CI oma GitHubi kontoga. Seadmise k\u00e4igus peate m\u00e4\u00e4rama hoidla, mille automatiseerimist soovite, ja lubama sellele ligip\u00e4\u00e4su. (Kasutamisel on mul GitHub, aga olen kindel, et Travis CI saab integreeruda ka BitBucketi, GitLabi ja teiste sarnaste teenustega).<\/p>\n<p>Iga kord, kui Travis CI alustab t\u00f6\u00f6d, t\u00f6\u00f6tab server, mis t\u00e4idab konfiguratsioonifailis m\u00e4\u00e4ratud k\u00e4ske, sealhulgas vastava hoidla harude juurutamist.<\/p>\n<h3>\u258d\u00dclesande eluts\u00fckkel<\/h3>\n<p>\nTravis CI konfiguratsioonifail, mida nimetatakse <code>.travis.yml<\/code> ja mis asub projekti juurkataloogis, toetab s\u00fcndmuste kontseptsiooni <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.travis-ci.com\/user\/job-lifecycle\/\">RHEL 6 ja 7 levitustes ning RHEL 8 jaoks koostab see pakettide uuendusi Application Stream'is kuni juuni 2024. Meeldetuletuseks, Python 2.7 haru<\/a><\/noindex> \u00fclesande jaoks. Siin on need s\u00fcndmused, esitatud j\u00e4rjekorras, milles need esinevad:<\/p>\n<ul>\n<li><code>apt addons<\/code><\/li>\n<li><code>cache components<\/code><\/li>\n<li><code>before_install<\/code><\/li>\n<li><code>install<\/code><\/li>\n<li><code>before_script<\/code><\/li>\n<li><code>script<\/code><\/li>\n<li><code>before_cache<\/code><\/li>\n<li><code>after_success v\u00f5i after_failure<\/code><\/li>\n<li><code>before_deploy<\/code><\/li>\n<li><code>deploy<\/code><\/li>\n<li><code>after_deploy<\/code><\/li>\n<li><code>after_script<\/code><\/li>\n<\/ul>\n<p><\/p>\n<h3>\u258dTestimine<\/h3>\n<p>\nKonfiguratsioonifailis kavatsen seadistada kohaliku Travis CI serveri. Keelena valisin Node 12 versiooni ja andsin s\u00fcsteemile teada, et tuleb installida Dockeriks vajalikud s\u00f5ltuvused.<\/p>\n<p>K\u00f5ik, mis on loetletud <code>.travis.yml<\/code>, t\u00e4idetakse k\u00f5ikide pull-p\u00e4ringute puhul k\u00f5igis hoidla harudes, v\u00e4lja arvatud juhul, kui on m\u00e4rgitud teisiti. See on kasulik funktsioon, kuna see t\u00e4hendab, et saame testida kogu koodi, mis j\u00f5uab hoidlasse. See annab teada, kas kood on haru <code>master<\/code>, salvestamiseks valmis ja ei rikku ehitusprotsessi. Selle globaalsete konfiguratsioonide korral installin k\u00f5ik kohaliku, k\u00e4itan Webpacki arendaja serverit taustal (see on minu t\u00f6\u00f6protsessi erip\u00e4ra) ja teen teste.<\/p>\n<p>Kui soovite, et teie hoidlas kuvatakse m\u00e4rgid testa katteandmete kohta, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.taniarascia.com\/display-build-status-and-test-coverage\/\">siit<\/a><\/noindex> v\u00f5ite leida l\u00fchikese juhendi Jest, Travis CI ja Coverallsi kasutamiseks nende andmete kogumiseks ja kuvamiseks.<\/p>\n<p>Nii et siin on faili sisu <code>.travis.yml<\/code>:<\/p>\n<pre><code class=\"plaintext\"># \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044f\u0437\u044b\u043a\nlanguage: node_js\n\n# \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e Node.js\nnode_js:\n\u00a0\u00a0- '12'\n\nservices:\n\u00a0\u00a0# \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 Docker\n\u00a0\u00a0- docker\n\ninstall:\n\u00a0\u00a0# \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\n\u00a0\u00a0- npm ci\n\nbefore_script:\n\u00a0\u00a0# \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\n\u00a0\u00a0- npm run dev &amp;\n\nscript:\n\u00a0\u00a0# \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b\n\u00a0\u00a0- npm run test<\/code><\/pre>\n<p>\nSiin l\u00f5ppevad k\u00f5ik toimingud, mis viiakse l\u00e4bi k\u00f5igi hoidla harude ja pull-p\u00e4ringute jaoks.<\/p>\n<h3>\u258dJuurutamine<\/h3>\n<p>\nOletades, et k\u00f5ik automatiseeritud testid on l\u00f5ppenud edutult, saame, kuigi see ei ole vajalik, juurutada koodi tootmiserverisse. Kuna soovime seda teha ainult koodi puhul harust <code>master<\/code>, me anname s\u00fcsteemile vastavad juhised arendus- ja paigaldusseadetes. Enne kui proovite oma projektis kasutada koodi, mida me hiljem vaatame, sooviksin teid hoiatada, et teil peab olema reaalne skript, mida kasutada paigaldamiseks.<\/p>\n<pre><code class=\"plaintext\">deploy:\n  # Koguge Docker-konteiner ja saatke see Docker Hub'i\n  provider: script\n  script: bash deploy.sh\n  on:\n    branch: master<\/code><\/pre>\n<p>\nPaigaldusskripti eesm\u00e4rgiks on kaks \u00fclesannet:<\/p>\n<ul>\n<li>Kogumine, sildistamine ja pildi saatmine Docker Hub'i CI-t\u00f6\u00f6riista (meie puhul Travis CI) kaudu.<\/li>\n<li>Pildi \u00fcleslaadimine serverisse, vana konteineri peatamine ja uue k\u00e4ivitamine (meie juhul t\u00f6\u00f6tab server DigitalOcean'i platvormil).<\/li>\n<\/ul>\n<p>\nEsiteks tuleb seadistada automaatne protsess pildi kogumiseks, sildistamiseks ja saatmiseks Docker Hub'i. K\u00f5ik see on v\u00e4ga sarnane sellele, mida oleme juba k\u00e4sitsi teinud, v\u00e4lja arvatud see, et meil on vaja strateegiat piltide ainulaadsete siltide m\u00e4\u00e4ramiseks ja sisselogimise automatiseerimist. Mul olid raskused m\u00f5nede arendus-skripti detailide, n\u00e4iteks sildistamisstrateegia, sisselogimise, SSH-v\u00f5tmete kodeerimise ja SSH-\u00fchenduse loomisega. Kuid \u00f5nneks oskab mu poiss-s\u00f5ber bash'iga ja paljude teiste asjadega v\u00e4ga h\u00e4sti hakkama. Ta aitas mul selle skripti kirjutada.<\/p>\n<p>Nii et skripti esimene osa on pildi saatmine Docker Hub'i. See on \u00fcsna lihtne. Kasutatud sildistamisstrateegia eeldab git-hashi ja git-sildi (kui see eksisteerib) kombinatsiooni. See tagab ainulaadse sildi loomise ja lihtsustab sellise versiooni tuvastamist, millel see p\u00f5hineb. <code>DOCKER_USERNAME<\/code> ja <code>DOCKER_PASSWORD<\/code> \u2014 need on kasutaja keskkonnamuutujad, mille saab seadistada Travis CI liidese abil. Travis CI t\u00f6\u00f6tleb automaatselt tundlikke andmeid, et need ei satuks valedesse k\u00e4tesse.<\/p>\n<p>See on skripti esimene osa <code>deploy.sh<\/code>.<\/p>\n<pre><code class=\"plaintext\">#!\/bin\/sh\nset -e # \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043e\u0448\u0438\u0431\u043e\u043a\n\nIMAGE=&quot;&lt;username&gt;\/&lt;repository&gt;&quot; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # \u041e\u0431\u0440\u0430\u0437 Docker\nGIT_VERSION=$(git describe --always --abbrev --tags --long) # Git-\u0445\u044d\u0448 \u0438 \u0442\u0435\u0433\u0438\n\n# \u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u0430\ndocker build -t ${IMAGE}:${GIT_VERSION} .\ndocker tag ${IMAGE}:${GIT_VERSION} ${IMAGE}:latest\n\n# \u0412\u0445\u043e\u0434 \u0432 Docker Hub \u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u0430\necho &quot;${DOCKER_PASSWORD}&quot; | docker login -u &quot;${DOCKER_USERNAME}&quot; --password-stdin\ndocker push ${IMAGE}:${GIT_VERSION}<\/code><\/pre>\n<p>\nKuidas n\u00e4eb v\u00e4lja skripti teine osa, s\u00f5ltub t\u00e4ielikult sellest, millist hosti te kasutate ja kuidas \u00fchendus on korraldatud. Minu juhtumil, kuna kasutan Digital Ocean'i, kasutatakse serverisse \u00fchendamiseks k\u00e4ske <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/digitalocean\/doctl\">doctl<\/a><\/noindex>. AWS-i kasutamisel kasutatakse utiliiti <code>aws<\/code>, ja nii edasi.<\/p>\n<p>Serveri seadistamine ei olnud eriti keeruline. Nii et seadistasin dropleti, mis p\u00f5hineb p\u00f5hijoonisel. Tuleb m\u00e4rkida, et valitud s\u00fcsteem n\u00f5uab Docker'i \u00fchekordset k\u00e4sitsi installimist ja \u00fchekordset k\u00e4sitsi k\u00e4ivitamist. Docker'i installimiseks kasutasin Ubuntu 18.04, seega kui ka teie kasutate Ubuntu, et teha sama, v\u00f5ite lihtsalt j\u00e4rgida <noindex><a rel=\"nofollow\" href=\"https:\/\/phoenixnap.com\/kb\/how-to-install-docker-on-ubuntu-18-04\">sellele<\/a><\/noindex> lihtsat juhendit.<\/p>\n<p>Ma ei r\u00e4\u00e4gi siin teenuse konkreetsetest k\u00e4skudest, kuna see aspekt v\u00f5ib erinevates olukordades tugevalt varieeruda. Toon vaid v\u00e4lja \u00fcldise tegevuskava, mis toimub p\u00e4rast SSH-ga serverisse sisselogimist, kuhu projekt arendatakse:<\/p>\n<ul>\n<li>Peate leidma konteineri, mis praegu t\u00f6\u00f6tab, ja peatama selle.<\/li>\n<li>Seej\u00e4rel peate taustal k\u00e4ivitama uue konteineri.<\/li>\n<li>Teil on vaja seadistada serveri kohalik ports v\u00e4\u00e4rtuseks <code>80<\/code> \u2014 see v\u00f5imaldab siseneda saidile aadressil <code>example.com<\/code>, ilma porti n\u00e4itamata, ja mitte kasutada aadressi nagu <code>example.com:5000<\/code>.<\/li>\n<li>Ja l\u00f5puks peate eemaldama k\u00f5ik vanad konteinerid ja pildid.<\/li>\n<\/ul>\n<p>\nSiin on skripti j\u00e4tk.<\/p>\n<pre><code class=\"plaintext\"># \u041d\u0430\u0439\u0442\u0438 ID \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\nCONTAINER_ID=$(docker ps | grep takenote | cut -d&quot; &quot; -f1)\n\n# \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439, \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443\ndocker stop ${CONTAINER_ID}\ndocker run --restart unless-stopped -d -p 80:5000 ${IMAGE}:${GIT_VERSION}\ndocker system prune -a -f<\/code><\/pre>\n<p><\/p>\n<h2>M\u00f5ned asjad, millele tasub t\u00e4helepanu p\u00f6\u00f6rata<\/h2>\n<p>\nV\u00f5ib-olla, kui logite serverisse SSH kaudu Travis CI-st, n\u00e4ete hoiatust, mis takistab installimist, kuna s\u00fcsteem ootab kasutaja reaktsiooni.<\/p>\n<pre><code class=\"plaintext\">Hosti autentimine '&lt;hostname&gt; (&lt;IP address&gt;)' ei saa olla kindlaks tehtud.\nRSA v\u00f5tme s\u00f5rmej\u00e4lg on &lt;key fingerprint&gt;.\nKas soovite t\u00f5epoolest j\u00e4tkata \u00fchenduse loomist (jah\/ei)?<\/code><\/pre>\n<p>\nMa sain teada, et stringi v\u00f5tme saab kodeerida base64 formaati, et salvestada see selliselt, mille abil on mugav ja usaldusv\u00e4\u00e4rne t\u00f6\u00f6tada. Installimise etapis on v\u00f5imalik avalik v\u00f5ti dekodeerida ja salvestada see faili <code>known_hosts<\/code> et vabaneda \u00fclaltoodud veast.<\/p>\n<pre><code class=\"plaintext\">echo &lt;public key&gt; | base64 # v\u00e4ljastab &lt;avalik v\u00f5tme, kodeeritud base64 vormingus&gt;<\/code><\/pre>\n<p>\nPraktikas v\u00f5ib see k\u00e4sk v\u00e4lja n\u00e4ha nii:<\/p>\n<pre><code class=\"plaintext\">echo &quot;123.45.67.89 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom\/BWDSU\nGPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3\nPbv7kOdJ\/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK\/7XA\nt3FaoJoAsncM1Q9x5+3V0Ww68\/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw\/Pb0rwert\/En\nmZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z\/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx\nNrRFi9wrf+M7Q== you@example.com&quot; | base64<\/code><\/pre>\n<p>\nNing see on see, mida see v\u00e4ljastab \u2014 string base64-kodeeringus:<\/p>\n<pre><code class=\"plaintext\">123.45.67.89 ssh-rsa AABAB3NzaC1yc2EAAABBAklwAAQEAlkOUpkDHehrF17SbrmTipNLTGL9Tjmo\/BWDUSU\/GPl+nazlsHDTWY7hdI4la5ew18JH4KW9jYbhFRvqiVzM7xlELVVm4h9lFX5QkbPpSwg0cdaM3PBy7k9OdJ\/MTyBlWXFCR+HBo3FXRitBxiX1NfXpHqHahpHqAqO1dNFQK5HGdB0W1AqwrLUx6HnaYFlXiUQv0\/TgDXJXqdDmsXlkBxxSVWz9PzqA2e8sK3E3zFaoJoAscM1R9x5k9GjFCsg2Z1bA9W+QffDOVZm2Ja8L88B6p0tutMbA== user@example.com<\/code><\/pre>\n<p>\nSiin on eelnevalt mainitud k\u00e4sk.<\/p>\n<pre><code class=\"plaintext\">install:\n  - echo  | base64 -d &gt;&gt; $HOME\/.ssh\/known_hosts<\/code><\/pre>\n<p>\nSama l\u00e4henemist saab kasutada ka privaatv\u00f5tmega \u00fchenduse loomisel, kuna teil v\u00f5ib serverisse sisenemiseks olla vajalik privaatv\u00f5ti. V\u00f5tmega t\u00f6\u00f6tades peate vaid tagama selle ohutu hoidmise Travis CI keskkonna muutuja sees ning et see ei kuvata kuskil.<\/p>\n<p>Veel \u00fcks asi, millele t\u00e4helepanu p\u00f6\u00f6rata, on see, et v\u00f5ite vajada kogu deploy skripti k\u00e4ivitamist \u00fches reas, n\u00e4iteks \u2014 kasutades <code>doctl<\/code>. See v\u00f5ib n\u00f5uda m\u00f5ningaid lisapingutusi.<\/p>\n<pre><code class=\"plaintext\">doctl compute ssh &lt;droplet&gt; --ssh-command &quot;\u0432\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u0443\u0434\u0443\u0442 \u0437\u0434\u0435\u0441\u044c &amp;&amp; \u0437\u0434\u0435\u0441\u044c&quot;<\/code><\/pre>\n<p><\/p>\n<h2>TLS\/SSL ja koormuse jaotamine<\/h2>\n<p>\nP\u00e4rast seda, kui ma tegin k\u00f5ik eelnevalt mainitu, oli viimane probleem, millega ma silmitsi seisin, see, et serveril ei olnud SSL-i. Kuna kasutan Node.js-serverit, et sundida <noindex><a rel=\"nofollow\" href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-secure-a-containerized-node-js-application-with-nginx-let-s-encrypt-and-docker-compose\">t\u00f6\u00f6tamist<\/a><\/noindex> Nginx tagapoolt ja Let\u2019s Encrypt'i, tuleb natuke vaeva n\u00e4ha.<\/p>\n<p>Ma ei tahtnud k\u00f5iki neid SSL-i seadeid k\u00e4sitsi teha, seega l\u00f5in lihtsalt koormusejaoturi ja registreerisin selle andmed DNS-is. N\u00e4iteks DigitalOcean'i puhul on pidevalt uueneva iseallkirjastatud sertifikaadi loomine koormusejaoturis lihtne, tasuta ja kiire protsess. Selle l\u00e4henemisega on veel \u00fcks lisah\u00fcve, et see v\u00f5imaldab v\u00e4ga lihtsalt seadistada SSL-i paljudele serveritele, mis t\u00f6\u00f6tavad koormusejaoturi taga. See v\u00f5imaldab serveritel mitte \"muretseda\" SSL-i \u00fcle, kuid kasutada siiski tavap\u00e4raselt porti <code>80<\/code>. Seega on SSL-i seadistamine koormusejaoturi peal palju lihtsam ja mugavam kui alternatiivsed SSL-i seadistamise meetodid.<\/p>\n<p>N\u00fc\u00fcd saab serveris sulgeda k\u00f5ik sissetulevad \u00fchendused aktsepteerivad portid \u2014 v\u00e4lja arvatud port <code>80<\/code>, mida kasutatakse koormusejaoturiga suhtlemiseks ning port <code>22<\/code> SSH jaoks. Seet\u00f5ttu eba\u00f5nnestub otsene \u00fchendus serveriga mistahes sadamate kaudu, v\u00e4lja arvatud need kaks.<\/p>\n<h2>Summary<\/h2>\n<p>\nP\u00e4rast k\u00f5ike, mida ma selles materjalis r\u00e4\u00e4kisin, ei hirmutanud mind enam ei Docker platvorm ega automatiseeritud CI\/CD kontseptsioonid. Suutsin seadistada pideva integreerimise ahela, mille k\u00e4igus testitakse koodi enne selle tootmisesse j\u00f5udmist ja koodi automaatset juurutamist serveris. K\u00f5ik see on mulle endiselt suhteliselt uus ning olen kindel, et on viise, kuidas oma automatiseeritud t\u00f6\u00f6voogu parandada ja efektiivsemaks muuta. Seet\u00f5ttu, kui teil on selles osas ideid - andke <noindex><a rel=\"nofollow\" href=\"mailto:hello@taniarascia.com\">mulle<\/a><\/noindex> teada. Loodan, et see artikkel aitas teil teie asjades. Loodan, et p\u00e4rast selle lugemist \u00f5ppisite sama palju, kui mina \u00f5ppisin, kui uurisin k\u00f5ike, millest siin r\u00e4\u00e4gin.<\/p>\n<p><b>P.S.<\/b> Meie <noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/ru-rub\/marketplace#order\">turul<\/a><\/noindex> on olemas pilt <noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/ru-rub\/marketplace\/docker#advantages\">Docker<\/a><\/noindex>, mis installitakse \u00fche klikiga. Saate kontrollida konteinerite toimimist <noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/\">VPS<\/a><\/noindex>. K\u00f5igile uutele klientidele antakse tasuta 3 p\u00e4eva testimise jaoks.<\/p>\n<p><b>Lugupeetud lugejad!<\/b> Kasutate oma projektides CI\/CD tehnoloogiaid?<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/ru-rub\/#order\"><img decoding=\"async\" alt=\"CI\/CD-voo loomine ja t\u00f6\u00f6 automatiseerimine Dockeriga\" src=\"\/wp-content\/uploads\/2020\/02\/3fbfa90ea56a3d9b6b89ba945eb94570.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/488668\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 \u043c\u043e\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0430\u0439\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 90-\u0445. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u0411\u044b\u043b Apache-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u043e\u0431\u0449\u0435\u043c \u0445\u043e\u0441\u0442\u0438\u043d\u0433\u0435, \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u043e\u0439\u0442\u0438 \u043f\u043e FTP, \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0435\u0447\u0442\u043e \u0432\u0440\u043e\u0434\u0435 ftp:\/\/ftp.example.com. \u041f\u043e\u0442\u043e\u043c \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0438\u043c\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440. \u0414\u0440\u0443\u0433\u0438\u0435 \u0431\u044b\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0430, \u0432\u0441\u0451 \u0442\u043e\u0433\u0434\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":69352,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-69351","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=\"\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 \u043c\u043e\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0430\u0439\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 90-\u0445. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e.\" \/>\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\/sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker\" \/>\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\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 CI\/CD-\u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Docker | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 \u043c\u043e\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0430\u0439\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 90-\u0445. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker\" \/>\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=\"2020-02-18T11:44:06+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:15:00+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\udd47CI\/CD ahela loomine ja t\u00f6\u00f6 automatiseerimine Dockeriga | ProHoster","description":"Kirjutasin oma esimesed veebilehed 90ndate l\u00f5pus. Siis oli neid t\u00f6\u00f6le saada v\u00e4ga lihtne.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker","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\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 CI\/CD-\u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Docker | ProHoster","og:description":"\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 \u043c\u043e\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0430\u0439\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 90-\u0445. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e.","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker","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":"2020-02-18T11:44:06+00:00","article:modified_time":"2020-03-03T13:15:00+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"69351","title":null,"description":null,"keywords":null,"keyphrases":{"focus":[],"additional":[]},"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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:24:45","updated":"2026-08-11 12:50: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\/69351","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=69351"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/69351\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/69352"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=69351"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=69351"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=69351"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}