{"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\/hu\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","title":{"rendered":"A folyamatos telep\u00edt\u00e9s megval\u00f3s\u00edt\u00e1sa a megrendel\u0151 platformj\u00e1ra","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>A True Engineering-n\u00e9l be\u00e1ll\u00edtottuk a folyamatos friss\u00edt\u00e9si folyamatot a megrendel\u0151 szerverein, \u00e9s szeretn\u00e9nk megosztani ezt a tapasztalatot.<\/p>\n<p>Kezdetnek kidolgoztunk egy online rendszert a megrendel\u0151 sz\u00e1m\u00e1ra, \u00e9s telep\u00edtett\u00fck azt a saj\u00e1t Kubernetes klaszter\u00fckbe. Most a nagy terhel\u00e9s\u0171 megold\u00e1sunk \u00e1tk\u00f6lt\u00f6z\u00f6tt a megrendel\u0151 platformj\u00e1ra, amelyhez teljesen automatikus folyamatos telep\u00edt\u00e9si folyamatot \u00e1ll\u00edtottunk be. Ennek k\u00f6sz\u00f6nhet\u0151en felgyors\u00edtottuk a time-to-market-t, azaz a v\u00e1ltoztat\u00e1sok bevezet\u00e9s\u00e9t a term\u00e9k k\u00f6rnyezet\u00e9be. <\/p>\n<p>Ebben a cikkben bemutatjuk a folyamatos telep\u00edt\u00e9si (CD) folyamat minden l\u00e9p\u00e9s\u00e9t, vagyis az friss\u00edt\u00e9sek megrendel\u0151 platformj\u00e1ra val\u00f3 sz\u00e1ll\u00edt\u00e1s\u00e1t: <\/p>\n<ol>\n<li>hogyan indul ez a folyamat, <\/li>\n<li>a megrendel\u0151 Git-t\u00e1rhely\u00e9vel val\u00f3 szinkroniz\u00e1l\u00e1s,<\/li>\n<li>a backend \u00e9s frontend \u00f6sszegy\u0171jt\u00e9se,<\/li>\n<li>alkalmaz\u00e1s automatikus telep\u00edt\u00e9se a tesztk\u00f6rnyezetbe, <\/li>\n<li>automatikus telep\u00edt\u00e9s a Prod-ba. <\/li>\n<\/ol>\n<p>\nA folyamat sor\u00e1n megosztjuk a be\u00e1ll\u00edt\u00e1s r\u00e9szleteit.<\/p>\n<p><img decoding=\"async\" alt=\"A folyamatos telep\u00edt\u00e9s megval\u00f3s\u00edt\u00e1sa a megrendel\u0151 platformj\u00e1ra\" 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 Ind\u00edt\u00e1s<\/h3>\n<p>\nA folyamatos telep\u00edt\u00e9s azzal kezd\u0151dik, hogy a fejleszt\u0151 a v\u00e1ltoztat\u00e1sokat a Git-t\u00e1rhely\u00fcnk kiad\u00e1si \u00e1g\u00e1ba helyezi. <\/p>\n<p>Alkalmaz\u00e1sunk mikroszerviz architekt\u00far\u00e1ra \u00e9p\u00fcl, \u00e9s \u00f6sszes \u00f6sszetev\u0151je egyetlen t\u00e1rhelyen tal\u00e1lhat\u00f3. Ennek k\u00f6sz\u00f6nhet\u0151en az \u00f6sszes mikroszerviz \u00f6sszegy\u0171jt\u00e9sre \u00e9s telep\u00edt\u00e9sre ker\u00fcl, m\u00e9g akkor is, ha az egyik megv\u00e1ltozik. <\/p>\n<p>T\u00f6bb okb\u00f3l is ezen az egy t\u00e1rhelyen szervezt\u00fck a munk\u00e1t: <\/p>\n<ul>\n<li>A fejleszt\u00e9s k\u00e9nyelme \u2013 az alkalmaz\u00e1s akt\u00edvan fejl\u0151dik, \u00edgy az eg\u00e9sz k\u00f3ddal egyszerre lehet dolgozni. <\/li>\n<li>Egyetlen CI\/CD pipeline, amely garant\u00e1lja, hogy az alkalmaz\u00e1s mint egy egys\u00e9ges rendszer v\u00e9gigmegy minden teszten \u00e9s a megrendel\u0151 prod-k\u00f6rnyezet\u00e9be ker\u00fcl. <\/li>\n<li>Kiz\u00e1rja a verzi\u00f3kkal kapcsolatos z\u0171rzavart \u2013 nem kell verzi\u00f3t\u00e9rk\u00e9pet t\u00e1rolnunk a mikroszervizekhez, \u00e9s minden mikroszervizhez k\u00fcl\u00f6n konfigur\u00e1ci\u00f3t le\u00edrnunk Helm szkriptekben.<\/li>\n<\/ul>\n<h3>2. Szinkroniz\u00e1l\u00e1s a megrendel\u0151 forr\u00e1sk\u00f3dj\u00e1ra vonatkoz\u00f3 Git-t\u00e1rhely\u00e9vel<\/h3>\n<p>\nA v\u00e9grehajtott v\u00e1ltoztat\u00e1sok automatikusan szinkroniz\u00e1l\u00f3dnak a megrendel\u0151 Git-t\u00e1rhely\u00e9vel. Ott be van \u00e1ll\u00edtva az alkalmaz\u00e1s gy\u0171jt\u00e9se, amely a \u00e1g friss\u00edt\u00e9se ut\u00e1n indul el, \u00e9s a telep\u00edt\u00e9s a prod-ba. Mindk\u00e9t folyamat az \u0151 k\u00f6rnyezet\u00fckben t\u00f6rt\u00e9nik a Git-t\u00e1rhelyb\u0151l. <\/p>\n<p>K\u00f6zvetlen\u00fcl nem tudunk egy\u00fcttm\u0171k\u00f6dni az \u00fcgyf\u00e9l t\u00e1rol\u00f3j\u00e1val, mivel a saj\u00e1t fejleszt\u00e9si \u00e9s tesztel\u00e9si k\u00f6rnyezet\u00fcnkre van sz\u00fcks\u00e9g\u00fcnk. Ezekhez a c\u00e9lokhoz saj\u00e1t Git-t\u00e1rol\u00f3nkat haszn\u00e1ljuk, amely szinkroniz\u00e1lva van az \u0151 Git-t\u00e1rol\u00f3jukhoz. Amint a fejleszt\u0151 k\u00f6zz\u00e9teszi a v\u00e1ltoztat\u00e1sokat a t\u00e1rol\u00f3nk megfelel\u0151 \u00e1g\u00e1ban, a GitLab azonnal tov\u00e1bb\u00edtja ezeket a v\u00e1ltoztat\u00e1sokat az \u00fcgyf\u00e9lnek.<\/p>\n<p><img decoding=\"async\" alt=\"A folyamatos telep\u00edt\u00e9s megval\u00f3s\u00edt\u00e1sa a megrendel\u0151 platformj\u00e1ra\" src=\"\/wp-content\/uploads\/2019\/04\/9e704f112649b77f0522fa60cfcfc2bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEzut\u00e1n le kell folytatni a buildet. Ez t\u00f6bb szakaszb\u00f3l \u00e1ll: a backend \u00e9s a frontend buildje, tesztel\u00e9s \u00e9s a produkci\u00f3ba val\u00f3 sz\u00e1ll\u00edt\u00e1s.<\/p>\n<h3>3. A backend \u00e9s a frontend buildje<\/h3>\n<p>\nA backend \u00e9s a frontend buildje k\u00e9t p\u00e1rhuzamos feladat, amelyeket a GitLab Runner rendszer\u00e9ben v\u00e9geznek. Az alap build konfigur\u00e1ci\u00f3ja ugyanabban a t\u00e1rol\u00f3ban tal\u00e1lhat\u00f3.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ce\/ci\/yaml\/\">YAML-scriptek \u00edr\u00e1s\u00e1ra vonatkoz\u00f3 \u00fatmutat\u00f3 a GitLabban<\/a><\/noindex>.<\/p>\n<p>A GitLab Runner let\u00f6lti a k\u00f3dot a sz\u00fcks\u00e9ges t\u00e1rol\u00f3b\u00f3l, majd a Java alkalmaz\u00e1s build parancs\u00e1val \u00f6sszegy\u0171jti \u00e9s elk\u00fcldi a Docker registrybe. Itt a backend \u00e9s a frontend buildj\u00e9t v\u00e9gezz\u00fck, Docker-k\u00e9peket kapunk, amelyeket az \u00fcgyf\u00e9l oldal\u00e1n l\u00e9v\u0151 t\u00e1rol\u00f3ba helyez\u00fcnk. A Docker-k\u00e9pek kezel\u00e9s\u00e9re <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/palantir\/gradle-docker\">a Gradle plugint haszn\u00e1ljuk.<\/a><\/noindex>.<\/p>\n<p>A k\u00e9peink verzi\u00f3j\u00e1t a Dockerbe kiadott verzi\u00f3val szinkroniz\u00e1ljuk. A zavartalan m\u0171k\u00f6d\u00e9s \u00e9rdek\u00e9ben n\u00e9h\u00e1ny be\u00e1ll\u00edt\u00e1st v\u00e9gezt\u00fcnk el:<\/p>\n<p>1. A tesztk\u00f6rnyezet \u00e9s a termel\u00e9si k\u00f6rnyezet k\u00f6z\u00f6tt a kont\u00e9nereket nem \u00e9p\u00edtj\u00fck \u00fajra. Parametriz\u00e1l\u00e1sokat v\u00e9gezt\u00fcnk, hogy ugyanaz a kont\u00e9ner \u00fajra\u00e9p\u00edt\u00e9s n\u00e9lk\u00fcl m\u0171k\u00f6dj\u00f6n minden be\u00e1ll\u00edt\u00e1ssal, k\u00f6rnyezeti v\u00e1ltoz\u00f3kkal \u00e9s szolg\u00e1ltat\u00e1sokkal, mind a tesztk\u00f6rnyezetben, mind a produkci\u00f3s k\u00f6rnyezetben. <\/p>\n<p>2. Az alkalmaz\u00e1s friss\u00edt\u00e9se a Helmen kereszt\u00fcl a verzi\u00f3 megad\u00e1s\u00e1t ig\u00e9nyli. A backend, a frontend buildje \u00e9s az alkalmaz\u00e1s friss\u00edt\u00e9se h\u00e1rom k\u00fcl\u00f6n feladat, ez\u00e9rt fontos, hogy mindenhol ugyanazt az alkalmaz\u00e1sverzi\u00f3t haszn\u00e1ljuk. Ehhez az adatokat a Git-t\u00f6rt\u00e9nelemb\u0151l nyerj\u00fck, mivel a K8S klaszter \u00e9s az alkalmaz\u00e1s konfigur\u00e1ci\u00f3ja ugyanabban a Git-t\u00e1rol\u00f3ban tal\u00e1lhat\u00f3.<\/p>\n<p>Az alkalmaz\u00e1s verzi\u00f3j\u00e1t a parancs v\u00e9grehajt\u00e1s\u00e1nak eredm\u00e9ny\u00e9b\u0151l nyerj\u00fck ki<br \/>\n<code>git describe --tags --abbrev=7<\/code>.<\/p>\n<h3>4. Minden v\u00e1ltoz\u00e1s automatikus telep\u00edt\u00e9se a tesztk\u00f6rnyezetbe (UAT) <\/h3>\n<p>\nA build script k\u00f6vetkez\u0151 szakasz\u00e1ban az K8S klaszter automatikus friss\u00edt\u00e9se t\u00f6rt\u00e9nik. Ez akkor t\u00f6rt\u00e9nik, ha az alkalmaz\u00e1s teljesen fel\u00e9p\u00fclt, \u00e9s minden artefaktum k\u00f6zz\u00e9 lett t\u00e9ve a Docker Registryben. Ezt k\u00f6vet\u0151en elindul a tesztk\u00f6rnyezet friss\u00edt\u00e9se.<\/p>\n<p>A klaszter friss\u00edt\u00e9se az al\u00e1bbi parancs seg\u00edts\u00e9g\u00e9vel t\u00f6rt\u00e9nik <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/helm\/#helm-upgrade\">Helm friss\u00edt\u00e9s<\/a><\/noindex>. Ha valami nem a tervek szerint alakul, a Helm automatikusan \u00e9s \u00f6n\u00e1ll\u00f3an vissza\u00e1ll\u00edtja az \u00f6sszes v\u00e1ltoztat\u00e1s\u00e1t. Munk\u00e1j\u00e1nak figyelemmel k\u00eds\u00e9r\u00e9se nem sz\u00fcks\u00e9ges. <\/p>\n<p>A K8S klaszter konfigur\u00e1ci\u00f3j\u00e1t a csomaggal egy\u00fctt biztos\u00edtjuk. Ez\u00e9rt a k\u00f6vetkez\u0151 l\u00e9p\u00e9s a konfigur\u00e1ci\u00f3 friss\u00edt\u00e9se: configMaps, deployok, szolg\u00e1ltat\u00e1sok, titkok \u00e9s b\u00e1rmely m\u00e1s K8S konfigur\u00e1ci\u00f3, amit megv\u00e1ltoztattunk. <\/p>\n<p>Ezut\u00e1n a Helm elind\u00edtja az alkalmaz\u00e1s RollOut friss\u00edt\u00e9s\u00e9t a tesztk\u00f6rnyezetben, miel\u0151tt az alkalmaz\u00e1st \u00e9les k\u00f6rnyezetben telep\u00edten\u00e9k. Ezt az\u00e9rt tessz\u00fck, hogy a felhaszn\u00e1l\u00f3k manu\u00e1lisan ellen\u0151rizhess\u00e9k a tesztk\u00f6rnyezetbe tett \u00fczleti funkci\u00f3kat.<\/p>\n<h3>5. Minden v\u00e1ltoztat\u00e1s automatikus telep\u00edt\u00e9se a Prod k\u00f6rnyezetbe <\/h3>\n<p>\nA friss\u00edt\u00e9s \u00e9les k\u00f6rnyezetbe val\u00f3 telep\u00edt\u00e9s\u00e9hez csak egy gombot kell megnyomni a GitLabban \u2014 \u00e9s a kont\u00e9nerek azonnal a termel\u00e9si k\u00f6rnyezetbe ker\u00fclnek.<\/p>\n<p>Ugyanaz az alkalmaz\u00e1s \u00fajra\u00e9p\u00edt\u00e9s n\u00e9lk\u00fcl m\u0171k\u00f6dhet k\u00fcl\u00f6nb\u00f6z\u0151 k\u00f6rnyezetekben \u2014 teszt \u00e9s \u00e9les. Ugyanazokat az artefaktumokat haszn\u00e1ljuk, an\u00e9lk\u00fcl, hogy b\u00e1rmit is megv\u00e1ltoztatn\u00e1nk az alkalmaz\u00e1son, a param\u00e9tereket pedig k\u00edv\u00fclr\u0151l \u00e1ll\u00edtjuk be. <\/p>\n<p>Az alkalmaz\u00e1s be\u00e1ll\u00edt\u00e1sainak rugalmas param\u00e9terez\u00e9se att\u00f3l f\u00fcgg, hogy az alkalmaz\u00e1s milyen k\u00f6rnyezetben fut. Minden k\u00f6rnyezeti be\u00e1ll\u00edt\u00e1st kiemelt\u00fcnk: az \u00f6sszes param\u00e9ter a K8S konfigur\u00e1ci\u00f3n \u00e9s a Helm param\u00e9tereken kereszt\u00fcl van param\u00e9terezve. Amikor a Helm telep\u00edti a csomagot a tesztk\u00f6rnyezetbe, a tesztparam\u00e9tereket alkalmazza, \u00e9les k\u00f6rnyezetben pedig az \u00e9les param\u00e9tereket.<\/p>\n<p>A legnehezebb az volt, hogy param\u00e9terezni tudjuk az \u00f6sszes haszn\u00e1lt szolg\u00e1ltat\u00e1st \u00e9s v\u00e1ltoz\u00f3t, amelyek a k\u00f6rnyezett\u0151l f\u00fcggenek, \u00e9s \u00e1talak\u00edtsuk \u0151ket k\u00f6rnyezeti v\u00e1ltoz\u00f3kk\u00e1 \u00e9s konfigur\u00e1ci\u00f3s le\u00edr\u00e1sokk\u00e1 a Helm sz\u00e1m\u00e1ra. <\/p>\n<p>Az alkalmaz\u00e1s param\u00e9tereiben k\u00f6rnyezeti v\u00e1ltoz\u00f3kat haszn\u00e1lunk. Ezek \u00e9rt\u00e9keit a K8S configmap seg\u00edts\u00e9g\u00e9vel adjuk meg a kont\u00e9nerekben, amelyet Go sablonokkal sablonos\u00edtunk. P\u00e9ld\u00e1ul a k\u00f6rnyezeti v\u00e1ltoz\u00f3 be\u00e1ll\u00edt\u00e1sa a domain nev\u00e9re \u00edgy lehets\u00e9ges:<\/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 ebben a v\u00e1ltoz\u00f3ban t\u00e1roljuk a k\u00f6rnyezet nev\u00e9t (prod, stage, UAT).<br \/>\n<b>.Values.app.properties.app_external_domain<\/b> \u2013 ebben a v\u00e1ltoz\u00f3ban a .Values.yaml f\u00e1jlban hat\u00e1rozzuk meg a k\u00edv\u00e1nt domaint <\/p>\n<p>A Helm friss\u00edt\u00e9sekor a Helm sablonokb\u00f3l hozza l\u00e9tre a configmap.yaml f\u00e1jlt, \u00e9s kit\u00f6lti az APP_EXTERNAL_DOMAIN \u00e9rt\u00e9k\u00e9t a megfelel\u0151 \u00e9rt\u00e9kkel az adott k\u00f6rnyezett\u0151l f\u00fcgg\u0151en, ahol a friss\u00edt\u00e9st v\u00e9grehajtj\u00e1k. Ezt a v\u00e1ltoz\u00f3t m\u00e1r a kont\u00e9nerben \u00e1ll\u00edtj\u00e1k be. Az alkalmaz\u00e1sb\u00f3l hozz\u00e1f\u00e9rhet\u0151, \u00edgy az egyes k\u00f6rnyezetekben ennek a v\u00e1ltoz\u00f3nak m\u00e1s-m\u00e1s \u00e9rt\u00e9ke lesz. <\/p>\n<p>A k\u00f6zelm\u00faltban a Spring Cloudban megjelent a K8S t\u00e1mogat\u00e1s, bele\u00e9rtve a configMap-ek kezel\u00e9s\u00e9t is: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-kubernetes\">Spring Cloud Kubernetes<\/a><\/noindex>. Mivel a projekt akt\u00edvan fejl\u0151dik \u00e9s alapvet\u0151en megv\u00e1ltozik, nem haszn\u00e1lhatjuk \u00e9lesben. De folyamatosan figyelemmel k\u00eds\u00e9rj\u00fck az \u00e1llapot\u00e1t \u00e9s haszn\u00e1ljuk DEV konfigur\u00e1ci\u00f3kban. Amint stabiliz\u00e1l\u00f3dik, \u00e1t\u00e1llunk az k\u00f6rnyezeti v\u00e1ltoz\u00f3k haszn\u00e1lat\u00e1r\u00f3l r\u00e1.<\/p>\n<h3>\u00d6sszesen<\/h3>\n<p>\nTeh\u00e1t, a Continuous Deployment be van \u00e1ll\u00edtva \u00e9s m\u0171k\u00f6dik. Minden friss\u00edt\u00e9s egyetlen gombnyom\u00e1sra t\u00f6rt\u00e9nik. A v\u00e1ltoz\u00e1sok automatikusan ker\u00fclnek be a termel\u00e9si k\u00f6rnyezetbe. \u00c9s ami fontos, a friss\u00edt\u00e9sek nem \u00e1ll\u00edtj\u00e1k le a rendszer m\u0171k\u00f6d\u00e9s\u00e9t. <\/p>\n<p><img decoding=\"async\" alt=\"A folyamatos telep\u00edt\u00e9s megval\u00f3s\u00edt\u00e1sa a megrendel\u0151 platformj\u00e1ra\" src=\"\/wp-content\/uploads\/2019\/04\/07d609d9a40f644cfdad2bdb88652af2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>J\u00f6v\u0151beli tervek: automatikus adatb\u00e1zis-migr\u00e1ci\u00f3<\/h3>\n<p>\nGondolkodtunk az adatb\u00e1zis friss\u00edt\u00e9s\u00e9r\u0151l \u00e9s a v\u00e1ltoz\u00e1sok vissza\u00e1ll\u00edt\u00e1s\u00e1nak lehet\u0151s\u00e9g\u00e9r\u0151l. Hiszen egyszerre k\u00e9t k\u00fcl\u00f6nb\u00f6z\u0151 verzi\u00f3 m\u0171k\u00f6dik: a r\u00e9gi verzi\u00f3 fut, m\u00edg az \u00faj verzi\u00f3 telep\u00edt\u00e9s alatt \u00e1ll. A r\u00e9git csak akkor kapcsoljuk ki, amikor meggy\u0151z\u0151d\u00fcnk arr\u00f3l, hogy az \u00faj verzi\u00f3 m\u0171k\u00f6dik. Az adatb\u00e1zis-migr\u00e1ci\u00f3nak lehet\u0151v\u00e9 kell tennie, hogy mindk\u00e9t alkalmaz\u00e1sverzi\u00f3val dolgozhassunk. <\/p>\n<p>Ez\u00e9rt nem tudunk csak \u00fagy m\u00f3dos\u00edtani egy oszlop vagy m\u00e1s adatok nev\u00e9t. De l\u00e9trehozhatunk egy \u00faj oszlopot, \u00e1tm\u00e1solhatjuk az adatokat a r\u00e9gi oszlopb\u00f3l, \u00e9s \u00edrhatsz trigger-eket, amelyek az adatok friss\u00edt\u00e9sekor egyidej\u0171leg \u00e1tm\u00e1solj\u00e1k \u00e9s friss\u00edtik azokat a m\u00e1sik oszlopban. \u00c9s a \u00faj verzi\u00f3 sikeres telep\u00edt\u00e9se ut\u00e1n, a post launch support id\u0151szak ut\u00e1n elt\u00e1vol\u00edthatjuk a r\u00e9gi oszlopot \u00e9s a sz\u00fcks\u00e9gtelenn\u00e9 v\u00e1lt triggert. <\/p>\n<p>Ha az \u00faj verzi\u00f3 nem m\u0171k\u00f6dik helyesen, vissza\u00e1llhatunk a kor\u00e1bbi verzi\u00f3ra, bele\u00e9rtve az el\u0151z\u0151 adatb\u00e1zisverzi\u00f3t is. Sz\u00f3val, a v\u00e1ltoztat\u00e1saink lehet\u0151v\u00e9 teszik, hogy egyszerre t\u00f6bb verzi\u00f3val dolgozzunk. <\/p>\n<p>Tervez\u00fcnk egy automatiz\u00e1lt adatb\u00e1zis-migr\u00e1ci\u00f3s folyamatot K8S job-on kereszt\u00fcl, amelyet be\u00e9p\u00edt\u00fcnk a CD folyamat\u00e1ba. \u00c9s mindenk\u00e9ppen megosztjuk ezt a tapasztalatot a Hubon.<br \/>\n<br \/>Forr\u00e1s: <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.3 - 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\/hu\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\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\/hu\/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\udd47A folyamatos telep\u00edt\u00e9s megval\u00f3s\u00edt\u00e1sa az \u00fcgyf\u00e9l platformj\u00e1ra | ProHoster","description":"A True Engineering-n\u00e9l be\u00e1ll\u00edtottuk a folyamatos friss\u00edt\u00e9sek k\u00e9zbes\u00edt\u00e9s\u00e9nek folyamat\u00e1t az \u00fcgyfelek szervereire, \u00e9s szeretn\u00e9nk megosztani ezt a tapasztalatot. El\u0151sz\u00f6r is, kifejlesztett\u00fcnk egy online rendszert az \u00fcgyf\u00e9l sz\u00e1m\u00e1ra \u00e9s telep\u00edtett\u00fck azt a saj\u00e1t infrastrukt\u00far\u00e1nkba.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/31377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=31377"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/31377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/23342"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=31377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=31377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=31377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}