{"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\/es\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","title":{"rendered":"De scripts a nuestra propia plataforma: c\u00f3mo automatizamos el desarrollo en CIAN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"De scripts a nuestra propia plataforma: c\u00f3mo automatizamos el desarrollo en CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/965f1944c95e2020bec512a05d980a32.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn RIT 2019, nuestro colega Alexander Korotkov hizo <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=0wvUyjexoIg\">de Vladimir Leshchenko<\/a><\/noindex> una presentaci\u00f3n sobre la automatizaci\u00f3n del desarrollo en CIAN: para simplificar la vida y el trabajo, usamos nuestra propia plataforma Integro. Esta plataforma rastrea el ciclo de vida de las tareas, elimina operaciones rutinarias de los desarrolladores y reduce notablemente la cantidad de errores en producci\u00f3n. En esta publicaci\u00f3n complementaremos la presentaci\u00f3n de Alexander y contaremos c\u00f3mo pasamos de simples scripts a integrar productos de c\u00f3digo abierto a trav\u00e9s de nuestra propia plataforma y qu\u00e9 hace un equipo separado de automatizaci\u00f3n.<br \/>\n\u00a0<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Nivel cero<\/h2>\n<p>\n<i><b>\u00abNo existe el nivel cero, no s\u00e9 de eso\u00bb<\/b><br \/>\nMaestro Shifu de la pel\u00edcula \u00abKung Fu Panda\u00bb<\/i><\/p>\n<p>La automatizaci\u00f3n en CIAN comenz\u00f3 14 a\u00f1os despu\u00e9s de la fundaci\u00f3n de la empresa. En ese momento, hab\u00eda 35 personas en el equipo de desarrollo. Dif\u00edcil de creer, \u00bfverdad? Por supuesto, de alguna manera exist\u00eda la automatizaci\u00f3n, pero la direcci\u00f3n espec\u00edfica de integraci\u00f3n continua y entrega de c\u00f3digo comenz\u00f3 a formarse precisamente en 2015.\u00a0<\/p>\n<p>En ese momento, ten\u00edamos un enorme monolito hecho en Python, C# y PHP, desplegado en servidores Linux\/Windows. Para desplegar este monstruo, ten\u00edamos un conjunto de scripts que ejecut\u00e1bamos manualmente. Tambi\u00e9n hab\u00eda la construcci\u00f3n del monolito, que tra\u00eda dolor y sufrimiento debido a conflictos al fusionar ramas, corregir defectos y reconstruir \u00abcon otro conjunto de tareas en la construcci\u00f3n\u00bb. Simplificando, el proceso se ve\u00eda as\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"De scripts a nuestra propia plataforma: c\u00f3mo automatizamos el desarrollo en CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/03c4dd97e2ba0073bab1c33f6003a9ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNo est\u00e1bamos conformes con esto, y quer\u00edamos construir un proceso de construcci\u00f3n y despliegue repetible, automatizado y controlado. Para esto necesit\u00e1bamos un sistema CI\/CD, y est\u00e1bamos eligiendo entre la versi\u00f3n gratuita de Teamcity y Jenkins gratuito, ya que hab\u00edamos trabajado con ambos y cumpl\u00edan con nuestras necesidades funcionales. Elegimos Teamcity como el producto m\u00e1s reciente. En ese momento, a\u00fan no us\u00e1bamos arquitectura de microservicios y no esper\u00e1bamos un gran n\u00famero de tareas y proyectos.<\/p>\n<h2>Llegamos a la idea de un sistema propio<\/h2>\n<p>\nLa implementaci\u00f3n de Teamcity elimin\u00f3 solo una parte del trabajo manual: a\u00fan quedaba la creaci\u00f3n de Pull Requests, el avance de las tareas en Jira y la selecci\u00f3n de tareas para el lanzamiento. Con esto, el sistema Teamcity ya no pod\u00eda manejarlo. Era necesario elegir un camino para una mayor automatizaci\u00f3n. Consideramos opciones de trabajo con scripts en Teamcity o la transici\u00f3n a sistemas de automatizaci\u00f3n de terceros. Pero al final decidimos que necesit\u00e1bamos la m\u00e1xima flexibilidad que solo una soluci\u00f3n propia podr\u00eda ofrecer. As\u00ed naci\u00f3 la primera versi\u00f3n de un sistema de automatizaci\u00f3n interno llamado Integro.<\/p>\n<p>Teamcity se encarga de la automatizaci\u00f3n a nivel de inicio de procesos de compilaci\u00f3n y despliegue, mientras que Integro se enfoc\u00f3 en la automatizaci\u00f3n de alto nivel de los procesos de desarrollo. Era necesario combinar el trabajo con las tareas en Jira con el procesamiento del c\u00f3digo fuente relacionado en Bitbucket. En esta etapa, dentro de Integro comenzaron a aparecer sus propios flujos de trabajo para gestionar tareas de diferentes tipos.\u00a0<\/p>\n<p>Debido al aumento de la automatizaci\u00f3n en los procesos empresariales, creci\u00f3 el n\u00famero de proyectos y ejecuciones en Teamcity. As\u00ed surgi\u00f3 un nuevo problema: un solo instancia gratuita de Teamcity ya no era suficiente (3 agentes y 100 proyectos), a\u00f1adimos otra instancia (otros 3 agentes y 100 proyectos), y luego otra m\u00e1s. Como resultado, obtuvimos un sistema de varios cl\u00fasteres que era dif\u00edcil de gestionar:<\/p>\n<p><img decoding=\"async\" alt=\"De scripts a nuestra propia plataforma: c\u00f3mo automatizamos el desarrollo en CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/d95565e01e70e31f6b139dfb9b9caf95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCuando surgi\u00f3 la necesidad de una cuarta instancia, nos dimos cuenta de que no pod\u00edamos continuar as\u00ed, ya que los costos totales de mantenimiento de 4 instancias ya no eran sostenibles. Surgi\u00f3 la pregunta sobre la compra de Teamcity de pago o optar por Jenkins gratuito. Realizamos c\u00e1lculos sobre instancias y planes de automatizaci\u00f3n y decidimos que vivir\u00edamos con Jenkins. Pasadas unas semanas, cambiamos a Jenkins y nos libramos de parte del dolor de cabeza relacionado con el mantenimiento de varias instancias de Teamcity. Por lo tanto, pudimos centrarnos en el desarrollo de Integro y en adaptar Jenkins a nuestras necesidades.<\/p>\n<p>Con el crecimiento de la automatizaci\u00f3n b\u00e1sica (en forma de creaci\u00f3n autom\u00e1tica de Pull Requests, recolecci\u00f3n y publicaci\u00f3n de cobertura de c\u00f3digo y otras verificaciones) surgi\u00f3 un deseo persistente de renunciar al lanzamiento manual y dejar este trabajo a los robots. Adem\u00e1s, dentro de la empresa comenz\u00f3 la migraci\u00f3n a microservicios, que requer\u00edan lanzamientos frecuentes, separados uno del otro. As\u00ed, poco a poco, llegamos a lanzamientos autom\u00e1ticos de nuestros microservicios (por ahora, seguimos lanzando el monolito manualmente debido a la complejidad del proceso). Pero, como suele suceder, surgi\u00f3 una nueva dificultad.\u00a0<\/p>\n<h2>Automatizamos las pruebas<\/h2>\n<p>\n<img decoding=\"async\" alt=\"De scripts a nuestra propia plataforma: c\u00f3mo automatizamos el desarrollo en CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/9518ee0956922c6eb615bdef068ac525.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDebido a la automatizaci\u00f3n de los lanzamientos, los procesos de desarrollo se aceleraron parcialmente al omitir algunos pasos de prueba. Esto llev\u00f3 a una p\u00e9rdida temporal de calidad. Suena trivial, pero junto con la aceleraci\u00f3n de los lanzamientos, tambi\u00e9n hubo que cambiar la metodolog\u00eda de desarrollo del producto. Era necesario considerar la automatizaci\u00f3n de las pruebas, fomentar la responsabilidad personal (se refiere a 'adoptar la idea en la mente', no a sanciones monetarias) del desarrollador por el c\u00f3digo que produce y los errores en \u00e9l, as\u00ed como la decisi\u00f3n de publicar\/no publicar tareas a trav\u00e9s de un despliegue autom\u00e1tico.\u00a0<\/p>\n<p>Al abordar los problemas de calidad, llegamos a dos decisiones importantes: comenzamos a realizar pruebas canarias e implementamos un monitoreo autom\u00e1tico de errores con respuesta autom\u00e1tica ante su aumento. La primera decisi\u00f3n permiti\u00f3 detectar errores evidentes antes de que el c\u00f3digo llegara a producci\u00f3n, y la segunda redujo el tiempo de respuesta a problemas en producci\u00f3n. Por supuesto, los errores ocurren, pero dedicamos la mayor parte del tiempo y esfuerzo no a corregirlos, sino a minimizarlos.\u00a0<\/p>\n<h2>Equipo de automatizaci\u00f3n<\/h2>\n<p>\nActualmente contamos con un personal de 130 desarrolladores, y seguimos <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/article\/469965\/\">creciendo<\/a><\/noindex>. El equipo de integraci\u00f3n y entrega continua de c\u00f3digo (en adelante, equipo de Deploy and Integration o DI) est\u00e1 compuesto por 7 personas y trabaja en 2 \u00e1reas: el desarrollo de la plataforma de automatizaci\u00f3n Integro y DevOps.\u00a0<\/p>\n<p>DevOps se encarga de los entornos Dev\/Beta del sitio CIAN, del entorno Integro, ayuda a los desarrolladores a resolver problemas y desarrolla nuevos enfoques para escalar los entornos. La direcci\u00f3n de desarrollo de Integro trabaja tanto en Integro como en servicios relacionados, como complementos para Jenkins, Jira, Confluence, y tambi\u00e9n desarrolla utilidades y aplicaciones auxiliares para equipos de desarrolladores.\u00a0<\/p>\n<p>El equipo DI trabaja en conjunto con el equipo de la Plataforma, que se ocupa de desarrollar la arquitectura, bibliotecas y enfoques de desarrollo dentro de la empresa. Adem\u00e1s, cualquier desarrollador dentro de CIAN puede contribuir a la automatizaci\u00f3n, por ejemplo, realizando microautomatizaciones para las necesidades del equipo o compartiendo una gran idea sobre c\u00f3mo mejorar la automatizaci\u00f3n.<\/p>\n<h2>La tarta de capas de automatizaci\u00f3n en CIAN<\/h2>\n<p>\n<img decoding=\"async\" alt=\"De scripts a nuestra propia plataforma: c\u00f3mo automatizamos el desarrollo en CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/22dcd2d0cc283d53bdaac081885657f8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTodos los sistemas involucrados en la automatizaci\u00f3n se pueden dividir en varias capas:<\/p>\n<ol>\n<li>Sistemas externos (Jira, Bitbucket, etc.). Estos son los que utilizan los equipos de desarrollo.\n<\/li>\n<li>Plataforma Integro. A menudo, los desarrolladores no trabajan directamente con ella, pero es la que soporta toda la automatizaci\u00f3n.\n<\/li>\n<li>Servicios de entrega, orquestaci\u00f3n y descubrimiento (por ejemplo, Jenkins, Consul, Nomad). Con ellos desplegamos c\u00f3digo en servidores y aseguramos la operatividad de los servicios entre s\u00ed.\n<\/li>\n<li>Nivel f\u00edsico (servidores, sistemas operativos, software relacionado). En este nivel opera nuestro c\u00f3digo. Puede ser tanto un servidor f\u00edsico como uno virtual (LXC, KVM, Docker).\n<\/li>\n<\/ol>\n<p>\nBas\u00e1ndonos en este concepto, dividimos las \u00e1reas de responsabilidad dentro del equipo DI. Los dos primeros niveles est\u00e1n bajo la responsabilidad de la direcci\u00f3n de desarrollo de Integro, mientras que los dos \u00faltimos niveles son responsabilidad de DevOps. Esta divisi\u00f3n permite enfocarse en las tareas y no interfiere con la interacci\u00f3n, ya que estamos cerca unos de otros y constantemente compartimos conocimientos y experiencias.<\/p>\n<h2>Integro<\/h2>\n<p>\nEnfoqu\u00e9monos en Integro y comencemos con la pila tecnol\u00f3gica:<\/p>\n<ul>\n<li>CentOs 7\n<\/li>\n<li>Docker + Nomad + Consul + Vault\n<\/li>\n<li>Java 11 (el viejo monolito de Integro permanecer\u00e1 en 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 (embebida)\n<\/li>\n<li>Grafana + Graphite + Prometheus + Jaeger + ELK\n<\/li>\n<li>Interfaz Web: React (CSR) + MobX\n<\/li>\n<li>SSO: Keycloak\n<\/li>\n<\/ul>\n<p>\nMantenemos el principio de desarrollo de microservicios, aunque tenemos un legado en forma de un monolito de la versi\u00f3n temprana de Integro. Cada microservicio se ejecuta en su propio contenedor de Docker, y los servicios se comunican entre s\u00ed a trav\u00e9s de solicitudes HTTP y mensajes de RabbitMQ. Los microservicios se encuentran entre s\u00ed a trav\u00e9s de Consul y realizan solicitudes a \u00e9l, autentic\u00e1ndose mediante SSO (Keycloak, OAuth 2\/OpenID Connect).<\/p>\n<p><img decoding=\"async\" alt=\"De scripts a nuestra propia plataforma: c\u00f3mo automatizamos el desarrollo en CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/e7630c0bd62a40f397de1bf1c1097926.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nComo un ejemplo real, consideremos la interacci\u00f3n con Jenkins, que consta de los siguientes pasos:<\/p>\n<ol>\n<li>El microservicio de gesti\u00f3n del flujo de trabajo (en adelante, microservicio de flujo) desea iniciar una construcci\u00f3n en Jenkins. Para ello, encuentra a trav\u00e9s de Consul la IP:PORT del microservicio de integraci\u00f3n con Jenkins (en adelante, microservicio de Jenkins) y le env\u00eda una solicitud as\u00edncrona para iniciar la construcci\u00f3n en Jenkins.\n<\/li>\n<li>El microservicio de Jenkins, tras recibir la solicitud, genera y devuelve un Job ID en respuesta, que luego se podr\u00e1 utilizar para identificar el resultado de la ejecuci\u00f3n. Al mismo tiempo, inicia la construcci\u00f3n en Jenkins a trav\u00e9s de una llamada a la API REST.\n<\/li>\n<li>Jenkins ejecuta la construcci\u00f3n y, una vez finalizada, env\u00eda un webhook con los resultados de la ejecuci\u00f3n al microservicio de Jenkins.\n<\/li>\n<li>El microservicio de Jenkins, al recibir el webhook, genera un mensaje de finalizaci\u00f3n del procesamiento de la solicitud y adjunta los resultados de la ejecuci\u00f3n. El mensaje generado se env\u00eda a la cola de RabbitMQ.\n<\/li>\n<li>A trav\u00e9s de RabbitMQ, el mensaje publicado llega al microservicio de flujo, que se entera del resultado de su tarea, comparando el Job ID de la solicitud con el Job ID del mensaje recibido.\n<\/li>\n<\/ol>\n<p>\nActualmente tenemos alrededor de 30 microservicios, que se pueden dividir en varios grupos:<\/p>\n<ol>\n<li>Gesti\u00f3n de configuraciones.\n<\/li>\n<li>Comunicaci\u00f3n e interacci\u00f3n con los usuarios (mensajeros, correo).\n<\/li>\n<li>Trabajo con el c\u00f3digo fuente.\n<\/li>\n<li>Integraci\u00f3n con herramientas de despliegue (Jenkins, Nomad, Consul, etc.).\n<\/li>\n<li>Monitoreo (de lanzamientos, errores, etc.).\n<\/li>\n<li>Herramientas web (UI para gesti\u00f3n de entornos de prueba, recopilaci\u00f3n de estad\u00edsticas, etc.).\n<\/li>\n<li>Integraci\u00f3n con rastreadores de tareas y sistemas similares.\n<\/li>\n<li>Gesti\u00f3n del flujo de trabajo para diferentes tareas.\n<\/li>\n<\/ol>\n<p><\/p>\n<h2>Flujo de trabajo de la tarea.<\/h2>\n<p>\nIntegro automatiza las acciones relacionadas con el ciclo de vida de la tarea. Simplificando, por ciclo de vida de la tarea nos referimos al flujo de trabajo de la tarea en Jira. En nuestros procesos de desarrollo hay varias variaciones de flujo de trabajo seg\u00fan el proyecto, el tipo de tarea y las opciones seleccionadas en la tarea concreta.\u00a0<\/p>\n<p>Veamos el flujo de trabajo que utilizamos con m\u00e1s frecuencia:<\/p>\n<p><img decoding=\"async\" alt=\"De scripts a nuestra propia plataforma: c\u00f3mo automatizamos el desarrollo en CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/62555be6bab024dd30f3cf70d4fe3cba.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn el diagrama, el engranaje indica que la transici\u00f3n es invocada autom\u00e1ticamente por Integro, mientras que la figura de la persona significa que la transici\u00f3n es invocada manualmente por un ser humano. Veamos algunos caminos que la tarea puede seguir en este flujo de trabajo.<\/p>\n<p>Pruebas completamente manuales en DEV+BETA sin tests canarios (as\u00ed es como generalmente liberamos monolitos):<\/p>\n<p><img decoding=\"async\" alt=\"De scripts a nuestra propia plataforma: c\u00f3mo automatizamos el desarrollo en CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/775528862e14817dff5f69db6de654dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTambi\u00e9n pueden existir otras combinaciones de transici\u00f3n. A veces se puede elegir el camino que seguir\u00e1 la tarea a trav\u00e9s de las opciones en Jira.<\/p>\n<h2>Movimiento de la tarea<\/h2>\n<p>\nVeamos los pasos principales que se realizan al mover una tarea a trav\u00e9s del flujo de trabajo 'Pruebas en DEV + tests canarios':<\/p>\n<p>1. Un desarrollador o PM crea la tarea.<\/p>\n<p>2. El desarrollador toma la tarea para trabajar. Al finalizar, la cambia a estado 'EN REVISI\u00d3N'.<\/p>\n<p>3. Jira env\u00eda un Webhook al microservicio de Jira (responsable de la integraci\u00f3n con Jira).<\/p>\n<p>4. El microservicio de Jira env\u00eda una solicitud al servicio Flow (responsable de los flujos de trabajo internos donde se realiza el trabajo) para iniciar el flujo de trabajo.<\/p>\n<p>5. Dentro del servicio Flow:<\/p>\n<ul>\n<li>Se asignan revisores a la tarea (microservicio de Usuarios, que conoce todo sobre los usuarios + microservicio de Jira).<\/li>\n<li>A trav\u00e9s del microservicio Source (que conoce los repositorios y ramas, pero no trabaja con el c\u00f3digo en s\u00ed) se busca en los repositorios donde hay una rama de nuestra tarea (para simplificar la b\u00fasqueda, el nombre de la rama coincide con el n\u00famero de la tarea en Jira). Generalmente, la tarea tiene solo una rama en un repositorio, lo que simplifica la gesti\u00f3n de la cola para el despliegue y reduce el acoplamiento entre repositorios.<\/li>\n<li>Para cada rama encontrada, se lleva a cabo la siguiente secuencia de acciones:\n<p> i) Se mezcla la rama master (microservicio de Git para trabajar con el c\u00f3digo).<br \/>\n ii) La rama se bloquea de cambios por parte del desarrollador (microservicio de Bitbucket).<br \/>\n iii) Se crea una Pull Request para esta rama (microservicio de Bitbucket).<br \/>\n iv) Se env\u00eda un mensaje sobre la nueva Pull Request a los chats de desarrolladores (microservicio Notify para trabajar con notificaciones).<br \/>\n v) Se inician la construcci\u00f3n, pruebas y despliegue de la tarea en DEV (microservicio de Jenkins para trabajar con Jenkins).<br \/>\n vi) Si todos los pasos anteriores se completan con \u00e9xito, Integro coloca su aprobaci\u00f3n en la Pull Request (microservicio de Bitbucket).<\/li>\n<li>Integro espera la aprobaci\u00f3n en la Pull Request de los revisores asignados.<\/li>\n<li>Tan pronto como se reciban todas las aprobaciones necesarias (incluidas las pruebas automatizadas que hayan pasado positivamente), Integro cambia la tarea al estado 'Prueba en Desarrollo' (microservicio de Jira).<\/li>\n<\/ul>\n<p>\n6. Los testers realizan la prueba de la tarea. Si no hay problemas, la tarea se traslada al estado Listo para Construir.<\/p>\n<p>7. Integro \u00abve\u00bb que la tarea est\u00e1 lista para el lanzamiento y inicia su despliegue en modo canario (microservicio Jenkins). La preparaci\u00f3n para el lanzamiento se determina mediante un conjunto de reglas. Por ejemplo, la tarea debe estar en el estado correcto, no debe haber bloqueos en otras tareas, no debe haber implementaciones activas de este microservicio, etc.<\/p>\n<p>8. La tarea se traslada al estado Canario (microservicio Jira).<\/p>\n<p>9. Jenkins inicia el despliegue de la tarea en modo canario a trav\u00e9s de Nomad (generalmente 1-3 instancias) y notifica sobre la implementaci\u00f3n al servicio de monitoreo de lanzamientos (microservicio DeployWatch).<\/p>\n<p>10. El microservicio DeployWatch recopila el fondo de errores y reacciona a \u00e9l si es necesario. Si el fondo de errores supera el l\u00edmite (el l\u00edmite se calcula autom\u00e1ticamente), se notifica a los desarrolladores a trav\u00e9s del microservicio Notify. Si despu\u00e9s de 5 minutos el desarrollador no reacciona (presiona Revert o Stay), se inicia la reversi\u00f3n autom\u00e1tica de las instancias canarias. Si el fondo no se ha excedido, el desarrollador debe iniciar manualmente el despliegue de la tarea en Producci\u00f3n (presionando un bot\u00f3n en la interfaz de usuario). Si en 60 minutos el desarrollador no ha iniciado el despliegue en Producci\u00f3n, las instancias canarias tambi\u00e9n se revertir\u00e1n por razones de seguridad.<\/p>\n<p>11. Despu\u00e9s de iniciar el despliegue en Producci\u00f3n:<\/p>\n<ul>\n<li>La tarea se traslada al estado Producci\u00f3n (microservicio Jira).<\/li>\n<li>El microservicio Jenkins inicia el proceso de despliegue y notifica sobre la implementaci\u00f3n al microservicio DeployWatch.<\/li>\n<li>El microservicio DeployWatch verifica que todos los contenedores en Producci\u00f3n se hayan actualizado (ha habido casos en los que no se actualizaron todos).<\/li>\n<li>A trav\u00e9s del microservicio Notify se env\u00eda una notificaci\u00f3n sobre los resultados del despliegue en Producci\u00f3n.<\/li>\n<\/ul>\n<p>\n12. Los desarrolladores tendr\u00e1n 30 minutos para iniciar la reversi\u00f3n de la tarea desde Producci\u00f3n en caso de detectar un comportamiento incorrecto del microservicio. Despu\u00e9s de este tiempo, la tarea se integrar\u00e1 autom\u00e1ticamente en master (microservicio Git).<\/p>\n<p>13. Despu\u00e9s de una fusi\u00f3n exitosa en master, el estado de la tarea se cambiar\u00e1 a Cerrado (microservicio Jira).<\/p>\n<p>El esquema no pretende ser exhaustivo (en realidad hay m\u00e1s pasos), pero permite evaluar el grado de integraci\u00f3n en los procesos. No consideramos que este esquema sea ideal y mejoramos los procesos de soporte autom\u00e1tico de lanzamientos y despliegues.<\/p>\n<h2>\u00bfQu\u00e9 sigue?<\/h2>\n<p>\nTenemos grandes planes para el desarrollo de la automatizaci\u00f3n, como eliminar las operaciones manuales en los lanzamientos del monolito, mejorar la monitorizaci\u00f3n en el despliegue autom\u00e1tico y optimizar la interacci\u00f3n con los desarrolladores.<\/p>\n<p>Pero aqu\u00ed nos detendremos por ahora. Hemos cubierto muchos temas sobre la automatizaci\u00f3n de forma superficial y no hemos tocado algunos en absoluto, as\u00ed que estaremos encantados de responder a sus preguntas. Esperamos sus sugerencias sobre qu\u00e9 aspectos desarrollar en detalle, escr\u00edbanos en los comentarios.<br \/>\n<br \/>Fuente: <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.2 - 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\/es\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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 nuestra propia plataforma: c\u00f3mo automatizamos el desarrollo en CIAN | ProHoster","description":"En RIT 2019.","canonical_url":"https:\/\/prohoster.info\/es\/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":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/55870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=55870"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/55870\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=55870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=55870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=55870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}