{"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\/ro\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","title":{"rendered":"Implementarea noastr\u0103 de Continuous Deployment pe platforma clientului","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>La True Engineering, am configurat un proces de livrare continu\u0103 a actualiz\u0103rilor pe serverele clien\u021bilor \u0219i dorim s\u0103 \u00eemp\u0103rt\u0103\u0219im aceast\u0103 experien\u021b\u0103.<\/p>\n<p>La \u00eenceput, am dezvoltat un sistem online pentru client \u0219i l-am desf\u0103\u0219urat \u00een propriul nostru cluster Kubernetes. Acum solu\u021bia noastr\u0103 de \u00eenalt\u0103 capacitate a fost transferat\u0103 pe platforma clientului, pentru care am configurat un proces complet automatizat de Continuous Deployment. Datorit\u0103 acestui lucru, am accelerat time-to-market-ul \u2013 livrarea modific\u0103rilor \u00een mediul de produc\u021bie. <\/p>\n<p>\u00cen acest articol, v\u0103 vom prezenta toate etapele procesului de Continuous Deployment (CD) sau livrarea actualiz\u0103rilor pe platforma clientului: <\/p>\n<ol>\n<li>cum \u00eencepe acest proces, <\/li>\n<li>sincronizarea cu Git-repozi\u021biul clientului,<\/li>\n<li>compilarea backend-ului \u0219i frontend-ului,<\/li>\n<li>desf\u0103\u0219urarea automat\u0103 a aplica\u021biei \u00een mediu de testare, <\/li>\n<li>desf\u0103\u0219urarea automat\u0103 \u00een Prod. <\/li>\n<\/ol>\n<p>\nPe parcurs, vom \u00eemp\u0103rt\u0103\u0219i detaliile configura\u021biei.<\/p>\n<p><img decoding=\"async\" alt=\"Implementarea noastr\u0103 de Continuous Deployment pe platforma clientului\" 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. \u00cenceperea CD<\/h3>\n<p>\nContinuous Deployment \u00eencepe atunci c\u00e2nd dezvoltatorul public\u0103 modific\u0103rile \u00een ramura de livrare a Git-repozi\u021biei noastre. <\/p>\n<p>Aplica\u021bia noastr\u0103 func\u021bioneaz\u0103 pe baza unei arhitecturi de microservicii, iar toate componentele sale sunt stocate \u00eentr-un singur repo. Datorit\u0103 acestui lucru, toate microserviciile sunt compilate \u0219i instalate, chiar dac\u0103 unul dintre ele a fost modificat. <\/p>\n<p>Am organizat activitatea printr-un singur repo din mai multe motive: <\/p>\n<ul>\n<li>Convenien\u021ba dezvolt\u0103rii \u2013 aplica\u021bia se dezvolt\u0103 activ, a\u0219a c\u0103 se poate lucra direct cu tot codul. <\/li>\n<li>Un pipeline CI\/CD unic care garanteaz\u0103 c\u0103 aplica\u021bia, ca un sistem unitar, trece prin toate testele \u0219i este livrat\u0103 \u00een mediu prod al clientului. <\/li>\n<li>Excludem confuzia \u00een versiunile \u2013 nu trebuie s\u0103 p\u0103str\u0103m o hart\u0103 a versiunilor microserviciilor \u0219i s\u0103 descriem pentru fiecare microserviciu propria configura\u021bie \u00een scripturile Helm.<\/li>\n<\/ul>\n<h3>2. Sincronizarea cu Git-repozi\u021biul de cod surs\u0103 al clientului<\/h3>\n<p>\nModific\u0103rile efectuate sunt sincronizate automat cu Git-repozi\u021biul clientului. Acolo este configurat\u0103 compilarea aplica\u021biei, care se porne\u0219te dup\u0103 actualizarea ramurii, \u0219i desf\u0103\u0219urarea \u00een prod. Ambele procese au loc \u00een mediul lor din Git-repozi\u021bie. <\/p>\n<p>Nu putem lucra direct cu repository-ul clientului, deoarece avem nevoie de mediile noastre pentru dezvoltare \u0219i testare. Pentru aceste scopuri, folosim propriul nostru repository Git \u2014 acesta este sincronizat cu repository-ul lor Git. De fiecare dat\u0103 c\u00e2nd un dezvoltator public\u0103 modific\u0103rile \u00een ramura corespunz\u0103toare a repository-ului nostru, GitLab trimite imediat aceste modific\u0103ri clientului.<\/p>\n<p><img decoding=\"async\" alt=\"Implementarea noastr\u0103 de Continuous Deployment pe platforma clientului\" src=\"\/wp-content\/uploads\/2019\/04\/9e704f112649b77f0522fa60cfcfc2bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDup\u0103 aceea, trebuie s\u0103 facem construc\u021bia. Aceasta const\u0103 din mai multe etape: construc\u021bia backend-ului \u0219i frontend-ului, testarea \u0219i livrarea \u00een produc\u021bie.<\/p>\n<h3>3. Construc\u021bia backend-ului \u0219i frontend-ului<\/h3>\n<p>\nConstruc\u021bia backend-ului \u0219i frontend-ului este o sarcin\u0103 paralel\u0103 care se desf\u0103\u0219oar\u0103 \u00een sistemul GitLab Runner. Configurarea construc\u021biei ini\u021biale se afl\u0103 \u00een acela\u0219i repository.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ce\/ci\/yaml\/\">Tutorial pentru scrierea scripturilor YAML pentru construc\u021bia \u00een GitLab<\/a><\/noindex>.<\/p>\n<p>GitLab Runner preia codul din repository-ul necesar, construie\u0219te aplica\u021bia Java \u0219i o trimite \u00een Docker registry. Aici construim backend-ul \u0219i frontend-ul, ob\u021binem imagini Docker pe care le stoc\u0103m \u00een repository-ul clientului. Pentru gestionarea imaginilor Docker folosim <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/palantir\/gradle-docker\">pluginul Gradle<\/a><\/noindex>.<\/p>\n<p>Sincroniz\u0103m versiunile imaginilor noastre cu versiunea de release care va fi publicat\u0103 \u00een Docker. Pentru o func\u021bionare fluid\u0103, am adus c\u00e2teva configur\u0103ri:<\/p>\n<p>1. \u00centre mediul de testare \u0219i cel de produc\u021bie, containerele nu sunt reconstruite. Am realizat parametriz\u0103ri astfel \u00eenc\u00e2t acela\u0219i container s\u0103 poat\u0103 func\u021biona f\u0103r\u0103 reconstruc\u021bie cu toate set\u0103rile, variabilele de mediu \u0219i serviciile, at\u00e2t \u00een mediu de testare c\u00e2t \u0219i \u00een produc\u021bie. <\/p>\n<p>2. Pentru a actualiza aplica\u021bia prin Helm, trebuie s\u0103 specific\u0103m versiunea acesteia. Construirea backend-ului, frontend-ului \u0219i actualizarea aplica\u021biei sunt trei sarcini diferite, a\u0219adar este important s\u0103 folosim aceea\u0219i versiune a aplica\u021biei peste tot. Pentru aceast\u0103 sarcin\u0103, folosim datele din istoricul Git, deoarece avem configura\u021bia cluster-ului K8S \u0219i a aplica\u021biei \u00eentr-un singur repository Git.<\/p>\n<p>Primim versiunea aplica\u021biei din rezultatele execut\u0103rii comenzii<br \/>\n<code>git describe --tags --abbrev=7<\/code>.<\/p>\n<h3>4. Implementarea automat\u0103 a tuturor modific\u0103rilor \u00een mediu de testare (UAT) <\/h3>\n<p>\nUrm\u0103toarea etap\u0103 \u00een acest script de construc\u021bie este actualizarea automat\u0103 a cluster-ului K8S. Acest lucru se \u00eent\u00e2mpl\u0103 cu condi\u021bia ca \u00eentreaga aplica\u021bie s\u0103 fie construit\u0103 \u0219i toate artefactele s\u0103 fie publicate \u00een Docker Registry. Dup\u0103 aceasta, se lanseaz\u0103 actualizarea mediului de testare.<\/p>\n<p>Actualizarea cluster-ului este ini\u021biat\u0103 cu ajutorul <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/helm\/#helm-upgrade\">Actualizare Helm<\/a><\/noindex>. Dac\u0103 ceva nu decurge conform planului, Helm va reveni automat \u0219i de la sine la toate modific\u0103rile sale. Nu este necesar\u0103 monitorizarea func\u021bion\u0103rii sale. <\/p>\n<p>Furniz\u0103m, \u00eempreun\u0103 cu montajul, configura\u021bia cluster-ului K8S. Prin urmare, urm\u0103torul pas este actualizarea acesteia: configMaps, deployments, services, secrets \u0219i orice alte configura\u021bii K8S pe care le-am modificat. <\/p>\n<p>Dup\u0103 aceasta, Helm ini\u021biaz\u0103 actualizarea RollOut a aplica\u021biei \u00een mediu de testare. \u00cenainte ca aplica\u021bia s\u0103 fie desf\u0103\u0219urat\u0103 \u00een produc\u021bie. Acest lucru este realizat pentru ca utilizatorii s\u0103 poat\u0103 verifica manual func\u021biile de business pe care le-am publicat \u00een mediu de testare.<\/p>\n<h3>5. Desf\u0103\u0219urarea automat\u0103 a tuturor modific\u0103rilor \u00een Prod <\/h3>\n<p>\nPentru a desf\u0103\u0219ura actualizarea \u00een mediu de produc\u021bie, este suficient s\u0103 ap\u0103sa\u021bi un buton \u00een GitLab \u2014 iar containerele sunt imediat livrate \u00een mediu de produc\u021bie.<\/p>\n<p>Acela\u0219i aplica\u021bie poate func\u021biona f\u0103r\u0103 recompilare \u00een medii diferite \u2014 testare \u0219i produc\u021bie. Folosim acelea\u0219i artefacte, f\u0103r\u0103 a schimba nimic \u00een aplica\u021bie, iar parametrii sunt defini\u021bi din exterior. <\/p>\n<p>Parametrizarea flexibil\u0103 a set\u0103rilor aplica\u021biei depinde de mediu \u00een care aceast\u0103 aplica\u021bie va fi executat\u0103. Am externalizat toate set\u0103rile mediilor: totul este parametrizat prin configura\u021bia K8S \u0219i parametrii Helm. C\u00e2nd Helm desf\u0103\u0219oar\u0103 montajul \u00een mediu de testare, se aplic\u0103 parametrii de testare, iar \u00een mediu de produc\u021bie \u2014 parametrii de produc\u021bie.<\/p>\n<p>Cea mai complicat\u0103 a fost parametrizarea tuturor serviciilor \u0219i variabilelor utilizate, care depind de mediu, \u0219i transformarea lor \u00een variabile de mediu \u0219i descrieri-configurare a parametrilor de mediu pentru Helm. <\/p>\n<p>\u00cen parametrii aplica\u021biei sunt folosite variabile de mediu. Valorile lor sunt definite \u00een containere prin K8S configmap, care este templinizat folosind \u0219abloane Go. De exemplu, definirea unei variabile de mediu pentru denumirea domeniului poate fi realizat\u0103 astfel:<\/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 \u00een aceast\u0103 variabil\u0103 se stocheaz\u0103 denumirea mediului (prod, stage, UAT).<br \/>\n<b>.Values.app.properties.app_external_domain<\/b> \u2013 \u00een aceast\u0103 variabil\u0103 definim domeniul dorit \u00een fi\u0219ierul .Values.yaml <\/p>\n<p>At the time of updating the application, Helm creates the configmap.yaml file from templates and fills the APP_EXTERNAL_DOMAIN value with the necessary value depending on the environment in which the update occurs. This variable is set within the container. It is accessible from the application, meaning that in each application environment, this variable will have a different value. <\/p>\n<p>Recently, Spring Cloud has added support for K8S, including work with configMaps: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-kubernetes\">Spring Cloud Kubernetes<\/a><\/noindex>. While the project is actively being developed and changes significantly, we cannot use it in production yet. However, we are actively monitoring its status and using it in DEV configurations. As soon as it stabilizes, we will switch from using environment variables to it.<\/p>\n<h3>\u00cen concluzie<\/h3>\n<p>\nSo, Continuous Deployment is set up and functioning. All updates happen with the press of a button. Delivery of changes to the production environment is automatic. Importantly, updates do not halt system operations. <\/p>\n<p><img decoding=\"async\" alt=\"Implementarea noastr\u0103 de Continuous Deployment pe platforma clientului\" src=\"\/wp-content\/uploads\/2019\/04\/07d609d9a40f644cfdad2bdb88652af2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Plans for the future: automatic database migration<\/h3>\n<p>\nWe are considering an upgrade of the database and the possibility of rolling back these changes. After all, two different versions of the application are running simultaneously: the old one is operational, while the new one is being launched. The old version will only be turned off when we are sure that the new version is working. Database migration must allow operation with both versions of the application. <\/p>\n<p>Therefore, we cannot simply change the column name or other data. But we can create a new column, copy data from the old column into it, and write triggers that will simultaneously copy and update data in the other column during updates. After a successful deployment of the new application version, following the post-launch support period, we will be able to remove the old column and the unnecessary trigger. <\/p>\n<p>If the new version of the application is not functioning correctly, we can revert to the previous version, including the previous database version. In short, our changes will allow simultaneous operation with multiple versions of the application. <\/p>\n<p>We plan to automate the database migration through a K8S job, integrating it into the CD process. We will definitely share this experience on Habr.<br \/>\n<br \/>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Implementarea noastr\u0103 a Continuous Deployment pe platforma clientului | ProHoster","description":"La noi, la True Engineering, am configurat procesul de livrare continu\u0103 a actualiz\u0103rilor pe serverele clien\u021bilor \u0219i dorim s\u0103 \u00eemp\u0103rt\u0103\u0219im aceast\u0103 experien\u021b\u0103. La \u00eenceput, am dezvoltat un sistem online pentru client \u0219i l-am desf\u0103\u0219urat \u00een infrastructura proprie.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/31377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=31377"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/31377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/23342"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=31377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=31377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=31377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}