{"id":78676,"date":"2020-04-21T07:42:22","date_gmt":"2020-04-21T05:42:22","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya"},"modified":"2020-04-21T07:42:22","modified_gmt":"2020-04-21T05:42:22","slug":"devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya","title":{"rendered":"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Parte 1: Web \/ Android<\/h1>\n<p>\n <u>Nota<\/u>: <i>este art\u00edculo es una traducci\u00f3n al espa\u00f1ol del art\u00edculo original.\u00a0<\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@altunin.alexey.a\/devops-tools-are-not-only-for-devops-building-test-automation-infrastructure-from-scratch-18e351dde938?source=friends_link&amp;sk=54dcbf6ab96c5592d093b50e441f942e\"><i>\u00abLas herramientas de DevOps no son solo para DevOps. Construyendo una infraestructura de automatizaci\u00f3n de pruebas desde cero\u00bb.<\/i><\/a><\/noindex><i> Sin embargo, todas las ilustraciones, enlaces, citas y t\u00e9rminos se mantienen en el idioma original para evitar distorsiones en el significado al traducir al espa\u00f1ol. \u00a1Les deseo un buen aprendizaje!<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/3d2ffb8331713a18755213cafac02144.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n Actualmente, la profesi\u00f3n de DevOps es una de las m\u00e1s demandadas en la industria de TI. Si abres sitios web populares de b\u00fasqueda de empleo y aplicas un filtro por salarios, ver\u00e1s que las ofertas de trabajo relacionadas con DevOps est\u00e1n al principio de la lista. Sin embargo, es importante entender que esto se refiere principalmente a la posici\u00f3n de 'Senior', lo que implica que el candidato tiene un alto nivel de habilidades, conocimiento de tecnolog\u00edas y herramientas. Esto tambi\u00e9n conlleva un alto grado de responsabilidad relacionado con el funcionamiento ininterrumpido de la producci\u00f3n. Sin embargo, hemos empezado a olvidar qu\u00e9 es DevOps. Originalmente, no era una persona espec\u00edfica o un departamento. Si buscamos definiciones de este t\u00e9rmino, encontraremos muchos sustantivos hermosos y correctos, como metodolog\u00eda, pr\u00e1cticas, filosof\u00eda cultural, grupo de conceptos, etc.<\/p>\n<p>Mi especializaci\u00f3n es ingeniero de automatizaci\u00f3n de pruebas (QA automation engineer), pero creo que no deber\u00eda estar relacionada solo con la escritura de pruebas autom\u00e1ticas o el desarrollo de la arquitectura del framework de pruebas. En 2020, el conocimiento de la infraestructura de automatizaci\u00f3n tambi\u00e9n es necesario. Esto permite organizar el proceso de automatizaci\u00f3n por cuenta propia, desde la ejecuci\u00f3n de pruebas hasta la presentaci\u00f3n de resultados a todas las partes interesadas de acuerdo a los objetivos establecidos. Como resultado, las habilidades de DevOps son un factor obligatorio para realizar este trabajo. Y todo esto est\u00e1 bien, pero, lamentablemente, hay un problema (<i>spoiler: este art\u00edculo intenta simplificar este problema.<\/i>). Se trata de que DevOps es complejo. Y es obvio, ya que las empresas no pagar\u00e1n mucho por algo que es f\u00e1cil de hacer\u2026 En el mundo de DevOps hay una gran cantidad de herramientas, t\u00e9rminos y pr\u00e1cticas que se deben dominar. Especialmente al inicio de la carrera, esto puede ser muy dif\u00edcil y depende de la experiencia t\u00e9cnica acumulada.<\/p>\n<p><img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/20712bd4acf881d5346b87f5a2b359d2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nFuente: <noindex><a rel=\"nofollow\" href=\"http:\/\/maximelanciauxbi.blogspot.com\/2017\/04\/devops-tools.html\"> http:\/\/maximelanciauxbi.blogspot.com\/2017\/04\/devops-tools.html<\/a><\/noindex><\/p>\n<p>Aqu\u00ed, probablemente, concluir\u00edamos la parte introductoria y nos centrar\u00edamos en el objetivo de este art\u00edculo.\u00a0<\/p>\n<h3>Sobre qu\u00e9 trata este art\u00edculo<\/h3>\n<p>\nEn este art\u00edculo, compartir\u00e9 mi experiencia en la construcci\u00f3n de infraestructura para la automatizaci\u00f3n de pruebas. En internet se pueden encontrar muchas fuentes de informaci\u00f3n sobre diversas herramientas y c\u00f3mo utilizarlas, pero me gustar\u00eda analizarlas exclusivamente en el contexto de la automatizaci\u00f3n. Creo que a muchos ingenieros de automatizaci\u00f3n les resultar\u00e1 familiar la situaci\u00f3n en la que las pruebas desarrolladas, adem\u00e1s de ustedes mismos, nadie m\u00e1s las ejecuta ni se preocupa por su mantenimiento. Como resultado, las pruebas se vuelven obsoletas y se debe invertir tiempo en actualizarlas. Nuevamente, al comienzo de la carrera, esto puede ser una tarea bastante complicada: decidir acertadamente qu\u00e9 herramientas deben ayudar a resolver este problema, c\u00f3mo elegirlas, configurarlas y mantenerlas. Algunos testers recurren a la ayuda de DevOps (personas) y, seamos sinceros, este enfoque funciona. En muchos casos, puede ser la \u00fanica opci\u00f3n, ya que no tenemos visibilidad de todas las dependencias. Pero, como sabemos, DevOps son personas muy ocupadas, ya que deben pensar en la infraestructura de toda la empresa, el deployment, la monitorizaci\u00f3n, los microservicios y otras tareas similares seg\u00fan la organizaci\u00f3n\/equipo. Como suele suceder, la automatizaci\u00f3n no es una prioridad. En tal caso, debemos intentar hacer todo lo posible de nuestra parte, desde el principio hasta el final. Esto reducir\u00e1 las dependencias, acelerar\u00e1 el flujo de trabajo, mejorar\u00e1 nuestras habilidades y nos permitir\u00e1 ver el panorama m\u00e1s amplio de lo que est\u00e1 sucediendo.<\/p>\n<p>Este art\u00edculo presenta las herramientas m\u00e1s demandadas y populares, y muestra c\u00f3mo utilizarlas para construir paso a paso una infraestructura de automatizaci\u00f3n. Cada grupo est\u00e1 representado por herramientas que han sido probadas en experiencia personal. Pero esto no significa que debas usar lo mismo. Las herramientas en s\u00ed no son importantes, aparecen y desaparecen. Nuestra tarea como ingenieros es entender los principios b\u00e1sicos: por qu\u00e9 necesitamos este grupo de herramientas y qu\u00e9 tareas laborales podemos resolver con su ayuda. Por lo tanto, al final de cada secci\u00f3n dejo enlaces a herramientas similares que quiz\u00e1s se utilicen en tu organizaci\u00f3n.<\/p>\n<h3>Lo que no hay en este art\u00edculo<\/h3>\n<p>\nReitero que este art\u00edculo no trata sobre herramientas espec\u00edficas, por lo que no habr\u00e1 inserciones de c\u00f3digo de la documentaci\u00f3n ni descripciones de comandos espec\u00edficos. Pero al final de cada secci\u00f3n dejo enlaces para un estudio m\u00e1s detallado.<\/p>\n<p>Esto se debe a que:\u00a0<\/p>\n<ul>\n<li>este material es muy f\u00e1cil de encontrar en diversas fuentes (documentaci\u00f3n, libros, cursos en video);<\/li>\n<li>si comenzamos a profundizar, tendremos que escribir 10, 20, 30 partes de este art\u00edculo (cuando la idea es 2-3);<\/li>\n<li>simplemente no quiero gastar tu tiempo, ya que posiblemente quieras usar otras herramientas para alcanzar los mismos objetivos.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Pr\u00e1ctica<\/h3>\n<p>\nMe gustar\u00eda que este material fuera \u00fatil para cada lector y no simplemente le\u00eddo y olvidado. En cualquier aprendizaje, la pr\u00e1ctica es un componente muy importante. Para ello, he preparado<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeyAltunin\/devops-tools-for-qa-automation-infrastructure\"> un repositorio de GitHub con una gu\u00eda paso a paso sobre c\u00f3mo hacer todo desde cero<\/a><\/noindex>. Tambi\u00e9n tendr\u00e1s trabajo en casa para asegurarte de que no has copiado sin pensar l\u00edneas de comandos ejecutados. <\/p>\n<h3>Plan<\/h3>\n<p><\/p>\n<p><strong>Paso<\/strong><br \/>\n<strong>Tecnolog\u00eda<\/strong><br \/>\n<strong>Ejecuci\u00f3n local (preparar pruebas de demostraci\u00f3n web \/ android y ejecutarlas localmente)<\/strong><\/p>\n<p><strong>1<\/strong><br \/>\nNode.js, Selenium, Appium\u00a0<br \/>\nSistemas de control de versiones<\/p>\n<p><strong>2<\/strong><br \/>\nContenerizaci\u00f3n\u00a0<br \/>\nGit<\/p>\n<p><strong>3<\/strong><br \/>\nDocker, Selenium grid, Selenoid (Web, Android)<br \/>\nCI \/ CD<\/p>\n<p><strong>4<\/strong><br \/>\nPlataformas en la nube<br \/>\nGitlab CI<\/p>\n<p><strong>5<\/strong><br \/>\nGoogle Cloud Platform<br \/>\nOrquestaci\u00f3n<\/p>\n<p><strong>6<\/strong><br \/>\nInfraestructura como c\u00f3digo (IaC)<br \/>\nKubernetes<\/p>\n<p><strong>7<\/strong><br \/>\nTerraform, Ansible<br \/>\nEstructura de cada secci\u00f3n<\/p>\n<p><\/p>\n<h3>Para mantener la narrativa de manera visual, cada secci\u00f3n se describe seg\u00fan el siguiente plan:<\/h3>\n<p>\nuna breve descripci\u00f3n de la tecnolog\u00eda,<\/p>\n<ul>\n<li>el valor para la infraestructura de automatizaci\u00f3n,<\/li>\n<li>ilustraci\u00f3n del estado actual de la infraestructura,<\/li>\n<li>enlaces para estudio,<\/li>\n<li>herramientas similares.<\/li>\n<li>1. Ejecutar pruebas localmente<\/li>\n<\/ul>\n<p><\/p>\n<h2>Breve descripci\u00f3n de la tecnolog\u00eda<\/h2>\n<p><\/p>\n<h3>Descripci\u00f3n breve de la tecnolog\u00eda<\/h3>\n<p>\nEste es solo un paso preparatorio para iniciar pruebas de demostraci\u00f3n localmente y verificar que se ejecutan con \u00e9xito. En la parte pr\u00e1ctica se utiliza Node.js, pero el lenguaje de programaci\u00f3n y la plataforma no son relevantes, y se pueden usar aquellos que se utilizan en su empresa.\u00a0<\/p>\n<p>Sin embargo, como herramientas de automatizaci\u00f3n, recomiendo usar Selenium WebDriver para plataformas web y Appium para plataformas Android, respectivamente, ya que en los siguientes pasos utilizaremos im\u00e1genes de Docker que est\u00e1n dise\u00f1adas espec\u00edficamente para trabajar con estas herramientas. Adem\u00e1s, refiri\u00e9ndome a los requisitos de las ofertas de trabajo, estas herramientas son las m\u00e1s demandadas en el mercado.<\/p>\n<p>Como habr\u00e1n notado, solo estamos considerando pruebas web y para Android. Desafortunadamente, iOS es una historia completamente diferente (gracias, Apple). Planeo mostrar soluciones y pr\u00e1cticas relacionadas con iOS en pr\u00f3ximas partes.<\/p>\n<h3>Valor para la infraestructura de automatizaci\u00f3n<\/h3>\n<p>\nDesde el punto de vista de la infraestructura, la ejecuci\u00f3n local no aporta ning\u00fan valor. Solo est\u00e1 comprobando que las pruebas funcionan en una m\u00e1quina local en navegadores y simuladores locales. Pero de todos modos, este es un punto de partida necesario.<\/p>\n<h3>Ilustraci\u00f3n del estado actual de la infraestructura<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/504f28744e29938f66be41c32d9a7dc6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Enlaces para estudiar<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/selenium.dev\/\">Selenium<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/appium.io\/docs\/en\/about-appium\/getting-started\/\">Appium<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developer.android.com\/studio\/run\/emulator\">Emulador de Android<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/SeleniumHQ\/selenium\/tree\/master\/javascript\/node\/selenium-webdriver\/example\">Ejemplos de Selenium JS en GitHub<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/appium\/appium\/tree\/master\/sample-code\/javascript-wd\">Ejemplos de Appium JS en GitHub<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Herramientas similares<\/h3>\n<p><\/p>\n<ul>\n<li>cualquier lenguaje de programaci\u00f3n que te guste, en combinaci\u00f3n con Selenium\/Appium \u2014 pruebas;<\/li>\n<li>cualquier prueba;<\/li>\n<li>cualquier corredor de pruebas.<\/li>\n<\/ul>\n<p><\/p>\n<h2>2. Sistemas de control de versiones (Git)<\/h2>\n<p><\/p>\n<h3>Descripci\u00f3n breve de la tecnolog\u00eda<\/h3>\n<p>\n No ser\u00e1 una gran revelaci\u00f3n para nadie si digo que un sistema de control de versiones es una parte extremadamente importante del desarrollo, tanto en equipo como individualmente. Bas\u00e1ndose en diversas fuentes, se puede afirmar con confianza que Git es el representante m\u00e1s popular. Un sistema de control de versiones ofrece muchas ventajas, como intercambio de c\u00f3digo, almacenamiento de versiones, recuperaci\u00f3n en ramas anteriores, seguimiento del historial del proyecto y copias de seguridad. No discutiremos cada punto en detalle, ya que estoy seguro de que est\u00e1n bien familiarizados con ello y lo utilizan en su trabajo diario. Pero si por alguna raz\u00f3n no es as\u00ed, recomiendo interrumpir la lectura de este art\u00edculo y llenar esta brecha lo antes posible.<\/p>\n<h3>Valor para la infraestructura de automatizaci\u00f3n<\/h3>\n<p>\n Y aqu\u00ed pueden hacerse la pregunta razonable: \"\u00bfPor qu\u00e9 nos habla de Git? Todos lo conocen y lo utilizan tanto para el desarrollo del c\u00f3digo como para el c\u00f3digo de pruebas autom\u00e1ticas\". Tendr\u00e1n toda la raz\u00f3n, pero en este art\u00edculo hablamos sobre infraestructura y esta secci\u00f3n sirve como un avance para la secci\u00f3n 7: \"Infraestructura como c\u00f3digo (IaC)\". Para nosotros, esto significa que toda la infraestructura, incluida la de prueba, se describe en forma de c\u00f3digo, por lo que tambi\u00e9n podemos aplicar sistemas de control de versiones y obtener ventajas similares a las del desarrollo de c\u00f3digo y la automatizaci\u00f3n.<\/p>\n<p>Analizaremos IaC con m\u00e1s detalle en el paso 7, pero incluso ahora se puede comenzar a usar Git localmente, creando un repositorio local. La vista general se ampliar\u00e1 cuando agreguemos un repositorio remoto a la infraestructura.<\/p>\n<h3>Ilustraci\u00f3n del estado actual de la infraestructura<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/f17c1d2b2f18aa814c44f7c443e49416.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Enlaces para estudiar<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.atlassian.com\/git\/tutorials\/what-is-version-control\">\u00bfQu\u00e9 es el control de versiones?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/git-scm.com\/\">Git<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/git-scm.com\/book\/en\/v2\/Getting-Started-About-Version-Control\">Comenzando - Acerca del Control de Versiones<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Herramientas similares<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/subversion.apache.org\/\">SVN<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.mercurial-scm.org\/guide\">Mercurial<\/a><\/noindex>\u00a0<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/azure.microsoft.com\/en-us\/services\/devops\/server\/\">Microsoft TFS (ahora parte de Azure DevOps Services)<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2>3. Contenerizaci\u00f3n (Docker)<\/h2>\n<p><\/p>\n<h3>Descripci\u00f3n breve de la tecnolog\u00eda<\/h3>\n<p>\n Para demostrar c\u00f3mo la contenerizaci\u00f3n cambi\u00f3 las reglas del juego, retrocedamos varias d\u00e9cadas. En esos tiempos, las personas adquir\u00edan y utilizaban m\u00e1quinas servidoras para ejecutar aplicaciones. Pero en la mayor\u00eda de los casos, los recursos necesarios para la ejecuci\u00f3n no eran conocidos de antemano. Como resultado, las empresas gastaban dinero en la compra de servidores potentes y costosos, pero parte de esa capacidad no se utilizaba completamente.<\/p>\n<p>La siguiente etapa de la evoluci\u00f3n fueron las m\u00e1quinas virtuales (VM), que resolvieron el problema de gastar recursos en capacidades no utilizadas. Esta tecnolog\u00eda permiti\u00f3 ejecutar aplicaciones de manera independiente dentro de un servidor, asignando un espacio completamente aislado. Pero, lamentablemente, cualquier tecnolog\u00eda tiene sus inconvenientes. Ejecutar una VM requiere un sistema operativo completo, que consume CPU, RAM, almacenamiento y, dependiendo del sistema operativo, hay que considerar los costos de la licencia. Estos factores afectan la velocidad de arranque y complican la portabilidad.<\/p>\n<p>Y aqu\u00ed llegamos a la contenerizaci\u00f3n. De nuevo, esta tecnolog\u00eda resolvi\u00f3 el problema anterior, ya que los contenedores no utilizan un sistema operativo completo, lo que permite liberar una gran cantidad de recursos y proporciona una soluci\u00f3n r\u00e1pida y flexible para la portabilidad.<\/p>\n<p>Por supuesto, la tecnolog\u00eda de contenedorizaci\u00f3n no es algo nuevo y se present\u00f3 por primera vez a finales de los a\u00f1os 70. En ese tiempo se realizaron muchas investigaciones, desarrollos y intentos. Pero fue Docker quien adapt\u00f3 esta tecnolog\u00eda y la hizo f\u00e1cilmente accesible para las masas. En la actualidad, cuando hablamos de contenedores, en la mayor\u00eda de los casos nos referimos a Docker. Cuando hablamos de contenedores Docker, nos referimos a contenedores de Linux. Podemos usar sistemas Windows y macOS para ejecutar contenedores, pero es importante entender que en este caso aparece una capa adicional. Por ejemplo, Docker en Mac ejecuta contenedores de forma casi imperceptible dentro de una ligera VM de Linux. Regresaremos a este tema cuando discutamos sobre el lanzamiento de emuladores de Android dentro de contenedores, ya que aqu\u00ed surge un matiz muy importante que debe ser analizado m\u00e1s a fondo.<\/p>\n<h3>Valor para la infraestructura de automatizaci\u00f3n<\/h3>\n<p>\n Hemos determinado que la contenedorizaci\u00f3n y Docker son geniales. Vamos a mirarlo en el contexto de la automatizaci\u00f3n, ya que cada herramienta o tecnolog\u00eda debe resolver alg\u00fan problema. Se\u00f1alemos los problemas evidentes de la automatizaci\u00f3n de pruebas en el contexto de las pruebas de UI:<\/p>\n<ul>\n<li>una gran cantidad de dependencias al instalar Selenium y especialmente Appium;<\/li>\n<li>problemas de compatibilidad entre versiones de navegadores, simuladores y controladores;<\/li>\n<li>la falta de un espacio aislado para navegadores\/simuladores, lo que es especialmente cr\u00edtico para la ejecuci\u00f3n paralela;<\/li>\n<li>es dif\u00edcil de gestionar y mantener si se necesitan ejecutar 10, 50, 100 o incluso 1000 navegadores al mismo tiempo.<\/li>\n<\/ul>\n<p>\nPero dado que Selenium es la herramienta de automatizaci\u00f3n m\u00e1s popular y Docker es la herramienta de contenedorizaci\u00f3n m\u00e1s popular, no deber\u00eda sorprender a nadie que alguien haya intentado combinarlas para obtener una herramienta poderosa que aborde los problemas mencionados. Analicemos estas soluciones m\u00e1s a fondo.\u00a0<\/p>\n<p><u>Selenium grid en docker<\/u><\/p>\n<p>Esta herramienta es la m\u00e1s popular del mundo de Selenium para ejecutar m\u00faltiples navegadores en m\u00faltiples m\u00e1quinas y gestionarlos desde un nodo central. Para iniciar, es necesario registrar al menos 2 componentes: Hub y Node(s). Hub es el nodo central que recibe todas las solicitudes de las pruebas y las distribuye entre los Nodes correspondientes. Para cada Node, podemos configurar una configuraci\u00f3n espec\u00edfica, como indicar el navegador deseado y su versi\u00f3n. Sin embargo, a\u00fan debemos encargarnos de los controladores compatibles para los navegadores e instalarlos en los Nodes necesarios. Por esta raz\u00f3n, Selenium grid no se utiliza en su forma pura, excepto en los casos en que necesitamos trabajar con navegadores que no se pueden instalar en Linux OS. Para todos los dem\u00e1s casos, una soluci\u00f3n mucho m\u00e1s flexible y adecuada es utilizar im\u00e1genes de Docker para ejecutar el Hub y los Nodes de Selenium grid. Este enfoque facilita enormemente la gesti\u00f3n de los nodos, ya que podemos elegir la imagen que necesitamos con versiones de navegadores y controladores compatibles ya instaladas.<\/p>\n<p>A pesar de las rese\u00f1as negativas sobre la estabilidad del funcionamiento, especialmente al ejecutar un gran n\u00famero de Nodes en paralelo, Selenium grid sigue siendo la herramienta m\u00e1s popular para la ejecuci\u00f3n paralela de pruebas Selenium. Es importante destacar que en el c\u00f3digo abierto, siempre surgen diversas mejoras y modificaciones de esta herramienta que abordan los diferentes cuellos de botella.<\/p>\n<p><u>Selenoid para Web<\/u><\/p>\n<p>Esta herramienta representa un avance en el mundo de Selenium, ya que funciona nada m\u00e1s sacarla de la caja y ha hecho la vida de muchos ingenieros en automatizaci\u00f3n significativamente m\u00e1s f\u00e1cil. Primero que nada, no es una simple modificaci\u00f3n de Selenium Grid. En su lugar, los desarrolladores han creado una versi\u00f3n completamente nueva de Selenium Hub en el lenguaje Golang, lo que, combinado con im\u00e1genes de Docker ligeras para diferentes navegadores, ha impulsado el desarrollo de la automatizaci\u00f3n de pruebas. Adem\u00e1s, en el caso de Selenium Grid, debemos definir todos los navegadores requeridos y sus versiones por adelantado, lo que no es un problema cuando se trabaja solo con un \u00fanico navegador. Pero cuando se trata de varios navegadores compatibles, Selenoid se convierte en la soluci\u00f3n n\u00famero uno, gracias a la funci\u00f3n de 'navegador bajo demanda'. Todo lo que necesitamos hacer es descargar las im\u00e1genes necesarias con los navegadores y actualizar el archivo de configuraci\u00f3n con el que interact\u00faa Selenoid. Despu\u00e9s de que Selenoid reciba una solicitud de las pruebas, autom\u00e1ticamente iniciar\u00e1 el contenedor requerido con el navegador correspondiente. Cuando la prueba finalice, Selenoid detendr\u00e1 el contenedor, liberando as\u00ed recursos para futuras solicitudes. Este enfoque elimina por completo el conocido problema de 'degradaci\u00f3n de nodos', que a menudo encontramos en Selenium Grid.<\/p>\n<p>Pero, lamentablemente, Selenoid a\u00fan no es la soluci\u00f3n m\u00e1gica. Hemos obtenido la funci\u00f3n de 'navegador bajo demanda', pero la funci\u00f3n de 'recursos bajo demanda' a\u00fan no est\u00e1 disponible. Para utilizar Selenoid, debemos desplegarlo en hardware f\u00edsico o en una VM, lo que significa que debemos saber de antemano cu\u00e1ntos recursos necesitamos asignar. Creo que esto no es un problema para proyectos peque\u00f1os que ejecutan 10, 20 o incluso 30 navegadores en paralelo. Pero, \u00bfqu\u00e9 pasa si necesitamos 100, 500, 1000 o m\u00e1s? No tiene sentido mantener y pagar por una cantidad tan grande de recursos de forma constante. En las secciones 5 y 6 de este art\u00edculo discutiremos soluciones que permiten escalar, reduciendo as\u00ed significativamente los costos de la empresa.<\/p>\n<p><u>Selenoid para Android<\/u><\/p>\n<p>Despu\u00e9s del \u00e9xito de Selenoid como herramienta para la automatizaci\u00f3n web, la gente quer\u00eda algo similar para Android. Y esto se ha logrado: Selenoid ha sido lanzado con soporte para Android. Desde un punto de vista del usuario de alto nivel, el principio de funcionamiento es similar al de la automatizaci\u00f3n web. La \u00fanica diferencia es que, en lugar de contenedores con navegadores, Selenoid inicia contenedores con emuladores de Android. En mi opini\u00f3n, en este momento, esta es la herramienta gratuita m\u00e1s poderosa para ejecutar pruebas de Android en paralelo.<\/p>\n<p>No me gustar\u00eda hablar de los aspectos negativos de esta herramienta, ya que realmente me gusta mucho. Sin embargo, existen las mismas desventajas que se relacionan con la automatizaci\u00f3n web, relacionadas con la escalabilidad. Adem\u00e1s, hay que mencionar otra limitaci\u00f3n que puede ser una sorpresa si configuramos la herramienta por primera vez. Para ejecutar im\u00e1genes de Android, necesitamos una m\u00e1quina f\u00edsica o un VM con soporte de virtualizaci\u00f3n anidada. En la gu\u00eda pr\u00e1ctica, demuestro c\u00f3mo activarlo en un VM de Linux. Sin embargo, si eres usuario de macOS y deseas desplegar Selenoid localmente, no ser\u00e1 posible ejecutar pruebas de Android. Pero siempre puedes ejecutar un VM de Linux localmente con la 'virtualizaci\u00f3n anidada' configurada y desplegar Selenoid dentro.<\/p>\n<h3>Ilustraci\u00f3n del estado actual de la infraestructura<\/h3>\n<p>\n En el contexto de este art\u00edculo, a\u00f1adiremos 2 herramientas para ilustrar la infraestructura. Estas son Selenium Grid para pruebas web y Selenoid para pruebas de Android. En la gu\u00eda en GitHub, tambi\u00e9n mostrar\u00e9 c\u00f3mo usar Selenoid para ejecutar pruebas web.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/1202ae79eba9cffc965f3a5b2648c755.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Enlaces para estudiar<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.docker.com\/resources\/what-container\">Docker: qu\u00e9 es un contenedor<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.docker.com\/get-started\">Docker: comenzar<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/containerjournal.com\/topics\/container-ecosystems\/5-container-alternatives-to-docker\/\">5 alternativas de contenedor a Docker<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/SeleniumHQ\/selenium\/wiki\/Grid2\">Selenium Grid<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/SeleniumHQ\/docker-selenium\">Docker de Selenium<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/aerokube.com\/selenoid\/latest\/\">Selenoid<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/aerokube\/selenoid\">Selenoid GitHub<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developer.android.com\/studio\/run\/emulator-acceleration#vm-linux\">Configuraci\u00f3n de KVM para emuladores de Android<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Docker-Deep-Dive-Nigel-Poulton-ebook\/dp\/B01LXWQUFF\/ref=pd_sim_351_1\/147-1129855-1615632?_encoding=UTF8&amp;pd_rd_i=B01LXWQUFF&amp;pd_rd_r=f8dcd666-e707-4f85-99c6-24ecec56ea74&amp;pd_rd_w=rMnHL&amp;pd_rd_wg=u17vC&amp;pf_rd_p=bab57536-7c8f-4781-a8ed-3e270b9cd303&amp;pf_rd_r=KN6EXNGBWJ6B9QNJE4M2&amp;psc=1&amp;refRID=KN6EXNGBWJ6B9QNJE4M2\">Libro Docker Deep Dive<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Herramientas similares<\/h3>\n<p><\/p>\n<ul>\n<li>Existen otras herramientas de contenedorizaci\u00f3n, pero Docker es la m\u00e1s popular. Si deseas probar algo diferente, ten en cuenta que las herramientas que hemos revisado para la ejecuci\u00f3n paralela de pruebas de Selenium no funcionar\u00e1n de inmediato.\u00a0\u00a0<\/li>\n<li>Como se mencion\u00f3, hay muchas modificaciones de Selenium Grid, por ejemplo,<noindex><a rel=\"nofollow\" href=\"https:\/\/opensource.zalando.com\/zalenium\/\"> Zalenium<\/a><\/noindex>. <\/li>\n<\/ul>\n<p><\/p>\n<h2>4. CI \/ CD<\/h2>\n<p><\/p>\n<h3>Descripci\u00f3n breve de la tecnolog\u00eda<\/h3>\n<p>\n La pr\u00e1ctica de la integraci\u00f3n continua es bastante popular en el desarrollo y se encuentra a la par con los sistemas de control de versiones. Sin embargo, siento que hay confusi\u00f3n en la terminolog\u00eda. En este p\u00e1rrafo, me gustar\u00eda describir tres modificaciones de esta tecnolog\u00eda desde mi punto de vista. En Internet, encontrar\u00e1s muchos art\u00edculos con diversas interpretaciones, y est\u00e1 absolutamente bien si tu opini\u00f3n difiere. Lo m\u00e1s importante es que est\u00e9s en sinton\u00eda con tus colegas.<\/p>\n<p>Entonces, existen tres t\u00e9rminos: CI \u2014 Continuous Integration (integraci\u00f3n continua), CD \u2014 Continuous Delivery (entrega continua) y nuevamente CD \u2014 Continuous Deployment (despliegue continuo). (<i>A partir de ahora usar\u00e9 estos t\u00e9rminos en ingl\u00e9s.<\/i>). Cada modificaci\u00f3n a\u00f1ade varios pasos adicionales a tu canal de desarrollo. Pero la palabra <u>continuous<\/u> (continuo) es el m\u00e1s importante. En este contexto, nos referimos a algo que ocurre de principio a fin, sin interrupciones o intervenci\u00f3n manual. Veamos CI &amp; CD y CD en este contexto.<\/p>\n<ul>\n<li><strong>Continuous Integration \u2013<\/strong> es el primer paso de la evoluci\u00f3n. Tras enviar nuevo c\u00f3digo al servidor, esperamos recibir una r\u00e1pida retroalimentaci\u00f3n de que nuestros cambios son correctos. Por lo general, CI incluye la ejecuci\u00f3n de herramientas de an\u00e1lisis est\u00e1tico de c\u00f3digo y pruebas de m\u00f3dulos\/API internas. Esto permite obtener informaci\u00f3n sobre nuestro c\u00f3digo en cuesti\u00f3n de segundos\/minutos.<\/li>\n<li><strong>Entrega Continua<\/strong> es un paso m\u00e1s avanzado, en el que ejecutamos pruebas de integraci\u00f3n\/UI. Sin embargo, en esta etapa no obtendremos resultados tan r\u00e1pidamente como en el caso de CI. En primer lugar, estos tipos de pruebas requieren m\u00e1s tiempo para completarse. En segundo lugar, antes de ejecutar, debemos desplegar nuestros cambios en un entorno de test\/staging. Adem\u00e1s, si hablamos de desarrollo m\u00f3vil, hay un paso adicional para crear la compilaci\u00f3n de nuestra aplicaci\u00f3n.<\/li>\n<li><strong>Continuous Deployment<\/strong> implica que autom\u00e1ticamente lanzamos (release) nuestros cambios en producci\u00f3n si todas las pruebas de aceptaci\u00f3n han pasado en las etapas anteriores. Adem\u00e1s, despu\u00e9s de la etapa de release, se pueden configurar diferentes etapas, como la ejecuci\u00f3n de pruebas smoke en producci\u00f3n y la recopilaci\u00f3n de m\u00e9tricas relevantes. El Continuous Deployment es posible solo con una buena cobertura de pruebas automatizadas. Si se requieren intervenciones manuales, incluida la prueba, entonces ya no es <u>Continuo<\/u> (continuo). Entonces podemos decir que nuestro pipeline solo se ajusta a la pr\u00e1ctica de Continuous Delivery.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Valor para la infraestructura de automatizaci\u00f3n<\/h3>\n<p>\n En esta secci\u00f3n debo aclarar que, cuando hablamos de pruebas de UI de extremo a extremo, implica que debemos desplegar nuestros cambios y servicios relacionados en entornos de prueba. El proceso de Continuous Integration no es aplicable para esta tarea y debemos asegurarnos de implementar al menos pr\u00e1cticas de Continuous Delivery. Continuous Deployment tambi\u00e9n tiene sentido en el contexto de las pruebas de UI, si planeamos ejecutarlas en producci\u00f3n.<\/p>\n<p>Y antes de que observemos la ilustraci\u00f3n del cambio de arquitectura, quiero decir algunas palabras sobre GitLab CI. A diferencia de otras herramientas de CI\/CD, GitLab proporciona un repositorio remoto y muchas otras funciones adicionales. As\u00ed, GitLab es m\u00e1s que CI. Incluye gesti\u00f3n de c\u00f3digo fuente, gesti\u00f3n \u00e1gil, pipelines de CI\/CD, herramientas de registro y recopilaci\u00f3n de m\u00e9tricas. La arquitectura de GitLab consta de GitLab CI\/CD y GitLab Runner. A continuaci\u00f3n, una breve descripci\u00f3n de su sitio oficial:<\/p>\n<blockquote><p>Gitlab CI\/CD es una aplicaci\u00f3n web con una API que almacena su estado en una base de datos, gestiona proyectos\/construcciones y proporciona una interfaz de usuario. GitLab Runner es una aplicaci\u00f3n que procesa las construcciones. Se puede desplegar de forma independiente y trabaja con GitLab CI\/CD a trav\u00e9s de una API. Para ejecutar pruebas, se necesita tanto la instancia de Gitlab como el Runner.<\/p><\/blockquote>\n<p><\/p>\n<h3>Ilustraci\u00f3n del estado actual de la infraestructura<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/a05ece39b6c6a9aaec4177d4b5242722.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Enlaces para estudiar<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/martinfowler.com\/articles\/continuousIntegration.html\">Martin Fowler: Continuous Integration<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/ci\/\">GitLab CI\/CD<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Integration-Improving-Software-Reducing\/dp\/0321336380\">Libro sobre Continuous Integration<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Delivery-Deployment-Automation-Addison-Wesley-ebook-dp-B003YMNVC0\/dp\/B003YMNVC0\/ref=mt_kindle?_encoding=UTF8&amp;me=&amp;qid=\">Libro sobre Continuous Delivery<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Herramientas similares<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/jenkins.io\/\">Jenkins<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/teamcity\/\">TeamCity<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/travis-ci.com\/\">Travis<\/a><\/noindex>\u00a0<\/li>\n<li>Y muchos otros<\/li>\n<\/ul>\n<p><\/p>\n<h2>5. Plataformas en la nube<\/h2>\n<p><\/p>\n<h3>Descripci\u00f3n breve de la tecnolog\u00eda<\/h3>\n<p>\n En esta secci\u00f3n, hablaremos de una tendencia popular llamada \u2018nubes p\u00fablicas\u2019. A pesar de los enormes beneficios que ofrecen las tecnolog\u00edas de virtualizaci\u00f3n y contenedorizaci\u00f3n descritas anteriormente, a\u00fan necesitamos recursos computacionales. Las empresas adquieren servidores costosos o alquilan centros de datos, pero en ese caso es necesario hacer c\u00e1lculos (a veces poco realistas) sobre cu\u00e1ntos recursos necesitaremos, si los utilizaremos 24\/7 y para qu\u00e9 fines. Por ejemplo, para producci\u00f3n se requiere un servidor que funcione las 24 horas, pero \u00bfnecesitamos recursos similares para pruebas fuera de horario laboral? Esto tambi\u00e9n depende del tipo de pruebas que se realicen. Un ejemplo pueden ser las pruebas de carga\/estr\u00e9s, que planeamos ejecutar en horas no laborables para obtener resultados al d\u00eda siguiente. Sin embargo, definitivamente no se requiere disponibilidad continua de servidores para las pruebas automatizadas end-to-end y especialmente para los entornos de pruebas manuales. Para tales situaciones, ser\u00eda ideal obtener solo los recursos necesarios bajo demanda, utilizarlos y dejar de pagar cuando ya no se necesiten. Adem\u00e1s, ser\u00eda genial obtenerlos de inmediato, con solo unos clics del mouse o ejecutando un par de scripts. Para eso se utilizan las nubes p\u00fablicas. Veamos la definici\u00f3n:<\/p>\n<blockquote><p>\u00abLa nube p\u00fablica se define como servicios de computaci\u00f3n ofrecidos por proveedores externos a trav\u00e9s de Internet p\u00fablico, haci\u00e9ndolos disponibles para cualquier persona que desee usarlos o comprarlos. Pueden ser gratuitos o vendidos bajo demanda, permitiendo a los clientes pagar solo por el uso de los ciclos de CPU, almacenamiento o ancho de banda que consumen\u00bb.<\/p><\/blockquote>\n<p>\n Se dice que las nubes p\u00fablicas son caras. Pero su idea clave es la reducci\u00f3n de costos para la empresa. Como se mencion\u00f3 anteriormente, las nubes p\u00fablicas permiten obtener recursos bajo demanda y pagar solo por el tiempo que se utilizan. Adem\u00e1s, a veces olvidamos que los empleados reciben un salario, y los especialistas tambi\u00e9n son un recurso costoso. Es importante tener en cuenta que las nubes p\u00fablicas facilitan enormemente el soporte de la infraestructura, lo que permite a los ingenieros concentrarse en tareas m\u00e1s importantes.\u00a0<\/p>\n<h3>Valor para la infraestructura de automatizaci\u00f3n<\/h3>\n<p>\n \u00bfQu\u00e9 recursos espec\u00edficos necesitamos para pruebas de UI end-to-end? Principalmente, se trata de m\u00e1quinas virtuales o cl\u00fasteres (hablaremos de Kubernetes en la siguiente secci\u00f3n) para ejecutar navegadores y emuladores. Cuantos m\u00e1s navegadores y emuladores queramos ejecutar simult\u00e1neamente, m\u00e1s CPU y memoria se requieren, y m\u00e1s dinero tendremos que pagar por ello. As\u00ed, las nubes p\u00fablicas en el contexto de la automatizaci\u00f3n de pruebas nos permiten lanzar un gran n\u00famero (100, 200, 1000\u2026) de navegadores\/emuladores bajo demanda, obtener resultados de pruebas lo m\u00e1s r\u00e1pido posible y dejar de pagar por esas locas capacidades que consumen recursos.\u00a0<\/p>\n<p>Los proveedores de nube m\u00e1s populares son Amazon Web Services (AWS), Microsoft Azure y Google Cloud Platform (GCP). En la gu\u00eda pr\u00e1ctica se presentan ejemplos de uso de GCP, pero en general no importa qu\u00e9 utilices para tareas de automatizaci\u00f3n. Todos ofrecen aproximadamente la misma funcionalidad. Normalmente, para elegir un proveedor, la gu\u00eda se centra en toda la infraestructura de la empresa y los requisitos comerciales, lo cual est\u00e1 fuera del alcance de este art\u00edculo. Para los ingenieros de automatizaci\u00f3n, ser\u00e1 m\u00e1s interesante comparar el uso de proveedores de nube con el uso de plataformas en la nube espec\u00edficamente para prop\u00f3sitos de prueba, como Sauce Labs, BrowserStack, BitBar, etc. \u00a1As\u00ed que hag\u00e1moslo! En mi opini\u00f3n, Sauce Labs es la granja de pruebas en la nube m\u00e1s conocida, por eso la eleg\u00ed para la comparaci\u00f3n.\u00a0<\/p>\n<p><u>GCP frente a Sauce Labs para prop\u00f3sitos de automatizaci\u00f3n:<\/u><\/p>\n<p>Imaginemos que necesitamos ejecutar simult\u00e1neamente 8 pruebas web y 8 pruebas de Android. Para ello, utilizaremos GCP y lanzaremos 2 m\u00e1quinas virtuales con Selenoid. En la primera levantaremos 8 contenedores con navegadores. En la segunda, 8 contenedores con emuladores. Veamos los precios:\u00a0\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/e4688fd2e6e5593d2e1c22fc57f59484.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Para ejecutar un contenedor con Chrome, necesitaremos <strong>n1-standard-1 <\/strong>m\u00e1quina. En el caso de Android, ser\u00e1 <strong>n1-standard-4 <\/strong>por un emulador. En realidad, un m\u00e9todo m\u00e1s flexible y econ\u00f3mico es asignar valores espec\u00edficos de usuario para CPU\/Memoria, pero en este momento para la comparaci\u00f3n con Sauce Labs no es fundamental.<\/p>\n<p>Aqu\u00ed est\u00e1n las tarifas para el uso de Sauce Labs:<\/p>\n<p><img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/1367d2b59bbef9603b4b4be166e8d721.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSupongo que ya has notado la diferencia, pero a\u00fan as\u00ed presentar\u00e9 una tabla con c\u00e1lculos para nuestra tarea:<\/p>\n<p><strong>Recursos requeridos<\/strong><br \/>\n<strong>Mensual<\/strong><br \/>\n<strong>Horas laborables<\/strong><strong>(8 a.m \u2014 8 p.m)<\/strong><br \/>\n<strong>Horas laborables<\/strong><strong>+ Preemptible<\/strong><\/p>\n<p><strong>GCP para Web<\/strong><br \/>\nn1-standard-1 x 8 = n1-standard-8<br \/>\n$194.18<br \/>\n23 d\u00edas * 12h * 0.38 = 104.88$\u00a0<br \/>\n23 d\u00edas * 12h * 0.08 = 22.08$<\/p>\n<p><strong>Sauce Labs para Web<\/strong><br \/>\nPruebas paralelas en Virtual Cloud8<br \/>\n$1.559<br \/>\n\u2014<br \/>\n\u2014<\/p>\n<p><strong>GCP para Android<\/strong><br \/>\nn1-standard-4 x 8: n1-standard-16<br \/>\n$776.72<br \/>\n23 d\u00edas * 12h * 1.52 = 419.52$\u00a0<br \/>\n23 d\u00edas * 12h * 0.32 = 88.32$<\/p>\n<p><strong>Sauce Labs para Android<\/strong><br \/>\nPruebas paralelas en Real Device Cloud<br \/>\n$1.999<br \/>\n\u2014<br \/>\n\u2014<\/p>\n<p>\nComo se puede ver, la diferencia en costos es enorme, especialmente si se ejecutan pruebas solo en un intervalo de trabajo de doce horas. Pero a\u00fan se pueden reducir m\u00e1s los gastos si se utilizan instancias preemptibles. \u00bfQu\u00e9 son exactamente?<\/p>\n<blockquote><p>Una VM preemptible es una instancia que puedes crear y ejecutar a un precio mucho m\u00e1s bajo que las instancias normales. Sin embargo, el Compute Engine puede terminar (preemptar) estas instancias si necesita acceso a esos recursos para otras tareas. Las instancias preemptibles son capacidad excedente del Compute Engine, por lo que su disponibilidad var\u00eda seg\u00fan el uso.<\/p>\n<p>Si tus aplicaciones son tolerantes a fallos y pueden soportar posibles preemptiones de instancias, entonces las instancias preemptibles pueden reducir significativamente tus costos de Compute Engine. Por ejemplo, los trabajos de procesamiento por lotes pueden ejecutarse en instancias preemptibles. Si algunas de esas instancias se terminan durante el procesamiento, el trabajo se ralentiza pero no se detiene completamente. Las instancias preemptibles completan tus tareas de procesamiento por lotes sin a\u00f1adir una carga adicional a tus instancias existentes y sin requerir que pagues el precio completo por instancias normales adicionales.<\/p><\/blockquote>\n<p>\n \u00a1Y esto a\u00fan no es todo! En realidad, estoy seguro de que nadie ejecuta pruebas durante 12 horas seguidas. Y si es as\u00ed, puedes iniciar y detener autom\u00e1ticamente las m\u00e1quinas virtuales cuando no se necesitan. El tiempo real de uso puede reducirse a 6 horas al d\u00eda. Entonces, el pago en el contexto de nuestra tarea disminuir\u00eda hasta 11$ al mes por 8 navegadores. \u00bfNo es maravilloso? Pero con las m\u00e1quinas preemptibles debemos tener cuidado y estar listos para interrupciones y funcionamiento inestable, aunque estas situaciones pueden prever y manejarse program\u00e1ticamente. \u00a1Vale la pena!<\/p>\n<p>Pero de ninguna manera estoy diciendo 'nunca uses granjas de pruebas en la nube'. Tienen varias ventajas. Primero, no es solo una m\u00e1quina virtual, sino una soluci\u00f3n completa para la automatizaci\u00f3n de pruebas con un conjunto de funcionalidades listas para usar: acceso remoto, registros, capturas de pantalla, grabaci\u00f3n de video, diferentes navegadores y dispositivos m\u00f3viles f\u00edsicos. En muchas situaciones, esto puede ser una alternativa lujosa e insustituible. Especialmente las plataformas de prueba son \u00fatiles para la automatizaci\u00f3n de IOS, cuando las nubes p\u00fablicas solo pueden ofrecer sistemas Linux\/Windows. Pero la conversaci\u00f3n sobre IOS ser\u00e1 en pr\u00f3ximos art\u00edculos. Recomiendo siempre evaluar la situaci\u00f3n y basarse en las tareas: en algunos casos es m\u00e1s barato y efectivo utilizar nubes p\u00fablicas, mientras que en otros las plataformas de prueba definitivamente valen el dinero gastado.<\/p>\n<h3>Ilustraci\u00f3n del estado actual de la infraestructura<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/f68770c9e27677b9d762af574726c90e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Enlaces para estudiar<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/gcp\/\">GCP<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/docs\/instances\/preemptible\">GCP: Preemptible<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/vm-instance-pricing\">GCP: Precios de VM<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/saucelabs.com\/pricing\">SauceLabs<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.inovex.de\/blog\/comparing-cloud-providers\/\">Comparando Proveedores de Nube<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Herramientas Similares:<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/\">AWS<\/a><\/noindex>\u00a0<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/azure.microsoft.com\/en-us\/\">Azure<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2>6. Orquestaci\u00f3n<\/h2>\n<p><\/p>\n<h3>Descripci\u00f3n breve de la tecnolog\u00eda<\/h3>\n<p>\n Tengo buenas noticias: \u00a1estamos casi al final del art\u00edculo! En este momento, nuestra infraestructura de automatizaci\u00f3n consiste en pruebas web y de Android que ejecutamos a trav\u00e9s de GitLab CI en paralelo, utilizando herramientas que soportan Docker: Selenium grid y Selenoid. Adem\u00e1s, utilizamos m\u00e1quinas virtuales creadas a trav\u00e9s de GCP para levantar contenedores con navegadores y emuladores. Para reducir costos, solo ejecutamos estas m\u00e1quinas virtuales bajo demanda y las detenemos cuando no se realizan pruebas. \u00bfHay algo m\u00e1s que pueda mejorar nuestra infraestructura? \u00a1La respuesta es s\u00ed! \u00a1Damos la bienvenida a Kubernetes (K8s)!<\/p>\n<p>Primero, analicemos c\u00f3mo las palabras orquestaci\u00f3n, cl\u00faster y Kubernetes est\u00e1n interrelacionadas. A alto nivel, la orquestaci\u00f3n es un sistema que despliega y gestiona aplicaciones. Para la automatizaci\u00f3n de pruebas, estas aplicaciones contenerizadas son Selenium grid y Selenoid. Docker y K8s se complementan entre s\u00ed. Docker se utiliza para desplegar aplicaciones, mientras que K8s es para la orquestaci\u00f3n. A su vez, K8s es un cl\u00faster. La tarea del cl\u00faster es utilizar VMs como nodos, lo que permite instalar diversas funcionalidades, programas y servicios dentro de un mismo servidor (cl\u00faster). Si alguna de las nodos falla, otras nodos asumir\u00e1n, lo que garantiza la operaci\u00f3n ininterrumpida de nuestra aplicaci\u00f3n. Adem\u00e1s, K8s tiene una funcionalidad importante relacionada con el escalado (scaling), permitiendo que autom\u00e1ticamente obtengamos la cantidad \u00f3ptima de recursos seg\u00fan la carga y las limitaciones establecidas.<\/p>\n<p>La verdad es que desplegar Kubernetes manualmente desde cero es una tarea bastante complicada. Dejar\u00e9 un enlace a una conocida gu\u00eda pr\u00e1ctica, \"Kubernetes The Hard Way\", y si te interesa, puedes practicar. Pero, afortunadamente, existen m\u00e9todos e herramientas alternativas. La m\u00e1s sencilla es usar Google Kubernetes Engine (GKE) en GCP, lo que permitir\u00e1 obtener un cl\u00faster listo despu\u00e9s de unos pocos clics. Para comenzar a aprender, recomiendo seguir este enfoque, ya que te permitir\u00e1 enfocarte en c\u00f3mo utilizar K8s para tus tareas en lugar de investigar c\u00f3mo deben integrarse internamente los componentes.\u00a0<\/p>\n<h3>Valor para la infraestructura de automatizaci\u00f3n<\/h3>\n<p>\nVeamos algunas funciones significativas que ofrece K8s:<\/p>\n<ul>\n<li>despliegue de la aplicaci\u00f3n: uso de un cl\u00faster de m\u00faltiples nodos, en lugar de VMs;<\/li>\n<li>escalamiento din\u00e1mico: reduce los gastos en recursos que se utilizan solo bajo demanda;<\/li>\n<li>auto-recuperaci\u00f3n (Self-healing): recuperaci\u00f3n autom\u00e1tica de pods (lo que restaura tambi\u00e9n los contenedores);<\/li>\n<li>implementaci\u00f3n de actualizaciones y retrocesos sin tiempo de inactividad: la actualizaci\u00f3n de herramientas, navegadores y emuladores no interrumpe el trabajo de los usuarios actuales.<\/li>\n<\/ul>\n<p>\n Pero K8s a\u00fan no es una soluci\u00f3n milagrosa. Para entender todos los beneficios y limitaciones en el contexto de las herramientas que estamos considerando (Selenium grid, Selenoid), discutamos brevemente la estructura de K8s. El cl\u00faster contiene dos tipos de Nodos: Nodos Maestros y Nodos Trabajadores. Los Nodos Maestros son responsables de la gesti\u00f3n, el despliegue y las decisiones de programaci\u00f3n. Los Nodos Trabajadores son donde las aplicaciones est\u00e1n en ejecuci\u00f3n. Los Nodos tambi\u00e9n contienen el entorno de ejecuci\u00f3n de contenedores. En nuestro caso, es Docker, que se encarga de las operaciones relacionadas con los contenedores. Pero tambi\u00e9n hay soluciones alternativas, como<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/containerd\/containerd\"> containerd<\/a><\/noindex>. Es importante entender que el escalamiento o la auto-recuperaci\u00f3n no se aplica directamente a los contenedores. Esto se implementa mediante la adici\u00f3n\/reducci\u00f3n del n\u00famero de pods, que a su vez contienen contenedores (generalmente un contenedor por pod, pero dependiendo de la tarea puede haber m\u00e1s). La jerarqu\u00eda de alto nivel representa los nodos trabajadores, dentro de los cuales est\u00e1n los pods, y dentro de los cuales se ejecutan los contenedores.<\/p>\n<p>La funci\u00f3n de escalado es clave y se puede aplicar tanto a los nodos dentro del grupo de nodos del cl\u00faster como a los pods dentro del nodo. Existen dos tipos de escalado que se aplican tanto a los nodos como a los pods. El primer tipo es el escalado horizontal, que se produce mediante el aumento del n\u00famero de nodos\/pods. Este tipo es m\u00e1s preferido. El segundo tipo, por lo tanto, es el escalado vertical. El escalado se lleva a cabo aumentando el tama\u00f1o de los nodos\/pods en lugar de su cantidad.<\/p>\n<p>Ahora consideremos nuestras herramientas en el contexto de los t\u00e9rminos mencionados anteriormente.<\/p>\n<p><u>Selenium grid<\/u><\/p>\n<p>Como se mencion\u00f3 anteriormente, Selenium grid es una herramienta muy popular, y no es sorprendente que haya sido contenedorizada. Por lo tanto, no sorprende que Selenium grid se pueda implementar en K8s. Un ejemplo de c\u00f3mo hacerlo se puede encontrar en el repositorio oficial de K8s. Como de costumbre, adjunto enlaces al final de la secci\u00f3n. Adem\u00e1s, en la gu\u00eda pr\u00e1ctica se muestra c\u00f3mo hacerlo a trav\u00e9s de Terraform. Tambi\u00e9n hay instrucciones sobre c\u00f3mo escalar el n\u00famero de pods que contienen contenedores con navegadores. Pero la funci\u00f3n de escalado autom\u00e1tico en el contexto de K8s sigue siendo una tarea a\u00fan no completamente clara. Cuando comenc\u00e9 a estudiar, no encontr\u00e9 ninguna gu\u00eda pr\u00e1ctica o recomendaciones. Despu\u00e9s de varias investigaciones y experimentos con el apoyo del equipo de DevOps, elegimos el enfoque de levantar contenedores con los navegadores necesarios dentro de un pod, que se encuentra dentro de un nodo trabajador. Este m\u00e9todo nos permite aplicar la estrategia de escalado horizontal de nodos aumentando su n\u00famero. Espero que en el futuro la situaci\u00f3n cambie y veamos m\u00e1s y m\u00e1s descripciones de los mejores enfoques y soluciones listas, especialmente despu\u00e9s del lanzamiento de Selenium grid 4 con la arquitectura interna modificada.<\/p>\n<p><u>Selenoid<\/u>:<\/p>\n<p>Actualmente, desplegar Selenoid en K8s es la mayor decepci\u00f3n. No son compatibles. Te\u00f3ricamente, podemos levantar un contenedor de Selenoid dentro de un pod, pero cuando Selenoid comience a ejecutar contenedores con navegadores, seguir\u00e1n estando dentro de ese mismo pod. Esto hace imposible el escalado y, como resultado, el funcionamiento de Selenoid dentro del cl\u00faster no ser\u00e1 diferente del funcionamiento dentro de una m\u00e1quina virtual. Fin de la historia.<\/p>\n<p><u>Moon<\/u>:<\/p>\n<p>Sabiendo esto, los desarrolladores lanzaron una herramienta m\u00e1s potente llamada Moon. Esta herramienta fue concebida originalmente para trabajar con Kubernetes y, como resultado, se puede y debe utilizar la funci\u00f3n de autoescalado. Adem\u00e1s, dir\u00eda que en este momento es <u>la \u00fanica<\/u> la herramienta m\u00e1s potente en el mundo de Selenium, que viene con soporte nativo para cl\u00fasteres de K8s (<i>ya no, ver la siguiente herramienta <\/i>). La caracter\u00edstica clave de Moon, que proporciona este soporte, es la siguiente:\u00a0<\/p>\n<blockquote><p>Completamente sin estado. Selenoid almacena en memoria informaci\u00f3n sobre las sesiones de navegador que se est\u00e1n ejecutando actualmente. Si por alguna raz\u00f3n su proceso se bloquea, se pierden todas las sesiones en ejecuci\u00f3n. Moon, en cambio, no tiene estado interno y puede ser replicado en centros de datos. Las sesiones de navegador permanecen activas incluso si una o m\u00e1s r\u00e9plicas fallan.<\/p><\/blockquote>\n<p>As\u00ed que Moon es una soluci\u00f3n impresionante, pero con un problema: no es gratuita. El precio depende del n\u00famero de sesiones. Se pueden ejecutar de forma gratuita solo de 0 a 4 sesiones, lo cual no es muy \u00fatil. Pero, a partir de la quinta sesi\u00f3n, hay que pagar $5 por cada una. La situaci\u00f3n puede variar de una empresa a otra, pero en nuestro caso, el uso de Moon es innecesario. Como describ\u00ed anteriormente, podemos desplegar VMs con Selenium Grid seg\u00fan sea necesario o aumentar el n\u00famero de nodos en el cl\u00faster. Aproximadamente, para un pipeline activamos 500 navegadores y detenemos todos los recursos despu\u00e9s de finalizar las pruebas. Si hubi\u00e9ramos usado Moon, tendr\u00edamos que pagar 500 x 5 = 2500 $ al mes, sin importar cu\u00e1n frecuentemente ejecutemos las pruebas. Y de nuevo, no estoy diciendo 'no uses Moon'. Para tus necesidades, podr\u00eda ser una soluci\u00f3n invaluable, por ejemplo, si tienes muchos proyectos\/equipos en la organizaci\u00f3n y necesitas un gran cl\u00faster com\u00fan para todos. Como siempre, dejo un enlace al final y recomiendo hacer todos los c\u00e1lculos necesarios en el contexto de tu tarea.<\/p>\n<p><u>Callisto<\/u>: (<i><strong>\u00a1Atenci\u00f3n! Esto no est\u00e1 en el art\u00edculo original y se encuentra solo en la traducci\u00f3n al ruso<\/strong><\/i>)<\/p>\n<p>Como mencion\u00e9, Selenium es una herramienta muy popular y el campo de TI est\u00e1 evolucionando r\u00e1pidamente. Mientras trabajaba en la traducci\u00f3n, apareci\u00f3 una nueva herramienta prometedora llamada Callisto (saludos a Cypress y otros competidores de Selenium). Funciona de manera nativa con K8s y permite ejecutar contenedores Selenoid en pods, distribuidos en Nodes. Todo funciona de inmediato, incluyendo la autoescalabilidad. Fant\u00e1stico, pero necesita pruebas. Ya he logrado implementar esta herramienta y realizar algunos experimentos. Pero a\u00fan es pronto para sacar conclusiones; despu\u00e9s de obtener resultados a largo plazo, posiblemente haga una revisi\u00f3n en pr\u00f3ximos art\u00edculos. Por ahora, solo dejo enlaces para investigaciones personales.\u00a0\u00a0<\/p>\n<h3>Ilustraci\u00f3n del estado actual de la infraestructura<\/p>\n<h3><img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/c9c2ffd21df2a261947df809dcec7108.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Enlaces para estudiar<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/setup\/\">Kubernetes: configuraci\u00f3n<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kelseyhightower\/kubernetes-the-hard-way\">Kubernetes: la manera dif\u00edcil<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/examples\/tree\/master\/staging\/selenium\">Kubernetes: Selenium<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/kubernetes-engine\">GCP: motor de Kubernetes<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/aerokube.com\/moon\/latest\/\">Moon<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Kubernetes-Book-Version-November-2018-ebook\/dp\/B072TS9ZQZ\/ref=pd_sim_351_1\/147-1129855-1615632?_encoding=UTF8&amp;pd_rd_i=B072TS9ZQZ&amp;pd_rd_r=489f0d27-dd2c-4e33-b23c-a420affcba5d&amp;pd_rd_w=HLjs5&amp;pd_rd_wg=eGbU7&amp;pf_rd_p=bab57536-7c8f-4781-a8ed-3e270b9cd303&amp;pf_rd_r=G71DN3V8127KHPXQ6JFN&amp;psc=1&amp;refRID=G71DN3V8127KHPXQ6JFN\">El libro de Kubernetes<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=MmdGyqNqs9w\">Automatizaci\u00f3n distribuida usando Kubernetes<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/SeleniumHQ\/selenium\/wiki\/Selenium-Grid-4\">Selenium Grid 4<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wrike\/callisto\">Callisto GitHub<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/software-testing.ru\/events\/review\/3317-wrike-techclub\">Wrike TechClub (Callisto)<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Herramientas similares<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/get-started\/swarm-deploy\/\">Docker swarm<\/a><\/noindex>\u00a0<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/mesosphere.github.io\/marathon\/\">Marathon<\/a><\/noindex>\u00a0<\/li>\n<\/ul>\n<p><\/p>\n<h2>7. Infraestructura como c\u00f3digo (IaC)<\/h2>\n<p><\/p>\n<h3>Descripci\u00f3n breve de la tecnolog\u00eda<\/h3>\n<p>\n Y as\u00ed llegamos a la \u00faltima secci\u00f3n. Generalmente, esta tecnolog\u00eda y las tareas relacionadas no est\u00e1n bajo la responsabilidad de los ingenieros de automatizaci\u00f3n. Y hay razones para esto. En primer lugar, en muchas organizaciones, los problemas de infraestructura est\u00e1n bajo el control del departamento de DevOps, y el equipo de desarrollo no se preocupa mucho por lo que sostiene el pipeline y c\u00f3mo se debe mantener todo lo relacionado. En segundo lugar, seamos honestos, la pr\u00e1ctica de \"Infraestructura como c\u00f3digo (IaC)\" a\u00fan no se aplica en muchas empresas. Pero definitivamente se ha convertido en una tendencia popular y es importante intentar estar involucrado en los procesos, enfoques y herramientas relacionados. O, al menos, estar al tanto de lo que sucede.<\/p>\n<p>Empecemos con la motivaci\u00f3n para usar este enfoque. Ya hemos discutido que para ejecutar pruebas en GitlabCI necesitamos al menos recursos para ejecutar el Gitlab Runner. Y para iniciar contenedores con navegadores\/emuladores, debemos reservar una VM o un cl\u00faster. Adem\u00e1s de los recursos para pruebas, necesitamos una cantidad significativa de potencia para mantener los entornos de desarrollo, staging, producci\u00f3n, lo que tambi\u00e9n incluye bases de datos, horarios autom\u00e1ticos, configuraciones de red, balanceadores de carga, permisos de usuarios, etc. El problema clave radica en los esfuerzos requeridos para mantener todo esto. Hay varias maneras en que podemos realizar cambios y desplegar actualizaciones. Por ejemplo, en el contexto de GCP, podemos utilizar la consola de UI en el navegador y realizar todas las acciones haciendo clic en botones. Un m\u00e9todo alternativo podr\u00eda ser el uso de llamadas API para interactuar con entidades en la nube o el uso de la utilidad de l\u00ednea de comandos gcloud para realizar las manipulaciones necesarias. Pero con una cantidad realmente grande de diferentes entidades y elementos de infraestructura, se vuelve dif\u00edcil o incluso imposible realizar todas las operaciones manualmente. Adem\u00e1s, todas estas acciones manuales son incontroladas. No podemos enviarlas para revisi\u00f3n antes de su ejecuci\u00f3n, utilizar un sistema de control de versiones y revertir r\u00e1pidamente cambios que condujeron a un incidente. Para resolver tales problemas, los ingenieros han creado y siguen creando scripts autom\u00e1ticos en bash\/shell, lo que no es mucho mejor que los m\u00e9todos anteriores, ya que no son tan f\u00e1ciles de leer, entender, mantener y modificar r\u00e1pidamente en un estilo procedimental.<\/p>\n<p>En este art\u00edculo y gu\u00eda pr\u00e1ctica, utilizo dos herramientas relacionadas con la pr\u00e1ctica de IaC. Estas son Terraform y Ansible. Algunos creen que no tiene sentido usarlas al mismo tiempo, ya que sus funcionalidades son similares y son intercambiables. Sin embargo, el hecho es que inicialmente se les asignan tareas completamente diferentes. Y el hecho de que estas herramientas deber\u00edan complementarse fue confirmado en una presentaci\u00f3n conjunta por desarrolladores de HashiCorp y RedHat. La diferencia conceptual radica en que Terraform es una herramienta de aprovisionamiento para gestionar los propios servidores. Mientras que Ansible es una herramienta de gesti\u00f3n de configuraciones, encargada de instalar, configurar y gestionar el software en esos servidores.<\/p>\n<p>Otra caracter\u00edstica clave que distingue a estas herramientas es el estilo de escritura del c\u00f3digo. A diferencia de bash y Ansible, Terraform utiliza un estilo declarativo, basado en la descripci\u00f3n del estado final deseado que se debe alcanzar como resultado de su ejecuci\u00f3n. Por ejemplo, si estamos a punto de crear 10 VMs y aplicar cambios a trav\u00e9s de Terraform, obtendremos 10 VMs. Si aplicamos el script nuevamente, no suceder\u00e1 nada, ya que ya tenemos 10 VMs, y Terraform lo sabe porque almacena el estado actual de la infraestructura en un archivo de estado. En cambio, Ansible utiliza un enfoque procedural y, si le pedimos que cree 10 VMs, en la primera ejecuci\u00f3n obtendremos 10 VMs, de manera similar a Terraform. Pero tras una segunda ejecuci\u00f3n, ya tendremos 20 VMs. Esta es la importante diferencia. En el estilo procedural, no almacenamos el estado actual y simplemente describimos la secuencia de pasos que deben llevarse a cabo. Por supuesto, podemos manejar diversas situaciones, agregar algunas comprobaciones sobre la existencia de recursos y su estado actual, pero no tiene sentido gastar nuestro tiempo y esforzarnos en controlar esta l\u00f3gica. Adem\u00e1s, esto aumenta el riesgo de cometer errores.\u00a0<\/p>\n<p>Resumiendo todo lo anterior, se puede concluir que para el aprovisionamiento de servidores, la herramienta m\u00e1s adecuada es Terraform y la notaci\u00f3n declarativa. Por otro lado, el trabajo de gesti\u00f3n de configuraciones es mejor delegarlo a Ansible. Una vez aclarado esto, veamos ejemplos de uso en el contexto de la automatizaci\u00f3n.<\/p>\n<h3>Valor para la infraestructura de automatizaci\u00f3n<\/h3>\n<p>\n Aqu\u00ed es importante entender que la infraestructura de automatizaci\u00f3n de pruebas debe considerarse como parte de toda la infraestructura de la empresa. Eso significa que todas las pr\u00e1cticas de IaC deben aplicarse de manera global a los recursos de toda la organizaci\u00f3n. Qui\u00e9n es responsable de esto depende de sus procesos. El equipo de DevOps tiene m\u00e1s experiencia en estos temas, ya que ve la situaci\u00f3n en su totalidad. Sin embargo, los ingenieros de QA est\u00e1n m\u00e1s involucrados en el proceso de construcci\u00f3n de la automatizaci\u00f3n y la estructura del pipeline, lo que les permite identificar mejor todos los cambios necesarios y las oportunidades de mejora. La mejor opci\u00f3n es trabajar juntos, intercambiar conocimientos e ideas para lograr el resultado esperado.\u00a0<\/p>\n<p>Voy a dar algunos ejemplos del uso de Terraform y Ansible en el contexto de la automatizaci\u00f3n de pruebas y las herramientas que hemos discutido anteriormente:<\/p>\n<p>1. Describir a trav\u00e9s de Terraform las caracter\u00edsticas y par\u00e1metros necesarios de las VMs y cl\u00fasteres.<\/p>\n<p>2. Instalar con Ansible las herramientas necesarias para la prueba: docker, Selenoid, Selenium Grid y cargar las versiones necesarias de navegadores\/emuladores.<\/p>\n<p>3. Describir a trav\u00e9s de Terraform las caracter\u00edsticas de la VM en la que se ejecutar\u00e1 GitLab Runner.<\/p>\n<p>4. Instalar con Ansible GitLab Runner y las herramientas auxiliares necesarias, establecer configuraciones y ajustes.<\/p>\n<h3>Ilustraci\u00f3n del estado actual de la infraestructura<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/5d793a800a4ef62e181e6cb3a3f0544e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Enlaces para estudiar:<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/\">Terraform<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.ansible.com\/\">Ansible<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.hashicorp.com\/resources\/ansible-terraform-better-together\">Ansible y Terraform mejor juntos<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/blog.gruntwork.io\/a-comprehensive-guide-to-terraform-b3d32832baca\">Una Gu\u00eda Completa de Terraform<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/blog.gruntwork.io\/why-we-use-terraform-and-not-chef-puppet-ansible-saltstack-or-cloudformation-7989dad2865c\">Por qu\u00e9 usamos Terraform y no Chef, Puppet, Ansible, SaltStack o CloudFormation<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/solutions\/infrastructure-as-code\">GCP: IaC<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Herramientas similares<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.chef.io\/\">Chef<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/\">Puppet<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/saltstack.com\/\">SaltStack<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.vagrantup.com\/\">Vagrant<\/a><\/noindex><\/li>\n<\/ul>\n<h2>\u00a1Hagamos un resumen!<\/h2>\n<p><\/p>\n<p><strong>Paso<\/strong><br \/>\n<strong>Tecnolog\u00eda<\/strong><br \/>\n<strong>Ejecuci\u00f3n local (preparar pruebas de demostraci\u00f3n web \/ android y ejecutarlas localmente)<\/strong><br \/>\n<strong>Valor para la infraestructura de automatizaci\u00f3n<\/strong><\/p>\n<p><strong>1<\/strong><br \/>\nEjecuci\u00f3n local<br \/>\nSistemas de control de versiones<\/p>\n<ul>\n<li>Las herramientas m\u00e1s populares para web y m\u00f3vil<\/li>\n<li>Soporte para muchos lenguajes y plataformas (incluyendo Node.js)<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>2<\/strong><br \/>\nContenerizaci\u00f3n\u00a0<br \/>\nGit<\/p>\n<ul>\n<li>Ventajas similares con el c\u00f3digo de desarrollo<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>3<\/strong><br \/>\nDocker, Selenium grid, Selenoid (Web, Android)<br \/>\nCI \/ CD<\/p>\n<ul>\n<li>Ejecuci\u00f3n paralela de pruebas<\/li>\n<li>Entornos aislados<\/li>\n<li>Actualizaci\u00f3n de versiones simple y flexible<\/li>\n<li>Detenci\u00f3n din\u00e1mica de recursos no utilizados<\/li>\n<li>F\u00e1cil de configurar<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>4<\/strong><br \/>\nPlataformas en la nube<br \/>\nGitlab CI<\/p>\n<ul>\n<li>Las pruebas son parte del pipeline<\/li>\n<li>Retroalimentaci\u00f3n r\u00e1pida<\/li>\n<li>Visibilidad para toda la empresa\/equipo<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>5<\/strong><br \/>\nGoogle Cloud Platform<br \/>\nOrquestaci\u00f3n<\/p>\n<ul>\n<li>Recursos bajo demanda (pagamos solo cuando son necesarios)<\/li>\n<li>F\u00e1cil de administrar y actualizar<\/li>\n<li>Visibilidad y control de todos los recursos<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>6<\/strong><br \/>\nInfraestructura como c\u00f3digo (IaC)<br \/>\nKubernetes<br \/>\nEn el contexto de contenedores con navegadores\/emuladores dentro de pods:<\/p>\n<ul>\n<li>Escalamiento \/ escalado autom\u00e1tico<\/li>\n<li>Auto-recuperaci\u00f3n<\/li>\n<li>Actualizaciones y retrocesos sin interrupciones<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>7<\/strong><br \/>\nTerraform, Ansible<br \/>\nEstructura de cada secci\u00f3n<\/p>\n<ul>\n<li>Ventajas similares con la infraestructura de desarrollo<\/li>\n<li>Todas las ventajas del versionado del c\u00f3digo<\/li>\n<li>F\u00e1cil de realizar cambios y mantener<\/li>\n<li>Totalmente automatizado<\/li>\n<\/ul>\n<p><\/p>\n<h2>Diagramas de mapas mentales: la evoluci\u00f3n de la infraestructura<\/h2>\n<p>\npaso1: Local<br \/>\n<img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/507908ba097a603adc3b301ab2f94a8d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>paso2: VCS<br \/>\n<img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/71c5170293d98375d8ab86d05eb47a33.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>paso3: Contenerizaci\u00f3n\u00a0<br \/>\n<img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/da33442a592851e07c3f5800c3ee9ead.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>paso4: CI\/CD\u00a0<br \/>\n<img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/900f18b45124412a1ad00d3901efb40e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>paso5: Plataformas en la nube<br \/>\n<img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/840e5063141ac8787612e2fc46b5d690.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>paso6: Orquestaci\u00f3n<br \/>\n<img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/4651b552efdc893695cbf359c6992e9e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>paso7: IaC<br \/>\n<img decoding=\"async\" alt=\"Las herramientas de DevOps no son solo para DevOps. El proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero.\" src=\"\/wp-content\/uploads\/2020\/04\/e784130f570260fc6c3aa263916e3db5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>\u00bfQu\u00e9 sigue?<\/h2>\n<p>\nAs\u00ed que este es el final del art\u00edculo. Pero en conclusi\u00f3n, me gustar\u00eda establecer algunos acuerdos con usted.<\/p>\n<p><u>De su parte<\/u><br \/>\n Como se mencion\u00f3 al principio, me gustar\u00eda que el art\u00edculo fuera de utilidad pr\u00e1ctica y le ayudara a aplicar los conocimientos adquiridos en el trabajo real. Agrego nuevamente<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeyAltunin\/devops-tools-for-qa-automation-infrastructure\"> el enlace a la gu\u00eda pr\u00e1ctica<\/a><\/noindex>.<\/p>\n<p>Pero incluso despu\u00e9s de esto, no se detenga, practique, explore los enlaces relevantes y libros, descubra c\u00f3mo esto funciona en su empresa, encuentre \u00e1reas que se puedan mejorar y participe en ello. \u00a1Buena suerte!<\/p>\n<p><u>De mi parte<\/u><\/p>\n<p>Del t\u00edtulo se puede ver que esta fue solo la primera parte. A pesar de que fue bastante extensa, a\u00fan hay temas importantes que no se han abordado aqu\u00ed. En la segunda parte, planeo discutir la infraestructura de automatizaci\u00f3n en el contexto de iOS. Debido a las restricciones de Apple en relaci\u00f3n al lanzamiento de simuladores de iOS solo en sistemas macOS, nuestras soluciones se ven limitadas. Por ejemplo, no tenemos la posibilidad de usar Docker para ejecutar simuladores o nubes p\u00fablicas para ejecutar m\u00e1quinas virtuales. Pero eso no significa que no existan otras alternativas. \u00a1Intentar\u00e9 mantenerlos informados sobre soluciones avanzadas y herramientas modernas!<\/p>\n<p>Tampoco mencion\u00e9 temas bastante grandes relacionados con la supervisi\u00f3n. En la parte 3, planeo revisar las herramientas m\u00e1s populares para la supervisi\u00f3n de infraestructura, as\u00ed como qu\u00e9 datos y m\u00e9tricas deben tenerse en cuenta.<\/p>\n<p>Y por \u00faltimo. En el futuro planeo lanzar un curso en video sobre la creaci\u00f3n de infraestructura de prueba y herramientas populares. Actualmente, hay muchos cursos y conferencias sobre DevOps en Internet, pero todo el material se presenta en el contexto del desarrollo, no de la automatizaci\u00f3n de pruebas. En este asunto, realmente necesito comentarios, si a la comunidad de testers y automatizadores les interesar\u00eda y ser\u00eda valioso tal curso. \u00a1Gracias de antemano!<\/h3>\n<\/h3>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497918\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0427\u0430\u0441\u0442\u044c 1: Web \/ Android \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438\u00a0\u00abDevOps tools are not only for DevOps. Building test automation infrastructure from scratch\u00bb. \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u0441\u0435 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u0441\u0441\u044b\u043b\u043a\u0438, \u0446\u0438\u0442\u0430\u0442\u044b \u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043c\u044b\u0441\u043b\u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a. \u0416\u0435\u043b\u0430\u044e \u0432\u0430\u043c \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f! \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":78677,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-78676","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0427\u0430\u0441\u0442\u044c 1: Web \/ Android \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438\" \/>\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\/devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya\" \/>\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\udd47DevOps \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f DevOps. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043d\u0443\u043b\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0427\u0430\u0441\u0442\u044c 1: Web \/ Android \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya\" \/>\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-04-21T05:42:22+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-21T05:42:22+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\udd47 Herramientas DevOps no solo para DevOps. Proceso de construcci\u00f3n de infraestructura de automatizaci\u00f3n de pruebas desde cero | ProHoster","description":"Parte 1: Web \/ Android Nota: este art\u00edculo es una traducci\u00f3n al espa\u00f1ol del art\u00edculo original","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya","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\udd47DevOps \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f DevOps. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043d\u0443\u043b\u044f | ProHoster","og:description":"\u0427\u0430\u0441\u0442\u044c 1: Web \/ Android \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/devops-instrumenty-ne-tolko-dlya-devops-proczess-postroeniya-infrastruktury-avtomatizaczii-testirovaniya-s-nulya","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-04-21T05:42:22+00:00","article:modified_time":"2020-04-21T05:42:22+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"78676","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 16:53:59","updated":"2022-10-05 06:14:03","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\/78676","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=78676"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/78676\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/78677"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=78676"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=78676"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=78676"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}