{"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\/pt\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","title":{"rendered":"Nossa implementa\u00e7\u00e3o de Continuous Deployment na plataforma do cliente","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Na True Engineering, configuramos o processo de entrega cont\u00ednua de atualiza\u00e7\u00f5es nos servidores do cliente e queremos compartilhar essa experi\u00eancia.<\/p>\n<p>Primeiro, desenvolvemos um sistema online para o cliente e o implantamos em nosso pr\u00f3prio cluster Kubernetes. Agora, nossa solu\u00e7\u00e3o de alta carga foi transferida para a plataforma do cliente, para a qual configuramos um processo de Continuous Deployment totalmente autom\u00e1tico. Com isso, aceleramos o time-to-market \u2013 a entrega de altera\u00e7\u00f5es no ambiente de produ\u00e7\u00e3o. <\/p>\n<p>Neste artigo, abordaremos todas as etapas do processo de Continuous Deployment (CD) ou entrega de atualiza\u00e7\u00f5es na plataforma do cliente: <\/p>\n<ol>\n<li>como esse processo come\u00e7a, <\/li>\n<li>sincroniza\u00e7\u00e3o com o reposit\u00f3rio Git do cliente,<\/li>\n<li>compila\u00e7\u00e3o do backend e frontend,<\/li>\n<li>implanta\u00e7\u00e3o autom\u00e1tica do aplicativo em ambiente de teste, <\/li>\n<li>implanta\u00e7\u00e3o autom\u00e1tica em produ\u00e7\u00e3o. <\/li>\n<\/ol>\n<p>\nDurante o processo, compartilharemos detalhes da configura\u00e7\u00e3o.<\/p>\n<p><img decoding=\"async\" alt=\"Nossa implementa\u00e7\u00e3o de Continuous Deployment na plataforma do 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. In\u00edcio do CD<\/h3>\n<p>\nO Continuous Deployment come\u00e7a quando o desenvolvedor publica as altera\u00e7\u00f5es na branch de lan\u00e7amento do nosso reposit\u00f3rio Git. <\/p>\n<p>Nosso aplicativo \u00e9 baseado em uma arquitetura de microservi\u00e7os e todos os seus componentes s\u00e3o armazenados em um \u00fanico reposit\u00f3rio. Com isso, todos os microservi\u00e7os s\u00e3o compilados e instalados, mesmo que apenas um deles tenha sido alterado. <\/p>\n<p>Organizamos o trabalho atrav\u00e9s de um \u00fanico reposit\u00f3rio por v\u00e1rias raz\u00f5es: <\/p>\n<ul>\n<li>Facilidade de desenvolvimento \u2013 o aplicativo est\u00e1 em constante desenvolvimento, portanto, \u00e9 poss\u00edvel trabalhar com todo o c\u00f3digo de uma vez. <\/li>\n<li>Pipeline CI\/CD unificado, que garante que o aplicativo, como um sistema \u00fanico, passe por todos os testes e seja entregue no ambiente de produ\u00e7\u00e3o do cliente. <\/li>\n<li>Eliminamos confus\u00e3o de vers\u00f5es \u2013 n\u00e3o precisamos manter um mapa de vers\u00f5es dos microservi\u00e7os e descrever a configura\u00e7\u00e3o de cada microservi\u00e7o em scripts Helm.<\/li>\n<\/ul>\n<h3>2. Sincroniza\u00e7\u00e3o com o reposit\u00f3rio Git do c\u00f3digo-fonte do cliente<\/h3>\n<p>\nAs altera\u00e7\u00f5es feitas s\u00e3o automaticamente sincronizadas com o reposit\u00f3rio Git do cliente. Nele, est\u00e1 configurada a compila\u00e7\u00e3o do aplicativo, que \u00e9 acionada ap\u00f3s a atualiza\u00e7\u00e3o da branch, e o deployment em produ\u00e7\u00e3o. Ambos os processos ocorrem em seu ambiente a partir do reposit\u00f3rio Git. <\/p>\n<p>N\u00e3o podemos trabalhar diretamente com o reposit\u00f3rio do cliente, pois precisamos de nossos pr\u00f3prios ambientes para desenvolvimento e testes. Para isso, usamos nosso pr\u00f3prio reposit\u00f3rio Git \u2014 que est\u00e1 sincronizado com o reposit\u00f3rio Git deles. Assim que o desenvolvedor publica altera\u00e7\u00f5es no ramo correspondente do nosso reposit\u00f3rio, o GitLab envia imediatamente essas altera\u00e7\u00f5es para o cliente.<\/p>\n<p><img decoding=\"async\" alt=\"Nossa implementa\u00e7\u00e3o de Continuous Deployment na plataforma do cliente\" src=\"\/wp-content\/uploads\/2019\/04\/9e704f112649b77f0522fa60cfcfc2bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDepois disso, \u00e9 necess\u00e1rio realizar a montagem. Ela consiste em v\u00e1rias etapas: montagem do backend e frontend, testes e entrega em produ\u00e7\u00e3o.<\/p>\n<h3>3. Montagem do backend e frontend<\/h3>\n<p>\nA montagem do backend e do frontend s\u00e3o duas tarefas paralelas que s\u00e3o executadas no sistema GitLab Runner. A configura\u00e7\u00e3o da montagem original est\u00e1 neste mesmo reposit\u00f3rio.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ce\/ci\/yaml\/\">Tutorial para escrever um script YAML para montagem no GitLab<\/a><\/noindex>.<\/p>\n<p>O GitLab Runner busca o c\u00f3digo do reposit\u00f3rio necess\u00e1rio, compila e envia o aplicativo Java para o registro Docker. Aqui montamos o backend e o frontend, obtemos imagens Docker, que armazenamos no reposit\u00f3rio do lado do cliente. Para gerenciar as imagens Docker, usamos <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/palantir\/gradle-docker\">o plugin Gradle<\/a><\/noindex>.<\/p>\n<p>Sincronizamos as vers\u00f5es de nossas imagens com a vers\u00e3o do lan\u00e7amento que ser\u00e1 publicada no Docker. Para um funcionamento suave, fizemos algumas configura\u00e7\u00f5es:<\/p>\n<p>1. Entre o ambiente de teste e o de produ\u00e7\u00e3o, os cont\u00eaineres n\u00e3o s\u00e3o recompilados. Fizemos parametriza\u00e7\u00f5es para que o mesmo cont\u00eainer possa operar sem recompila\u00e7\u00e3o com todas as configura\u00e7\u00f5es, vari\u00e1veis de ambiente e servi\u00e7os tanto no ambiente de teste quanto em produ\u00e7\u00e3o. <\/p>\n<p>2. Para atualizar o aplicativo via Helm, \u00e9 necess\u00e1rio especificar sua vers\u00e3o. Nossa montagem do backend, frontend e a atualiza\u00e7\u00e3o do aplicativo s\u00e3o tr\u00eas tarefas diferentes, portanto, \u00e9 importante usar sempre a mesma vers\u00e3o do aplicativo em todos os lugares. Para essa tarefa, usamos dados do hist\u00f3rico do Git, uma vez que temos a configura\u00e7\u00e3o do cluster K8S e do aplicativo no mesmo reposit\u00f3rio Git.<\/p>\n<p>A vers\u00e3o do aplicativo \u00e9 obtida a partir do resultado da execu\u00e7\u00e3o do comando<br \/>\n<code>git describe --tags --abbrev=7<\/code>.<\/p>\n<h3>4. Desdobramento autom\u00e1tico de todas as altera\u00e7\u00f5es no ambiente de teste (UAT) <\/h3>\n<p>\nA pr\u00f3xima etapa neste script de montagem \u00e9 a atualiza\u00e7\u00e3o autom\u00e1tica do cluster K8S. Isso ocorre desde que todo o aplicativo tenha sido montado e todos os artefatos publicados no Docker Registry. Depois disso, a atualiza\u00e7\u00e3o do ambiente de teste \u00e9 iniciada.<\/p>\n<p>A atualiza\u00e7\u00e3o do cluster \u00e9 iniciada com <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/helm\/#helm-upgrade\">Atualiza\u00e7\u00e3o do Helm<\/a><\/noindex>. Se algo n\u00e3o sair como planejado, o Helm reverter\u00e1 automaticamente todas as suas altera\u00e7\u00f5es. N\u00e3o \u00e9 necess\u00e1rio monitorar seu funcionamento. <\/p>\n<p>Fornecemos, junto com a compila\u00e7\u00e3o, a configura\u00e7\u00e3o do cluster K8S. Portanto, o pr\u00f3ximo passo \u00e9 atualizar a configura\u00e7\u00e3o: configMaps, deployments, services, secrets e quaisquer outras configura\u00e7\u00f5es K8S que tenhamos alterado. <\/p>\n<p>Depois disso, o Helm inicia a atualiza\u00e7\u00e3o RollOut do pr\u00f3prio aplicativo no ambiente de teste. Antes que o aplicativo seja implantado no ambiente de produ\u00e7\u00e3o. Isso \u00e9 feito para que os usu\u00e1rios possam verificar manualmente as funcionalidades de neg\u00f3cios que ativamos no ambiente de teste.<\/p>\n<h3>5. Implanta\u00e7\u00e3o autom\u00e1tica de todas as altera\u00e7\u00f5es em Prod <\/h3>\n<p>\nPara implantar a atualiza\u00e7\u00e3o no ambiente de produ\u00e7\u00e3o, basta pressionar um bot\u00e3o no GitLab \u2014 e os cont\u00eaineres s\u00e3o imediatamente entregues no ambiente de produ\u00e7\u00e3o.<\/p>\n<p>O mesmo aplicativo pode operar em diferentes ambientes \u2014 teste e produ\u00e7\u00e3o \u2014 sem recompile. Usamos os mesmos artefatos, sem alterar nada no aplicativo, e os par\u00e2metros s\u00e3o definidos externamente. <\/p>\n<p>A parametriza\u00e7\u00e3o flex\u00edvel das configura\u00e7\u00f5es do aplicativo depende do ambiente em que esse aplicativo ser\u00e1 executado. Retiramos todas as configura\u00e7\u00f5es de ambientes para fora: tudo \u00e9 parametrizado atrav\u00e9s da configura\u00e7\u00e3o do K8S e par\u00e2metros do Helm. Quando o Helm implanta a compila\u00e7\u00e3o no ambiente de teste, s\u00e3o aplicados os par\u00e2metros de teste, e no ambiente de produ\u00e7\u00e3o \u2014 os par\u00e2metros de produ\u00e7\u00e3o.<\/p>\n<p>O mais desafiador foi parametrizar todos os servi\u00e7os e vari\u00e1veis usados que dependem do ambiente e convert\u00ea-los em vari\u00e1veis de ambiente e na descri\u00e7\u00e3o\/configura\u00e7\u00e3o de par\u00e2metros de ambiente para o Helm. <\/p>\n<p>Nas configura\u00e7\u00f5es do aplicativo, s\u00e3o usadas vari\u00e1veis de ambiente. Seus valores s\u00e3o definidos nos cont\u00eaineres atrav\u00e9s do K8S configmap, que \u00e9 modelado usando templates Go. Por exemplo, a defini\u00e7\u00e3o de uma vari\u00e1vel de ambiente para o nome do dom\u00ednio pode ser feita assim:<\/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 nesta vari\u00e1vel est\u00e1 armazenado o nome do ambiente (prod, stage, UAT).<br \/>\n<b>.Values.app.properties.app_external_domain<\/b> \u2013 nesta vari\u00e1vel definimos no arquivo .Values.yaml o dom\u00ednio desejado <\/p>\n<p>Ao atualizar o aplicativo, o Helm cria a partir dos modelos do arquivo configmap.yaml e preenche o valor de APP_EXTERNAL_DOMAIN com o valor necess\u00e1rio, dependendo do ambiente em que a atualiza\u00e7\u00e3o \u00e9 iniciada. Essa vari\u00e1vel j\u00e1 \u00e9 ajustada no cont\u00eainer. O acesso a ela \u00e9 poss\u00edvel a partir do aplicativo, portanto, em cada ambiente do aplicativo, haver\u00e1 um valor diferente para essa vari\u00e1vel. <\/p>\n<p>Recentemente, o Spring Cloud passou a suportar o K8S, incluindo o trabalho com configMaps: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-kubernetes\">Spring Cloud Kubernetes<\/a><\/noindex>. Enquanto o projeto est\u00e1 em constante desenvolvimento e mudando drasticamente, n\u00e3o podemos us\u00e1-lo em produ\u00e7\u00e3o. Mas estamos monitorando ativamente seu estado e o utilizando em configura\u00e7\u00f5es DEV. Assim que estabilizar, mudaremos de usar vari\u00e1veis de ambiente para ele.<\/p>\n<h3>Total<\/h3>\n<p>\nAssim, o Continuous Deployment est\u00e1 configurado e funcionando. Todas as atualiza\u00e7\u00f5es ocorrem com um simples pressionar de bot\u00e3o. A entrega de mudan\u00e7as no ambiente de produ\u00e7\u00e3o \u00e9 autom\u00e1tica. E, o que \u00e9 importante, as atualiza\u00e7\u00f5es n\u00e3o interrompem o funcionamento do sistema. <\/p>\n<p><img decoding=\"async\" alt=\"Nossa implementa\u00e7\u00e3o de Continuous Deployment na plataforma do cliente\" src=\"\/wp-content\/uploads\/2019\/04\/07d609d9a40f644cfdad2bdb88652af2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Planos para o futuro: migra\u00e7\u00e3o autom\u00e1tica do banco de dados<\/h3>\n<p>\nEstamos considerando a atualiza\u00e7\u00e3o do banco de dados e a possibilidade de reverter essas mudan\u00e7as. Duas vers\u00f5es diferentes do aplicativo est\u00e3o operando ao mesmo tempo: a antiga est\u00e1 em funcionamento, enquanto a nova est\u00e1 sendo lan\u00e7ada. E desligaremos a antiga apenas quando tivermos certeza de que a nova vers\u00e3o est\u00e1 funcionando. A migra\u00e7\u00e3o do banco de dados deve permitir que ambas as vers\u00f5es do aplicativo funcionem. <\/p>\n<p>Portanto, n\u00e3o podemos simplesmente alterar o nome da coluna ou outros dados. Mas podemos criar uma nova coluna, copiar os dados da coluna antiga para ela e escrever gatilhos que, ao atualizar os dados, tamb\u00e9m copiar\u00e3o e atualizar\u00e3o para a outra coluna. E ap\u00f3s o lan\u00e7amento bem-sucedido da nova vers\u00e3o do aplicativo, ap\u00f3s um per\u00edodo de suporte p\u00f3s-lan\u00e7amento, podemos remover a coluna antiga e o gatilho que se tornou desnecess\u00e1rio. <\/p>\n<p>Se a nova vers\u00e3o do aplicativo n\u00e3o funcionar corretamente, podemos reverter para a vers\u00e3o anterior, incluindo a vers\u00e3o anterior do banco de dados. Em suma, nossas mudan\u00e7as permitir\u00e3o que v\u00e1rias vers\u00f5es do aplicativo funcionem simultaneamente. <\/p>\n<p>Planejamos automatizar a migra\u00e7\u00e3o do banco de dados atrav\u00e9s de um job K8S, integrando isso ao processo de CD. E certamente compartilharemos essa experi\u00eancia no Habr.<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.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\/pt\/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=\"pt_PT\" \/>\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\/pt\/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\udd47Nossa implementa\u00e7\u00e3o de Continuous Deployment na plataforma do cliente | ProHoster","description":"Na True Engineering, configuramos um processo de entrega cont\u00ednua de atualiza\u00e7\u00f5es para os servidores dos clientes e queremos compartilhar essa experi\u00eancia. Para come\u00e7ar, desenvolvemos um sistema online para o cliente e o implantamos em nossa pr\u00f3pria infraestrutura.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/31377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=31377"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/31377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/23342"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=31377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=31377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=31377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}