{"id":31377,"date":"2019-10-31T21:40:57","date_gmt":"2019-10-31T18:40:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\/"},"modified":"2019-10-31T21:40:57","modified_gmt":"2019-10-31T18:40:57","slug":"nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","title":{"rendered":"Meie pideva juurutamise rakendus kliendi platvormile","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Meie True Engineeringus oleme seadistanud pideva v\u00e4rskenduste kohaletoimetamise protsessi kliendi serveritesse ja soovime seda kogemust jagada.<\/p>\n<p>Esiteks l\u00f5ime veebip\u00f5hise s\u00fcsteemi kliendi jaoks ja paigaldasime selle oma Kubernetes klastrisse. N\u00fc\u00fcd on meie k\u00f5rge koormusega lahendus kolinud kliendi platvormile, mille jaoks oleme seadistanud t\u00e4ielikult automatiseeritud pideva kohaletoimetamise protsessi. Selle t\u00f5ttu oleme kiirendanud toote keskkonda toimetamise aega. <\/p>\n<p>Selles artiklis r\u00e4\u00e4gime k\u00f5igist pideva kohaletoimetamise (CD) protsessi etappidest v\u00f5i v\u00e4rskenduste kohaletoimetamisest kliendi platvormile: <\/p>\n<ol>\n<li>kuidas see protsess algab, <\/li>\n<li>s\u00fcnkroonimine kliendi Git-reposiidiga,<\/li>\n<li>tagaplaadi ja esiplaadi ehitamine,<\/li>\n<li>rakenduse automaatne edasiviimine testkeskkonda, <\/li>\n<li>rakenduse automaatne edasiviimine tootmisv\u00f5rku. <\/li>\n<\/ol>\n<p>\nProtsessi k\u00e4igus jagame seadistamise detaile.<\/p>\n<p><img decoding=\"async\" alt=\"Meie pideva juurutamise rakendus kliendi platvormile\" src=\"\/wp-content\/uploads\/2019\/04\/54be580319906344a6e2f091395ea7a7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>1. CD k\u00e4ivitamine<\/h3>\n<p>\nPidev kohaletoimetamine algab sellest, et arendaja paneb muudatused meie Git-reposiidi v\u00e4ljaanne harusse. <\/p>\n<p>Meie rakendus t\u00f6\u00f6tab mikroteenuste arhitektuuri alusel ja k\u00f5ik selle komponendid asuvad \u00fches repos. Seet\u00f5ttu kogutakse ja installitakse k\u00f5ik mikroteenused, isegi kui \u00fcks neist on muutunud. <\/p>\n<p>Oleme korraldanud t\u00f6\u00f6 \u00fche repositooriumi kaudu mitmel p\u00f5hjusel: <\/p>\n<ul>\n<li>Arendamise mugavus \u2014 rakendus areneb aktiivselt, seet\u00f5ttu saab t\u00f6\u00f6delda kohe kogu koodi. <\/li>\n<li>\u00dcksik CI\/CD torujuhe, mis tagab, et rakendus kui tervik l\u00e4bib k\u00f5ik testid ja toimetatakse kliendi tootmisv\u00f5rku. <\/li>\n<li>V\u00e4ltime versioonide segadust \u2014 me ei pea hoidma mikroteenuste versioonikaarti ja kirjeldama iga mikroteenuse konfigureerimist Helm skritpides.<\/li>\n<\/ul>\n<h3>2. S\u00fcnkroonimine kliendi l\u00e4htekoodi Git-reposiidiga<\/h3>\n<p>\nTehtud muudatused s\u00fcnergeeruvad automaatselt kliendi Git-reposiidiga. Seal on seadistatud rakenduse kogumine, mis k\u00e4ivitub p\u00e4rast haru v\u00e4rskendamist, ja tootmisv\u00f5rku edasiviimine. M\u00f5lemad protsessid toimuvad nende keskkonnas Git-reposiidist. <\/p>\n<p>Me ei saa t\u00f6\u00f6tada kliendi repositooriumiga otse, kuna meil on vaja oma arenduse ja testimise keskkondi. Me kasutame nende jaoks oma Git-repositooriumi \u2014 see on s\u00fcnkroonitud nende Git-repositooriumiga. Kui arendaja v\u00e4ljendab muudatused meie repositooriumi vastavasse haru, saadab GitLab need kohe kliendile.<\/p>\n<p><img decoding=\"async\" alt=\"Meie pideva juurutamise rakendus kliendi platvormile\" src=\"\/wp-content\/uploads\/2019\/04\/9e704f112649b77f0522fa60cfcfc2bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeej\u00e4rel tuleb teha kogumine. See koosneb mitmest etapist: tagaplaneeringu ja esipaneeli kogumine, testimine ja edastamine tootmisse.<\/p>\n<h3>3. Tagaplaneeringu ja esipaneeli kogumine<\/h3>\n<p>\nTagaplaneeringu ja esipaneeli kogumine on kaks paralleelset \u00fclesannet, mis t\u00e4idetakse GitLab Runneris. Asetuse algse kogumise konfiguratsioon asub samas repositooriumis.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ce\/ci\/yaml\/\">Juhend YAML-skripti kirjutamiseks GitLabis kogumiseks<\/a><\/noindex>.<\/p>\n<p>GitLab Runner v\u00f5tab koodi \u00f5igest repositooriumist, kogumise Java-rakenduse k\u00e4suga kogub ja saadab selle Docker registry'sse. Siin me kogume tagaplaneeringu ja esipaneeli, saame Docker-pildid, mille paigutame kliendi poolel asuvasse repositooriumisse. Docker-piltide haldamiseks kasutame <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/palantir\/gradle-docker\">Gradle pluginit<\/a><\/noindex>.<\/p>\n<p>Me s\u00fcnkroniseerime meie piltide versioonid v\u00e4ljaandmise versiooniga, mis Dockerisse pannakse. Sujuvaks toimimiseks tegime m\u00f5ned seadistused:<\/p>\n<p>1. Testkeskkonna ja tootmisest konteinerid ei koostatakse uuesti. Me tegime parameteriseerimise, et sama konteiner saaks t\u00f6\u00f6tada k\u00f5igi seadistuste, keskkonnaparameetrite ja teenustega nii testkeskkonnas kui ka tootmises ilma uuesti koostamiseta. <\/p>\n<p>2. Rakenduse uuendamiseks Helmiga tuleb n\u00e4idata selle versiooni. Meie tagaplaneeringu, esipaneeli kogumine ja rakenduse uuendamine on kolm erinevat \u00fclesannet, seet\u00f5ttu on oluline kasutada igal pool \u00fchte ja sama rakenduse versiooni. Selle \u00fclesande jaoks kasutame andmeid Git'i ajaloost, kuna meie K8S klastri ja rakenduse konfiguratsioon asub \u00fches Git-repositooriumis.<\/p>\n<p>Rakenduse versiooni saadakse k\u00e4su<br \/>\n<code>git describe --tags --abbrev=7<\/code>.<\/p>\n<h3>4. K\u00f5ikide muudatuste automaatne juurutamine testkeskkonnas (UAT) <\/h3>\n<p>\nSelle kogumisskripti j\u00e4rgmisel etapil toimub K8S klastri automaatne uuendamine. See juhtub tingimusel, et kogu rakendus on kokku seatud ja k\u00f5ik artefaktid on avaldatud Docker Registry's. P\u00e4rast seda k\u00e4ivitatakse testkeskkonna uuendamine.<\/p>\n<p>Klastri uuendamine k\u00e4ivitatakse kasutades <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/helm\/#helm-upgrade\">Helm'i uuendamine<\/a><\/noindex>. Kui see protsess l\u00e4heb valesti, tagab Helm automaatselt ja iseseisvalt k\u00f5ik muudatused tagasi. Tema t\u00f6\u00f6d ei pea j\u00e4lgima. <\/p>\n<p>Koos kogumisega anname K8S klastrikonfiguratsiooni. Seet\u00f5ttu on j\u00e4rgmine samm selle uuendamine: configMaps, deployments, services, secrets ja k\u00f5ik muud K8S konfiguratsioonid, mida oleme muutnud. <\/p>\n<p>P\u00e4rast seda k\u00e4ivitab Helm rakenduse RollOut uuendamise testkeskkonnas. Enne rakenduse k\u00e4ivitamist tootmises. See on tehtud selleks, et kasutajad saaksid k\u00e4esolevas testkeskkonnas k\u00e4sitsi kontrollida meie v\u00e4lja pandud \u00e4riomadusi.<\/p>\n<h3>5. K\u00f5igi muudatuste automaatne juurutamine Prod- keskkonda <\/h3>\n<p>\nTootmisse uuenduse juurutamiseks tuleb vaid GitLabis vajutada \u00fchele nupule \u2014 ja konteinerid toimetatakse kohe tootmiskeskkonda.<\/p>\n<p>Sama rakendus v\u00f5ib t\u00f6\u00f6tada erinevates keskkondades \u2014 testimis- ja tootmisre\u017eiimis \u2014 ilma uuesti \u00fcles ehitamata. Me kasutame samu artefakte, muutes rakenduses midagi, samas kui parameetrid m\u00e4\u00e4ratakse v\u00e4ljastpoolt. <\/p>\n<p>Rakenduse seadistuste paindlik parametriseerimine s\u00f5ltub keskkonnast, kus rakendus t\u00f6\u00f6tab. Me oleme k\u00f5ik keskkonnaseadistused v\u00e4lja viinud: k\u00f5ik parametriseeritakse l\u00e4bi K8S konfiguratsiooni ja Helm parameetrite. Kui Helm juurutab kogumise testkeskkonda, rakendatakse sellele testparameetreid, tootmiskeskkonnas aga tootmisparameetreid.<\/p>\n<p>K\u00f5ige keerulisem oli k\u00f5iki kasutatavaid teenuseid ja muutujaid, mis s\u00f5ltuvad keskkonnast, parametriseerida ning t\u00f5lkida need keskkonna muutujateks ja Helm'i parameetrite kirjeldamiseks. <\/p>\n<p>Rakenduse parameetrites kasutatakse keskkonna muutujaid. Nende v\u00e4\u00e4rtused m\u00e4\u00e4ratakse konteinerites K8S configmap'i kaudu, mis on Go-mallide abil mallitud. N\u00e4iteks, keskkonna muutuja m\u00e4\u00e4ramine domeeni nimele v\u00f5ib v\u00e4lja n\u00e4ha selline:<\/p>\n<p><code>APP_EXTERNAL_DOMAIN: {{ (pluck .Values.global.env .Values.app.properties.app_external_domain | first) }}<\/code><\/p>\n<p><b>.Values.global.env <\/b>\u2013 see muutuja sisaldab keskkonna nime (prod, stage, UAT).<br \/>\n<b>.Values.app.properties.app_external_domain<\/b> \u2013 selles muutuja, m\u00e4\u00e4rame .Values.yaml failis vajaliku domeeni <\/p>\n<p>Helm rakenduse v\u00e4rskendamisel loob configmap.yaml faili \u0161ablonite p\u00f5hjal ja t\u00e4idab APP_EXTERNAL_DOMAIN v\u00e4\u00e4rtuse, mis s\u00f5ltub keskkonnast, kus rakenduse v\u00e4rskendus k\u00e4ivitatakse. See muutujat kasutatakse juba konteineris. Rakendusel on sellele juurdep\u00e4\u00e4s, seega on rakenduse igas keskkonnas selle muutuja v\u00e4\u00e4rtus erinev. <\/p>\n<p>Suhteliselt hiljuti ilmus Spring Cloudis K8S tugi, sealhulgas t\u00f6\u00f6 configMapidega: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-kubernetes\">Spring Cloud Kubernetes<\/a><\/noindex>. Kuna projekt areneb aktiivselt ja muutub radikaalselt, ei saa me seda tootmises kasutada. Kuid j\u00e4lgime selle seisukorda ja kasutame seda DEV konfiguratsioonides. Kui see stabiliseerub, siis liigume keskkonnamuutujate kasutamiselt selle juurde.<\/p>\n<h3>Kokkuv\u00f5ttes<\/h3>\n<p>\nNii et pidev juurutamine on seadistatud ja t\u00f6\u00f6tab. K\u00f5ik v\u00e4rskendused toimuvad \u00fche nupu vajutusega. Muudatuste toimetamine tootmisse toimub automaatselt. Ja mis oluline, v\u00e4rskendused ei peata s\u00fcsteemi t\u00f6\u00f6d. <\/p>\n<p><img decoding=\"async\" alt=\"Meie pideva juurutamise rakendus kliendi platvormile\" src=\"\/wp-content\/uploads\/2019\/04\/07d609d9a40f644cfdad2bdb88652af2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Tulevikuplaanid: automaatne andmebaasi migratsioon<\/h3>\n<p>\nOleme m\u00f5elnud andmebaasi uuendamisele ja v\u00f5imalusele need muutused tagasi p\u00f6\u00f6rata. Sest samal ajal t\u00f6\u00f6tavad kaks erinevat rakenduse versiooni: vana t\u00f6\u00f6tab ja uus t\u00f5stetakse \u00fcles. Ja vana v\u00e4lja l\u00fclitame alles siis, kui veendume, et uus versioon t\u00f6\u00f6tab. Andmebaasi migratsioon peab v\u00f5imaldama t\u00f6\u00f6tada m\u00f5lema rakenduse versiooniga. <\/p>\n<p>Seega ei saa me lihtsalt muuta veeru nime v\u00f5i muid andmeid. Kuid me saame luua uue veeru, kopeerida sinna andmed vanast veerust ja kirjutada triggerid, mis v\u00e4rskendades andmeid kopeerivad ja uuendavad need samal ajal teises veerus. Ja p\u00e4rast uus versioon rakenduse edukat juurutamist, p\u00e4rast post-launch toetuse perioodi, saame eemaldada vana veeru ja muutunud tarbetu triggeri. <\/p>\n<p>Kui uus versioon rakendusest ei t\u00f6\u00f6ta korralikult, saame tagasi minna eelnenud versiooni juurde, sealhulgas ka eelneva andmebaasi versiooni juurde. \u00dches\u00f5naga, meie muudatused v\u00f5imaldavad \u00fcheaegselt t\u00f6\u00f6tada mitme rakenduse versiooniga. <\/p>\n<p>Kavandame andmebaasi migratsiooni automatiseerimist K8S t\u00f6\u00f6 kaudu, integreerides selle CD protsessi. Ja kindlasti jagame seda kogemust Habr's.<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/447812\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u043e \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 Continuous Deployment. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 time-to-market \u2013 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23342,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31377","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=\"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c.\" \/>\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\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\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\u041d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Continuous Deployment \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:40:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:40:57+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\udd47Meie Continuous Deployment'i rakendamine kliendi platvormile | ProHoster","description":"Meie True Engineeringus oleme seadistatud pideva v\u00e4rskenduste kohaletoimetamise protsessi kliendi serveritesse ja soovime seda kogemust jagada. K\u00f5igepealt l\u00f5ime kliendi jaoks veebip\u00f5hise s\u00fcsteemi ja k\u00e4ivitasime selle enda serveris.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","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\u041d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Continuous Deployment \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 | ProHoster","og:description":"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c.","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:40:57+00:00","article:modified_time":"2019-10-31T18:40:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31377","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 05:52:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:18:39","updated":"2026-01-21 05:52:19","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\/31377","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=31377"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/31377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/23342"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=31377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=31377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=31377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}