{"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\/it\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","title":{"rendered":"La nostra implementazione del Continuous Deployment sulla piattaforma del cliente","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Noi di True Engineering abbiamo impostato un processo di consegna continua degli aggiornamenti ai server del cliente e vogliamo condividere questa esperienza.<\/p>\n<p>Per iniziare, abbiamo sviluppato un sistema online per il cliente e lo abbiamo distribuito nel nostro cluster Kubernetes. Ora la nostra soluzione ad alta disponibilit\u00e0 \u00e8 stata trasferita sulla piattaforma del cliente, per cui abbiamo configurato un processo automatizzato di Continuous Deployment. Grazie a ci\u00f2, abbiamo accelerato il time-to-market \u2013 la consegna delle modifiche nell'ambiente di produzione. <\/p>\n<p>In questo articolo parleremo di tutte le fasi del processo di Continuous Deployment (CD) o di consegna degli aggiornamenti sulla piattaforma del cliente: <\/p>\n<ol>\n<li>come inizia questo processo, <\/li>\n<li>sincronizzazione con il repository Git del cliente,<\/li>\n<li>compilazione del backend e del frontend,<\/li>\n<li>distribuzione automatica dell'applicazione in ambiente di test, <\/li>\n<li>distribuzione automatica in Prod. <\/li>\n<\/ol>\n<p>\nNel processo condivideremo i dettagli della configurazione.<\/p>\n<p><img decoding=\"async\" alt=\"La nostra implementazione del Continuous Deployment sulla piattaforma del cliente\" 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. Avvio del CD<\/h3>\n<p>\nIl Continuous Deployment inizia quando lo sviluppatore carica le modifiche nel ramo di rilascio del nostro repository Git. <\/p>\n<p>La nostra applicazione si basa su un'architettura a microservizi e tutti i suoi componenti sono archiviati in un unico repository. Grazie a ci\u00f2, tutti i microservizi vengono compilati e installati anche se uno di essi \u00e8 stato modificato. <\/p>\n<p>Abbiamo organizzato il lavoro tramite un unico repository per diversi motivi: <\/p>\n<ul>\n<li>Comodit\u00e0 di sviluppo: l'applicazione \u00e8 in continua evoluzione, quindi \u00e8 possibile lavorare immediatamente su tutto il codice. <\/li>\n<li>Pipeline CI\/CD unica che garantisce che l'applicazione, come un sistema unico, superi tutti i test e venga consegnata nell'ambiente di produzione del cliente. <\/li>\n<li>Escludiamo confusione nelle versioni: non dobbiamo mantenere una mappa delle versioni dei microservizi e descrivere la configurazione per ogni microservizio negli script Helm.<\/li>\n<\/ul>\n<h3>2. Sincronizzazione con il repository Git del codice sorgente del cliente<\/h3>\n<p>\nLe modifiche apportate vengono sincronizzate automaticamente con il repository Git del cliente. Qui \u00e8 configurata la compilazione dell'applicazione, che viene eseguita dopo l'aggiornamento del ramo, e il deployment in produzione. Entrambi i processi avvengono nel loro ambiente dal repository Git. <\/p>\n<p>Non possiamo lavorare direttamente con il repository del cliente poich\u00e9 abbiamo bisogno di ambienti propri per lo sviluppo e il collaudo. Utilizziamo un nostro repository Git per questo scopo, che \u00e8 sincronizzato con il loro repository Git. Non appena lo sviluppatore carica le modifiche nel ramo corrispondente del nostro repository, GitLab invia immediatamente tali modifiche al cliente.<\/p>\n<p><img decoding=\"async\" alt=\"La nostra implementazione del Continuous Deployment sulla piattaforma del cliente\" src=\"\/wp-content\/uploads\/2019\/04\/9e704f112649b77f0522fa60cfcfc2bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDopo ci\u00f2, \u00e8 necessario effettuare la build. Essa consiste in diverse fasi: costruzione del backend e del frontend, collaudo e distribuzione in produzione.<\/p>\n<h3>3. Costruzione del backend e del frontend<\/h3>\n<p>\nLa costruzione del backend e del frontend \u00e8 costituita da due compiti paralleli che vengono eseguiti nel sistema GitLab Runner. La configurazione della build originale si trova nello stesso repository.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ce\/ci\/yaml\/\">Tutorial per la scrittura di script YAML per la build in GitLab<\/a><\/noindex>.<\/p>\n<p>GitLab Runner preleva il codice dal repository corretto, compila l'applicazione Java con il comando di build e lo invia al Docker registry. Qui costruiamo backend e frontend, otteniamo immagini Docker che archiviamo nel repository sul lato del cliente. Per gestire le immagini Docker utilizziamo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/palantir\/gradle-docker\">il plugin Gradle<\/a><\/noindex>.<\/p>\n<p>Sincronizziamo le versioni delle nostre immagini con il numero di versione del rilascio che sar\u00e0 pubblicato in Docker. Per un funzionamento agevole, abbiamo apportato alcune configurazioni:<\/p>\n<p>1. Tra l'ambiente di collaudo e il prodotto, i contenitori non vengono ricostruiti. Abbiamo effettuato parametrici in modo che lo stesso contenitore possa funzionare senza ricostruzione con tutte le configurazioni, le variabili ambientali e i servizi sia nell'ambiente di collaudo che in produzione. <\/p>\n<p>2. Per aggiornare l'applicazione tramite Helm \u00e8 necessario specificarne la versione. Abbiamo la costruzione del backend, del frontend e l'aggiornamento dell'applicazione, che sono tre attivit\u00e0 diverse, pertanto \u00e8 importante utilizzare sempre la stessa versione dell'applicazione. Per questa attivit\u00e0 utilizziamo i dati dalla cronologia di Git, poich\u00e9 abbiamo la configurazione del cluster K8S e dell'applicazione nello stesso repository Git.<\/p>\n<p>La versione dell'applicazione la otteniamo dai risultati dell'esecuzione del comando<br \/>\n<code>git describe --tags --abbrev=7<\/code>.<\/p>\n<h3>4. Distribuzione automatica di tutte le modifiche nell'ambiente di collaudo (UAT) <\/h3>\n<p>\nNella fase successiva di questo script di build, viene eseguito un aggiornamento automatico del cluster K8S. Questo avviene a condizione che l'intera applicazione sia stata compilata e tutti gli artefatti siano stati pubblicati nel Docker Registry. Dopodich\u00e9, viene avviato l'aggiornamento dell'ambiente di collaudo.<\/p>\n<p>L'aggiornamento del cluster viene avviato tramite <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/helm\/#helm-upgrade\">Aggiornamento di Helm<\/a><\/noindex>. Se qualcosa va storto, Helm annuller\u00e0 automaticamente tutte le sue modifiche senza bisogno di controlli esterni. <\/p>\n<p>Forniamo insieme all'assemblaggio la configurazione del cluster K8S. Pertanto, il passo successivo \u00e8 l'aggiornamento di questa: configMaps, deployments, services, secrets e qualsiasi altra configurazione K8S che abbiamo modificato. <\/p>\n<p>Successivamente, Helm avvia l'aggiornamento RollOut dell'applicazione stessa nell'ambiente di test. Prima che l'applicazione venga distribuita in produzione. Questo \u00e8 fatto affinch\u00e9 gli utenti possano verificare manualmente le funzionalit\u00e0 aziendali che abbiamo implementato nell'ambiente di test.<\/p>\n<h3>5. Distribuzione automatica di tutte le modifiche in Prod <\/h3>\n<p>\nPer distribuire l'aggiornamento nell'ambiente di produzione, basta premere un pulsante in GitLab \u2014 e i contenitori vengono immediatamente consegnati nell'ambiente di produzione.<\/p>\n<p>Lo stesso applicativo pu\u00f2 funzionare senza ricompilazione in ambienti diversi \u2014 test e produzione. Utilizziamo gli stessi artefatti, senza modificare nulla nell'applicazione, mentre i parametri vengono definiti esternamente. <\/p>\n<p>La flessibilit\u00e0 nella parametrizzazione delle impostazioni dell'applicazione dipende dall'ambiente in cui l'applicazione verr\u00e0 eseguita. Abbiamo estratto tutte le configurazioni ambientali all'esterno: tutto \u00e8 parametrizzato attraverso la configurazione K8S e i parametri Helm. Quando Helm distribuisce l'assemblaggio nell'ambiente di test, gli vengono applicati i parametri di test, mentre nell'ambiente di produzione \u2014 i parametri di produzione.<\/p>\n<p>La parte pi\u00f9 difficile \u00e8 stata parametrizzare tutti i servizi e le variabili utilizzati, che dipendono dall'ambiente, e convertirli in variabili d'ambiente e nella descrizione\/configurazione dei parametri ambientali per Helm. <\/p>\n<p>Nei parametri dell'applicazione si usano variabili d'ambiente. I loro valori sono definiti nei contenitori tramite K8S configmap, che viene templateizzato tramite modelli Go. Ad esempio, per impostare una variabile d'ambiente per il nome di dominio, si pu\u00f2 fare cos\u00ec:<\/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 in questa variabile \u00e8 memorizzato il nome dell'ambiente (prod, stage, UAT).<br \/>\n<b>.Values.app.properties.app_external_domain<\/b> \u2013 in questa variabile specifichiamo il dominio desiderato nel file .Values.yaml <\/p>\n<p>Durante l'aggiornamento dell'applicazione, Helm crea file configmap.yaml dai modelli e riempie il valore di APP_EXTERNAL_DOMAIN con il valore necessario a seconda dell'ambiente in cui viene avviato l'aggiornamento dell'applicazione. Questa variabile viene impostata gi\u00e0 nel contenitore. L'accesso a essa \u00e8 disponibile dall'applicazione, pertanto in ogni ambiente dell'applicazione ci sar\u00e0 un valore diverso per questa variabile. <\/p>\n<p>Recentemente in Spring Cloud \u00e8 stata introdotta la supporto per K8S, compreso il lavoro con i configMaps: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-kubernetes\">Spring Cloud Kubernetes<\/a><\/noindex>. Finch\u00e9 il progetto \u00e8 in fase di sviluppo attivo e subisce cambiamenti radicali, non possiamo utilizzarlo in produzione. Ma monitoriamo attivamente il suo stato e lo utilizziamo nelle configurazioni DEV. Non appena si stabilizzer\u00e0, passeremo dall'utilizzo delle variabili d'ambiente a esso.<\/p>\n<h3>Totale<\/h3>\n<p>\nQuindi, il Continuous Deployment \u00e8 configurato e funziona. Tutti gli aggiornamenti avvengono con un semplice tasto. La consegna delle modifiche nell'ambiente di produzione \u00e8 automatica. E, cosa importante, gli aggiornamenti non fermano il funzionamento del sistema. <\/p>\n<p><img decoding=\"async\" alt=\"La nostra implementazione del Continuous Deployment sulla piattaforma del cliente\" src=\"\/wp-content\/uploads\/2019\/04\/07d609d9a40f644cfdad2bdb88652af2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Piani per il futuro: migrazione automatica del database<\/h3>\n<p>\nAbbiamo considerato l'upgrade del database e la possibilit\u00e0 di annullare tali cambiamenti. Infatti, ci sono due diverse versioni dell'app in funzione: la vecchia \u00e8 attiva, mentre la nuova viene avviata. La vecchia verr\u00e0 disattivata solo quando saremo certi che la nuova versione funzioni. La migrazione del database deve consentire di lavorare con entrambe le versioni dell'app. <\/p>\n<p>Pertanto, non possiamo semplicemente cambiare il nome di una colonna o altri dati. Ma possiamo creare una nuova colonna, copiare i dati dalla vecchia colonna in essa e scrivere dei trigger che copieranno e aggiorneranno i dati nella nuova colonna durante l'aggiornamento. E dopo il deploy riuscito della nuova versione dell'app, dopo un periodo di post launch support, potremo eliminare la vecchia colonna e il trigger divenuto inutile. <\/p>\n<p>Se la nuova versione dell'app non funziona correttamente, possiamo tornare alla versione precedente, inclusa la versione precedente del database. In breve, le nostre modifiche consentiranno di lavorare contemporaneamente con pi\u00f9 versioni dell'app. <\/p>\n<p>Pianifichiamo di automatizzare la migrazione del database tramite un lavoro K8S, integrandolo nel processo di CD. E ci assicureremo di condividere questa esperienza su Habrahabr.<br \/>\n<br \/>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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\udd47La nostra implementazione del Continuous Deployment sulla piattaforma del cliente | ProHoster","description":"Noi di True Engineering abbiamo impostato un processo di consegna continua degli aggiornamenti sui server dei clienti e vogliamo condividere questa esperienza. Per prima cosa, abbiamo sviluppato un sistema online per il cliente e lo abbiamo implementato internamente.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/31377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=31377"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/31377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/23342"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=31377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=31377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=31377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}