{"id":55870,"date":"2020-01-30T00:00:00","date_gmt":"2020-01-29T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian"},"modified":"2020-02-18T14:04:02","modified_gmt":"2020-02-18T11:04:02","slug":"ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","title":{"rendered":"De scripts a uma plataforma pr\u00f3pria: como automatizamos o desenvolvimento na CIAN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"De scripts a uma plataforma pr\u00f3pria: como automatizamos o desenvolvimento na CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/965f1944c95e2020bec512a05d980a32.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa RIT 2019, nosso colega Alexander Korotkov fez <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=0wvUyjexoIg\">relat\u00f3rio<\/a><\/noindex> sobre automa\u00e7\u00e3o do desenvolvimento na CIAN: para simplificar a vida e o trabalho, usamos nossa pr\u00f3pria plataforma Integro. Ela rastreia o ciclo de vida das tarefas, aliviando os desenvolvedores de opera\u00e7\u00f5es rotineiras e reduzindo significativamente a quantidade de bugs em produ\u00e7\u00e3o. Neste post, complementamos a apresenta\u00e7\u00e3o de Alexander e contamos como passamos de simples scripts para a integra\u00e7\u00e3o de produtos open source por meio de nossa pr\u00f3pria plataforma e o que uma equipe separada de automa\u00e7\u00e3o faz por n\u00f3s.<br \/>\n\u00a0<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>N\u00edvel zero<\/h2>\n<p>\n<i><b>\u00abN\u00e3o existe n\u00edvel zero, eu n\u00e3o conhe\u00e7o isso\u00bb<\/b><br \/>\nMestre Shifu do filme \u00abKung Fu Panda\u00bb<\/i><\/p>\n<p>A automa\u00e7\u00e3o na CIAN come\u00e7ou 14 anos ap\u00f3s a funda\u00e7\u00e3o da empresa. Na \u00e9poca, a equipe de desenvolvimento contava com 35 pessoas. Dificil acreditar, n\u00e9? Claro, de alguma forma a automa\u00e7\u00e3o existia, mas a dire\u00e7\u00e3o separada para integra\u00e7\u00e3o cont\u00ednua e entrega de c\u00f3digo come\u00e7ou a se formar precisamente em 2015.\u00a0<\/p>\n<p>Naquele momento, t\u00ednhamos um enorme mon\u00f3lito em Python, C# e PHP, implantado em servidores Linux\/Windows. Para implantar esse monstro, t\u00ednhamos um conjunto de scripts que execut\u00e1vamos manualmente. Tamb\u00e9m havia a constru\u00e7\u00e3o do mon\u00f3lito, causando dor e sofrimento devido a conflitos de mesclagem, corre\u00e7\u00e3o de defeitos e recompila\u00e7\u00e3o 'com um conjunto diferente de tarefas no build'. Simplificadamente, o processo parecia assim:<\/p>\n<p><img decoding=\"async\" alt=\"De scripts a uma plataforma pr\u00f3pria: como automatizamos o desenvolvimento na CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/03c4dd97e2ba0073bab1c33f6003a9ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIsso n\u00e3o nos satisfazia, e quer\u00edamos construir um processo de constru\u00e7\u00e3o e implanta\u00e7\u00e3o repet\u00edvel, automatizado e gerenciado. Para isso, precis\u00e1vamos de um sistema CI\/CD e est\u00e1vamos escolhendo entre a vers\u00e3o gratuita do Teamcity e o Jenkins gratuito, pois j\u00e1 trabalh\u00e1vamos com ambos e ambos nos davam suporte em termos de funcionalidades. Escolhemos o Teamcity por ser um produto mais recente. Naquela \u00e9poca, ainda n\u00e3o us\u00e1vamos uma arquitetura de microsservi\u00e7os e n\u00e3o esper\u00e1vamos um grande n\u00famero de tarefas e projetos.<\/p>\n<h2>Chegamos \u00e0 ideia de um sistema pr\u00f3prio<\/h2>\n<p>\nA implementa\u00e7\u00e3o do Teamcity eliminou apenas parte do trabalho manual: ainda era necess\u00e1rio criar Pull Requests, avan\u00e7ar tarefas pelos status no Jira e escolher tarefas para o lan\u00e7amento. A sistema Teamcity n\u00e3o conseguia mais lidar com isso. Era necess\u00e1rio escolher um caminho de automa\u00e7\u00e3o adicional. Consideramos op\u00e7\u00f5es de trabalhar com scripts no Teamcity ou mudar para sistemas de automa\u00e7\u00e3o de terceiros. Mas, no final, decidimos que precis\u00e1vamos da m\u00e1xima flexibilidade, que s\u00f3 uma solu\u00e7\u00e3o interna poderia oferecer. Assim surgiu a primeira vers\u00e3o do sistema interno de automa\u00e7\u00e3o chamado Integro.<\/p>\n<p>Teamcity foca na automa\u00e7\u00e3o ao n\u00edvel de iniciar processos de constru\u00e7\u00e3o e implanta\u00e7\u00e3o, enquanto o Integro se concentrou na automa\u00e7\u00e3o de alto n\u00edvel dos processos de desenvolvimento. Era necess\u00e1rio integrar o trabalho com tarefas no Jira e o processamento do c\u00f3digo fonte relacionado no Bitbucket. Nesta fase, o Integro come\u00e7ou a desenvolver seus pr\u00f3prios fluxos de trabalho para lidar com tarefas de diferentes tipos.\u00a0<\/p>\n<p>Devido ao aumento da automa\u00e7\u00e3o nos processos de neg\u00f3cios, o n\u00famero de projetos e execu\u00e7\u00f5es no Teamcity cresceu. Assim, surgiu um novo problema: uma inst\u00e2ncia gratuita do Teamcity n\u00e3o era mais suficiente (3 agentes e 100 projetos), adicionamos mais uma inst\u00e2ncia (mais 3 agentes e 100 projetos) e depois mais uma. No final, conseguimos um sistema com v\u00e1rios clusters, o que tornou a gest\u00e3o complicada:<\/p>\n<p><img decoding=\"async\" alt=\"De scripts a uma plataforma pr\u00f3pria: como automatizamos o desenvolvimento na CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/d95565e01e70e31f6b139dfb9b9caf95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuando surgiu a quest\u00e3o de uma quarta inst\u00e2ncia, percebemos que n\u00e3o poder\u00edamos continuar assim, pois os custos totais para manter 4 inst\u00e2ncias j\u00e1 estavam insustent\u00e1veis. Surgiu a d\u00favida de comprar o Teamcity pago ou optar pelo Jenkins gratuito. Fizemos c\u00e1lculos sobre as inst\u00e2ncias e planos de automa\u00e7\u00e3o e decidimos que ir\u00edamos trabalhar com Jenkins. Ap\u00f3s algumas semanas, migramos para o Jenkins e aliviamos parte da dor de cabe\u00e7a relacionada \u00e0 manuten\u00e7\u00e3o de v\u00e1rias inst\u00e2ncias do Teamcity. Isso nos permitiu focar no desenvolvimento do Integro e na adapta\u00e7\u00e3o do Jenkins para nossas necessidades.<\/p>\n<p>Com o aumento da automa\u00e7\u00e3o b\u00e1sica (na forma de cria\u00e7\u00e3o autom\u00e1tica de Pull Requests, coleta e publica\u00e7\u00e3o de cobertura de c\u00f3digo e outras verifica\u00e7\u00f5es), surgiu um forte desejo de eliminar ao m\u00e1ximo os lan\u00e7amentos manuais e entregar esse trabalho aos rob\u00f4s. Al\u00e9m disso, dentro da empresa, come\u00e7amos a migra\u00e7\u00e3o para microservi\u00e7os, que exigiam lan\u00e7amentos frequentes, e feitos separadamente. Assim, gradualmente chegamos aos lan\u00e7amentos autom\u00e1ticos de nossos microservi\u00e7os (o monolito ainda \u00e9 lan\u00e7ado manualmente devido \u00e0 complexidade do processo). Mas, como costuma acontecer, surgiu uma nova dificuldade.\u00a0<\/p>\n<h2>Automatizamos os testes<\/h2>\n<p>\n<img decoding=\"async\" alt=\"De scripts a uma plataforma pr\u00f3pria: como automatizamos o desenvolvimento na CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/9518ee0956922c6eb615bdef068ac525.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDevido \u00e0 automa\u00e7\u00e3o dos lan\u00e7amentos, os processos de desenvolvimento foram acelerados, parcialmente em fun\u00e7\u00e3o da omiss\u00e3o de algumas etapas de teste. Isso resultou em uma perda tempor\u00e1ria de qualidade. Pode soar banal, mas junto com a acelera\u00e7\u00e3o dos lan\u00e7amentos, t\u00ednhamos que mudar tamb\u00e9m a metodologia de desenvolvimento do produto. Era necess\u00e1rio pensar na automa\u00e7\u00e3o dos testes, no refor\u00e7o da responsabilidade pessoal (aqui falamos sobre \"aceitar a ideia na mente\", e n\u00e3o sobre multas financeiras) do desenvolvedor pelo c\u00f3digo produzido e pelos bugs nele, al\u00e9m de uma decis\u00e3o sobre a libera\u00e7\u00e3o\/n\u00e3o libera\u00e7\u00e3o das tarefas por meio do deploy autom\u00e1tico.\u00a0<\/p>\n<p>Ao resolver problemas de qualidade, chegamos a duas decis\u00f5es importantes: come\u00e7amos a realizar testes can\u00e1rios e implementamos monitoramento autom\u00e1tico de erros em segundo plano com resposta autom\u00e1tica quando os limites s\u00e3o excedidos. A primeira decis\u00e3o permitiu detectar erros \u00f3bvios antes que o c\u00f3digo chegasse \u00e0 produ\u00e7\u00e3o, enquanto a segunda reduziu o tempo de resposta a problemas na produ\u00e7\u00e3o. Erros, claro, acontecem, mas gastamos a maior parte do tempo e esfor\u00e7o n\u00e3o na corre\u00e7\u00e3o, mas na minimiza\u00e7\u00e3o.\u00a0<\/p>\n<h2>Equipe de automa\u00e7\u00e3o<\/h2>\n<p>\nAtualmente, temos uma equipe de 130 desenvolvedores, e continuamos <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/article\/469965\/\">crescendo<\/a><\/noindex>. A equipe de integra\u00e7\u00e3o e entrega cont\u00ednua de c\u00f3digo (daqui em diante \u2014 equipe Deploy e Integra\u00e7\u00e3o ou DI) \u00e9 composta por 7 pessoas e trabalha em 2 frentes: desenvolvimento da plataforma de automa\u00e7\u00e3o Integro e DevOps.\u00a0<\/p>\n<p>DevOps \u00e9 respons\u00e1vel pelos ambientes Dev\/Beta do site CIAN, ambientes Integro, ajuda os desenvolvedores a resolver problemas e desenvolve novas abordagens para escalonamento de ambientes. A \u00e1rea de desenvolvimento Integro lida tanto com a Integro em si quanto com servi\u00e7os relacionados, como plugins para Jenkins, Jira, Confluence, al\u00e9m de desenvolver utilit\u00e1rios e aplicativos auxiliares para equipes de desenvolvedores.\u00a0<\/p>\n<p>A equipe DI trabalha em conjunto com a equipe de Plataforma, que lida com o desenvolvimento da arquitetura, bibliotecas e abordagens de desenvolvimento dentro da empresa. Al\u00e9m disso, qualquer desenvolvedor dentro da CIAN pode contribuir para a automa\u00e7\u00e3o, por exemplo, criando microautoma\u00e7\u00e3o para atender \u00e0s necessidades da equipe ou compartilhando uma ideia legal de como melhorar ainda mais a automa\u00e7\u00e3o.<\/p>\n<h2>Camadas de automa\u00e7\u00e3o na CIAN<\/h2>\n<p>\n<img decoding=\"async\" alt=\"De scripts a uma plataforma pr\u00f3pria: como automatizamos o desenvolvimento na CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/22dcd2d0cc283d53bdaac081885657f8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTodos os sistemas envolvidos na automa\u00e7\u00e3o podem ser divididos em v\u00e1rias camadas:<\/p>\n<ol>\n<li>Sistemas externos (Jira, Bitbucket, etc.). Eles s\u00e3o utilizados pelas equipes de desenvolvimento.\n<\/li>\n<li>Plataforma Integro. Na maioria das vezes, os desenvolvedores n\u00e3o interagem diretamente com ela, mas \u00e9 ela que suporta a opera\u00e7\u00e3o de toda a automa\u00e7\u00e3o.\n<\/li>\n<li>Servi\u00e7os de entrega, orquestra\u00e7\u00e3o e descoberta (como Jenkins, Consul, Nomad). Com eles, implantamos o c\u00f3digo nos servidores e garantimos a opera\u00e7\u00e3o conjunta dos servi\u00e7os.\n<\/li>\n<li>N\u00edvel f\u00edsico (servidores, SO, software relacionado). \u00c9 neste n\u00edvel que nosso c\u00f3digo opera. Isso pode ser em um servidor f\u00edsico ou virtual (LXC, KVM, Docker).\n<\/li>\n<\/ol>\n<p>\nCom base neste conceito, dividimos as zonas de responsabilidade dentro da equipe DI. Os dois primeiros n\u00edveis est\u00e3o sob a responsabilidade da \u00e1rea de desenvolvimento Integro, enquanto os dois \u00faltimos n\u00edveis ficam sob a responsabilidade do DevOps. Essa divis\u00e3o permite focar nas tarefas e n\u00e3o interfere na intera\u00e7\u00e3o, uma vez que estamos pr\u00f3ximos uns dos outros e constantemente trocamos conhecimentos e experi\u00eancias.<\/p>\n<h2>Integro<\/h2>\n<p>\nVamos focar na Integro e come\u00e7ar pela pilha tecnol\u00f3gica:<\/p>\n<ul>\n<li>CentOs 7\n<\/li>\n<li>Docker + Nomad + Consul + Vault\n<\/li>\n<li>Java 11 (o antigo mon\u00f3lito Integro permanecer\u00e1 em Java 8)\n<\/li>\n<li>Spring Boot 2.X + Spring Cloud Config\n<\/li>\n<li>PostgreSql 11\n<\/li>\n<li>RabbitMQ\u00a0\n<\/li>\n<li>Apache Ignite\n<\/li>\n<li>Camunda (embutido)\n<\/li>\n<li>Grafana + Graphite + Prometheus + Jaeger + ELK\n<\/li>\n<li>Web UI: React (CSR) + MobX\n<\/li>\n<li>SSO: Keycloak\n<\/li>\n<\/ul>\n<p>\nAdotamos o princ\u00edpio do desenvolvimento de microsservi\u00e7os, embora tenhamos um legado na forma do monolito da vers\u00e3o anterior do Integro. Cada microsservi\u00e7o roda em seu pr\u00f3prio cont\u00eainer Docker, e os servi\u00e7os se comunicam entre si por meio de solicita\u00e7\u00f5es HTTP e mensagens RabbitMQ. Os microsservi\u00e7os se encontram atrav\u00e9s do Consul e fazem a ele uma solicita\u00e7\u00e3o, passando pela autentica\u00e7\u00e3o via SSO (Keycloak, OAuth 2\/OpenID Connect).<\/p>\n<p><img decoding=\"async\" alt=\"De scripts a uma plataforma pr\u00f3pria: como automatizamos o desenvolvimento na CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/e7630c0bd62a40f397de1bf1c1097926.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nComo um exemplo real, consideremos a intera\u00e7\u00e3o com o Jenkins, que consiste nos seguintes passos:<\/p>\n<ol>\n<li>O microsservi\u00e7o de gerenciamento de workflow (daqui em diante, o microsservi\u00e7o Flow) deseja iniciar uma constru\u00e7\u00e3o no Jenkins. Para isso, ele encontra atrav\u00e9s do Consul o IP:PORT do microsservi\u00e7o de integra\u00e7\u00e3o com o Jenkins (daqui em diante, o microsservi\u00e7o Jenkins) e envia para ele uma solicita\u00e7\u00e3o ass\u00edncrona para iniciar a constru\u00e7\u00e3o no Jenkins.\n<\/li>\n<li>O microsservi\u00e7o Jenkins, ap\u00f3s receber a solicita\u00e7\u00e3o, gera e devolve um Job ID, que poder\u00e1 ser usado posteriormente para identificar o resultado da opera\u00e7\u00e3o. Juntamente com isso, ele inicia a constru\u00e7\u00e3o no Jenkins atrav\u00e9s da chamada da API REST.\n<\/li>\n<li>O Jenkins executa a constru\u00e7\u00e3o e, ap\u00f3s a conclus\u00e3o, envia um webhook com os resultados da execu\u00e7\u00e3o para o microsservi\u00e7o Jenkins.\n<\/li>\n<li>O microsservi\u00e7o Jenkins, ao receber o webhook, forma uma mensagem de conclus\u00e3o do processamento da solicita\u00e7\u00e3o e anexa a ela os resultados da execu\u00e7\u00e3o. A mensagem formada \u00e9 enviada para a fila RabbitMQ.\n<\/li>\n<li>Atrav\u00e9s do RabbitMQ, a mensagem publicada chega ao microsservi\u00e7o Flow, que fica ciente do resultado do processamento de sua tarefa, comparando o Job ID da solicita\u00e7\u00e3o com o Job ID da mensagem recebida.\n<\/li>\n<\/ol>\n<p>\nAtualmente, temos cerca de 30 microsservi\u00e7os, que podem ser organizados em v\u00e1rios grupos:<\/p>\n<ol>\n<li>Gerenciamento de configura\u00e7\u00f5es.\n<\/li>\n<li>Informa\u00e7\u00e3o e intera\u00e7\u00e3o com usu\u00e1rios (mensageiros, email).\n<\/li>\n<li>Trabalho com c\u00f3digo-fonte.\n<\/li>\n<li>Integra\u00e7\u00e3o com ferramentas de deployment (jenkins, nomad, consul, etc.).\n<\/li>\n<li>Monitoramento (lan\u00e7amentos, erros, etc.).\n<\/li>\n<li>Web-utilit\u00e1rios (UI para gerenciamento de ambientes de teste, coleta de estat\u00edsticas, etc.).\n<\/li>\n<li>Integra\u00e7\u00e3o com rastreadores de tarefas e sistemas semelhantes.\n<\/li>\n<li>Gerenciamento de workflow para diferentes tarefas.\n<\/li>\n<\/ol>\n<p><\/p>\n<h2>Workflow da tarefa<\/h2>\n<p>\nO Integro automatiza a\u00e7\u00f5es relacionadas ao ciclo de vida da tarefa. Em termos simplificados, entendemos por ciclo de vida da tarefa o workflow da tarefa no Jira. Em nossos processos de desenvolvimento, existem v\u00e1rias varia\u00e7\u00f5es de workflow dependendo do projeto, do tipo de tarefa e das op\u00e7\u00f5es selecionadas na tarefa espec\u00edfica.\u00a0<\/p>\n<p>Vamos considerar o workflow que usamos com mais frequ\u00eancia:<\/p>\n<p><img decoding=\"async\" alt=\"De scripts a uma plataforma pr\u00f3pria: como automatizamos o desenvolvimento na CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/62555be6bab024dd30f3cf70d4fe3cba.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNo diagrama, a engrenagem indica que a transi\u00e7\u00e3o \u00e9 invocada automaticamente pelo Integro, enquanto a figura da pessoa significa que a transi\u00e7\u00e3o \u00e9 acionada manualmente pelo usu\u00e1rio. Vamos considerar alguns caminhos pelos quais a tarefa pode passar neste fluxo de trabalho.<\/p>\n<p>Testes totalmente manuais em DEV+BETA sem testes can\u00e1rios (geralmente assim lan\u00e7amos o mon\u00f3lito):<\/p>\n<p><img decoding=\"async\" alt=\"De scripts a uma plataforma pr\u00f3pria: como automatizamos o desenvolvimento na CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/775528862e14817dff5f69db6de654dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPodem existir outras combina\u00e7\u00f5es de transi\u00e7\u00e3o. \u00c0s vezes, o caminho que a tarefa seguir\u00e1 pode ser escolhido atrav\u00e9s de op\u00e7\u00f5es no Jira.<\/p>\n<h2>Movimento da tarefa<\/h2>\n<p>\nVamos considerar as etapas principais que s\u00e3o realizadas ao mover uma tarefa pelo fluxo de trabalho \"Teste em DEV + testes can\u00e1rios\":<\/p>\n<p>1. O desenvolvedor ou PM cria a tarefa.<\/p>\n<p>2. O desenvolvedor come\u00e7a a trabalhar na tarefa. Ap\u00f3s a conclus\u00e3o, ele a coloca no status IN REVIEW.<\/p>\n<p>3. O Jira envia um Webhook para o microservi\u00e7o Jira (respons\u00e1vel pela integra\u00e7\u00e3o com o Jira).<\/p>\n<p>4. O microservi\u00e7o Jira envia uma solicita\u00e7\u00e3o para o servi\u00e7o Flow (respons\u00e1vel pelos fluxos de trabalho internos onde o trabalho \u00e9 realizado) para iniciar o fluxo de trabalho.<\/p>\n<p>5. Dentro do servi\u00e7o Flow:<\/p>\n<ul>\n<li>Revisores s\u00e3o designados para a tarefa (microservi\u00e7o Users, que sabe tudo sobre os usu\u00e1rios + microservi\u00e7o Jira).<\/li>\n<li>Atrav\u00e9s do microservi\u00e7o Source (que conhece os reposit\u00f3rios e branches, mas n\u00e3o trabalha com o c\u00f3digo em si), \u00e9 feita a busca pelos reposit\u00f3rios que possuem a branch da nossa tarefa (por simplifica\u00e7\u00e3o, o nome da branch coincide com o n\u00famero da tarefa no Jira). Normalmente, a tarefa tem apenas uma branch em um \u00fanico reposit\u00f3rio, o que simplifica a gest\u00e3o da fila para o deployment e reduz a complexidade entre os reposit\u00f3rios.<\/li>\n<li>Para cada branch encontrada, \u00e9 executada a seguinte sequ\u00eancia de a\u00e7\u00f5es:\n<p> i) O merge da branch master (microservi\u00e7o Git para trabalho com o c\u00f3digo).<br \/>\n ii) A branch \u00e9 bloqueada para mudan\u00e7as pelo desenvolvedor (microservi\u00e7o Bitbucket).<br \/>\n iii) \u00c9 criado um Pull Request para esta branch (microservi\u00e7o Bitbucket).<br \/>\n iv) Uma mensagem sobre o novo Pull Request \u00e9 enviada para os chats dos desenvolvedores (microservi\u00e7o Notify para trabalho com notifica\u00e7\u00f5es).<br \/>\n v) A constru\u00e7\u00e3o, teste e deployment da tarefa em DEV s\u00e3o iniciados (microservi\u00e7o Jenkins para trabalho com Jenkins).<br \/>\n vi) Se todos os passos anteriores foram conclu\u00eddos com sucesso, o Integro coloca sua Aprova\u00e7\u00e3o no Pull Request (microservi\u00e7o Bitbucket).<\/li>\n<li>O Integro aguarda a Aprova\u00e7\u00e3o no Pull Request dos revisores designados.<\/li>\n<li>Assim que todas as Aprova\u00e7\u00f5es necess\u00e1rias forem recebidas (incluindo os testes automatizados que passaram com sucesso), o Integro move a tarefa para o status Test on Dev (microservi\u00e7o Jira).<\/li>\n<\/ul>\n<p>\n6. Os testadores realizam testes na tarefa. Se n\u00e3o houver problemas, a tarefa \u00e9 transferida para o status Pronta Para Constru\u00e7\u00e3o.<\/p>\n<p>7. O Integro 'v\u00ea' que a tarefa est\u00e1 pronta para o lan\u00e7amento e inicia seu deploy em modo can\u00e1rio (microservi\u00e7o Jenkins). A prontid\u00e3o para o lan\u00e7amento \u00e9 determinada por um conjunto de regras. Por exemplo, a tarefa est\u00e1 no status correto, n\u00e3o h\u00e1 bloqueios em outras tarefas, atualmente n\u00e3o h\u00e1 implanta\u00e7\u00f5es ativas desse microservi\u00e7o, etc.<\/p>\n<p>8. A tarefa \u00e9 transferida para o status Can\u00e1rio (microservi\u00e7o Jira).<\/p>\n<p>9. Jenkins inicia o deploy da tarefa em modo can\u00e1rio atrav\u00e9s do Nomad (geralmente 1-3 inst\u00e2ncias) e notifica sobre o lan\u00e7amento o servi\u00e7o de monitoramento de lan\u00e7amentos (microservi\u00e7o DeployWatch).<\/p>\n<p>10. O microservi\u00e7o DeployWatch coleta o fundo de erros e reage a ele se necess\u00e1rio. Se o fundo de erros exceder um determinado limite (o limite \u00e9 calculado automaticamente), os desenvolvedores s\u00e3o notificados atrav\u00e9s do microservi\u00e7o Notify. Se em 5 minutos o desenvolvedor n\u00e3o reagir (clicar em Reverter ou Manter), uma revers\u00e3o autom\u00e1tica das inst\u00e2ncias can\u00e1rias \u00e9 iniciada. Se o fundo n\u00e3o for excedido, o desenvolvedor deve iniciar manualmente o deploy da tarefa em Produ\u00e7\u00e3o (clicando no bot\u00e3o na interface). Se, dentro de 60 minutos, o desenvolvedor n\u00e3o iniciar o deploy em Produ\u00e7\u00e3o, as inst\u00e2ncias can\u00e1rias tamb\u00e9m ser\u00e3o retiradas por motivos de seguran\u00e7a.<\/p>\n<p>11. Ap\u00f3s iniciar o deploy em Produ\u00e7\u00e3o:<\/p>\n<ul>\n<li>A tarefa \u00e9 transferida para o status Produ\u00e7\u00e3o (microservi\u00e7o Jira).<\/li>\n<li>O microservi\u00e7o Jenkins inicia o processo de deploy e notifica sobre o lan\u00e7amento o microservi\u00e7o DeployWatch.<\/li>\n<li>O microservi\u00e7o DeployWatch verifica se todos os cont\u00eaineres em Produ\u00e7\u00e3o foram atualizados (houve casos em que nem todos foram atualizados).<\/li>\n<li>Uma notifica\u00e7\u00e3o sobre os resultados do deploy em Produ\u00e7\u00e3o \u00e9 enviada atrav\u00e9s do microservi\u00e7o Notify.<\/li>\n<\/ul>\n<p>\n12. Os desenvolvedores ter\u00e3o 30 minutos para iniciar a revers\u00e3o da tarefa em Produ\u00e7\u00e3o em caso de comportamento incorreto do microservi\u00e7o. Ap\u00f3s esse tempo, a tarefa ser\u00e1 automaticamente mesclada no master (microservi\u00e7o Git).<\/p>\n<p>13. Ap\u00f3s um merge bem-sucedido no master, o status da tarefa ser\u00e1 alterado para Fechado (microservi\u00e7o Jira).<\/p>\n<p>O diagrama n\u00e3o se prop\u00f5e a uma detalhamento completo (na realidade h\u00e1 ainda mais etapas), mas permite avaliar o grau de integra\u00e7\u00e3o nos processos. N\u00e3o consideramos este diagrama ideal e estamos aprimorando os processos de suporte autom\u00e1tico a lan\u00e7amentos e deploy.<\/p>\n<h2>O que vem a seguir<\/h2>\n<p>\nTemos grandes planos para o desenvolvimento da automa\u00e7\u00e3o, como por exemplo, eliminar opera\u00e7\u00f5es manuais durante os lan\u00e7amentos do monolito, melhorar a monitora\u00e7\u00e3o durante o deployment autom\u00e1tico e aprimorar a intera\u00e7\u00e3o com os desenvolvedores.<\/p>\n<p>Mas por enquanto, vamos parar aqui. Abordamos muitos t\u00f3picos na revis\u00e3o da automa\u00e7\u00e3o de forma superficial, alguns n\u00e3o foram mencionados de todo, ent\u00e3o estaremos felizes em responder suas perguntas. Aguardamos sugest\u00f5es sobre o que detalhar, escrevam nos coment\u00e1rios.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/cian\/blog\/486056\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430 \u0420\u0418\u0422 2019 \u043d\u0430\u0448 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u0426\u0418\u0410\u041d: \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0443, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Integro. \u041e\u043d\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0437\u0430\u0434\u0430\u0447, \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0433\u043e\u0432 \u0432 production. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0448\u043b\u0438 \u043f\u0443\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55870","post","type-post","status-publish","format-standard","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=\"\u041d\u0430 \u0420\u0418\u0422 2019.\" \/>\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\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian\" \/>\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\u041e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435: \u043a\u0430\u043a \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0426\u0418\u0410\u041d | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430 \u0420\u0418\u0422 2019.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian\" \/>\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=\"2020-01-29T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:04:02+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\udd47De scripts a uma plataforma pr\u00f3pria: como automatizamos o desenvolvimento na CIAN | ProHoster","description":"Na RIT 2019.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","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\u041e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435: \u043a\u0430\u043a \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0426\u0418\u0410\u041d | ProHoster","og:description":"\u041d\u0430 \u0420\u0418\u0422 2019.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","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":"2020-01-29T21:00:00+00:00","article:modified_time":"2020-02-18T11:04:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55870","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:35:40","updated":"2022-09-30 17:42:13","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\/55870","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=55870"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/55870\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=55870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=55870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=55870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}