{"id":8406,"date":"2022-06-07T09:27:14","date_gmt":"2022-06-07T07:27:14","guid":{"rendered":"https:\/\/geko.cloud\/?p=8406"},"modified":"2022-07-28T09:34:48","modified_gmt":"2022-07-28T07:34:48","slug":"nodos-dinamicos-en-jenkins-via-aws-spot-fleet","status":"publish","type":"post","link":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/","title":{"rendered":"Nodos din\u00e1micos en Jenkins v\u00eda AWS Spot Fleet"},"content":{"rendered":"<h3>Nodos din\u00e1micos en Jenkins <span style=\"font-size: 18.72px;\">v\u00eda<\/span> AWS Spot Fleet<\/h3>\n<p>Provisionar nodos slave de jenkins din\u00e1micamente gracias a aws spot fleet.<\/p>\n<p>Hace unas semanas, un cliente contact\u00f3 con el equipo de Geko Cloud. Su petici\u00f3n era simple: \u00bfQu\u00e9 podemos hacer para optimizar a\u00fan m\u00e1s nuestro proceso automatizado de CI\/CD en Jenkins?<\/p>\n<p>Tras estudiar cuidadosamente las necesidades y la infraestructura actual del cliente, nos decidimos por cambiar de paradigma en cuanto a ejecuci\u00f3n de tareas se refiere. Hasta ahora <strong><a href=\"https:\/\/www.jenkins.io\/\" target=\"_blank\" rel=\"noopener\">Jenkins<\/a> <\/strong>ejecutaba las tareas en su nodo principal (La m\u00e1quina en la que se est\u00e1 ejecutando Jenkins), al cambiar este paradigma a uno basado en el aprovisionamiento din\u00e1mico de nodos subordinados ganar\u00edamos los siguientes beneficios:<\/p>\n<ul>\n<li>Ahorro de costes &#8211; Al mover todo el esfuerzo computacional de la compilaci\u00f3n fuera del nodo principal. Este puede estar alojado en una maquina de menor rendimiento, y por lo tanto menor coste. Los nodos subordinados solo estar\u00edan en funcionamiento durante la ejecuci\u00f3n de una tarea, ahorrando tambi\u00e9n dinero mientras no se ejecuta ninguna tarea.<\/li>\n<li>Seguridad &#8211; Al no ejecutar ning\u00fan tipo de c\u00f3digo en el nodo principal, aseguramos su integridad aunque el c\u00f3digo haya sido comprometido, y como este solo se ejecuta en una instancia ef\u00edmera el atacante estar\u00e1 aislado.<\/li>\n<li>Rendimiento &#8211; El nodo subordinado existe solamente para ejecutar la tarea y puede dedicar todos los recursos del nodo para ella.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2><strong>Requisitos<\/strong><\/h2>\n<p>Para este cambio, realizaremos las siguientes tareas:<\/p>\n<ul>\n<li>Creaci\u00f3n de Spot Fleet en AWS<\/li>\n<li>Instalaci\u00f3n y configuraci\u00f3n del plugin de Jenkins<\/li>\n<li>Adaptaci\u00f3n de Jenkinsfile<\/li>\n<\/ul>\n<p>Para esta publicaci\u00f3n haremos las siguientes suposiciones:<\/p>\n<ul>\n<li>Contamos con una cuenta de AWS configurada<\/li>\n<li>Alojamos Jenkins en un servidor EC2<\/li>\n<li>Contamos con conocimiento sobre algunos conceptos base de Jenkins y AWS<\/li>\n<\/ul>\n<p>Dicho esto, pong\u00e1monos manos a la obra.<\/p>\n<p>&nbsp;<\/p>\n<p>En este art\u00edculo sobre \u00abNodos din\u00e1micos en Jenkins v\u00eda AWS Spot Fleet\u00bb desarrollaremos todos los pasos necesarios para poder obtener un buen resultado.<\/p>\n<h3><strong>Creaci\u00f3n de launch template y spot fleet<\/strong><\/h3>\n<p>Un Spot Fleet de AWS no es m\u00e1s que un AutoScaling Group de m\u00e1quinas EC2 pero con instancias de tipo spot &#8211; excedente de Amazon que nadie est\u00e1 usando y que AWS deja a un precio econ\u00f3mico. El primer paso consistir\u00e1 en la creaci\u00f3n de el Launch Template que utilizara el Spot Fleet:<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-8409 aligncenter\" src=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-0.png\" alt=\"\" width=\"795\" height=\"413\" srcset=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-0.png 1541w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-0-300x156.png 300w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-0-1024x532.png 1024w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-0-768x399.png 768w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-0-1536x797.png 1536w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><\/p>\n<p>Los puntos importantes a rellenar ser\u00e1n:<\/p>\n<ol>\n<li>Nombre y descripci\u00f3n<\/li>\n<li>AMI a usar &#8211; Por ejemplo Ubuntu 22<\/li>\n<li>Tipo de instancia a usar &#8211; Elegir una adecuada al desempe\u00f1o<\/li>\n<li>Key Pair &#8211; Lo necesitaremos introducir mas adelante en Jenkins<\/li>\n<li>Network &#8211; Utilizar la misma Subnet que Jenkins si es posible<\/li>\n<li>Security Group &#8211; Para que se establezca la conexi\u00f3n entre nodos, es importante que demos acceso al puerto 22 desde el nodo principal. La manera mas f\u00e1cil es crear una regla que permita el acceso o bien desde la IP del nodo principal (Si la tenemos est\u00e1tica) o desde su Security Group<\/li>\n<li>Storage &#8211; Asignar el almacenamiento que vayamos a necesitar<\/li>\n<li>User data &#8211; Para que el worker de Jenkins se ejecute en el nodo subordinado, tendremos que instalar JRE, nosotros adem\u00e1s instalamos Docker como requisito:<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;shell&quot;,&quot;mime&quot;:&quot;text\/x-sh&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:true,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">#!\/bin\/bash\r\n# Install docker\r\napt-get update\r\napt-get install -y apt-transport-https ca-certificates curl software-properties-common\r\ncurl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo apt-key add -\r\nadd-apt-repository \\\r\n   \"deb [arch=amd64] https:\/\/download.docker.com\/linux\/ubuntu \\\r\n   $(lsb_release -cs) \\\r\n   stable\"\r\napt-get update\r\napt-get install -y docker-ce\r\nusermod -aG docker ubuntu\r\n\r\n# Install docker-compose\r\ncurl -L https:\/\/github.com\/docker\/compose\/releases\/download\/1.21.0\/docker-compose-$(uname -s)-$(uname -m) -o \/usr\/local\/bin\/docker-compose\r\nchmod +x \/usr\/local\/bin\/docker-compose\r\n\r\n#Install JRE\r\nsudo apt install -y default-jre<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Una vez creado tendremos un Launch template parecido a este:<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8413\" src=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-2.png\" alt=\"\" width=\"795\" height=\"501\" srcset=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-2.png 1543w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-2-300x189.png 300w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-2-1024x646.png 1024w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-2-768x484.png 768w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-2-1536x969.png 1536w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Ahora es momento de crear el Spot fleet como tal:<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8411\" src=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-1.png\" alt=\"\" width=\"795\" height=\"383\" srcset=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-1.png 1407w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-1-300x144.png 300w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-1-1024x493.png 1024w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-1-768x370.png 768w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>En este caso, los puntos a rellenar son:<\/p>\n<ol>\n<li>Launch parameters &#8211; Seleccionar nuestro Launch Template creado arriba<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8415\" src=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-3.png\" alt=\"\" width=\"795\" height=\"245\" srcset=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-3.png 1054w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-3-300x93.png 300w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-3-1024x316.png 1024w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-3-768x237.png 768w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><\/li>\n<li>Target Capacity &#8211; Asignar total a 0 por ahora, ya que lo controlar\u00e1 el plugin de Jenkins. Habilitar Maintain Target Capacity<img loading=\"lazy\" decoding=\"async\" class=\" wp-image-8417 aligncenter\" src=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-4.png\" alt=\"\" width=\"760\" height=\"388\" srcset=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-4.png 915w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-4-300x153.png 300w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-4-768x392.png 768w\" sizes=\"(max-width: 760px) 100vw, 760px\" \/><\/li>\n<li>Network &#8211; Asignar la VPC en la que est\u00e1 alojado el nodo principal<\/li>\n<li>Instance type requirements &#8211; Elegir los tipos de instancia deseados en Manually select instance types, una mayor cantidad da una mejor pool entre la que iniciar instancias Spot<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8419\" src=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-5.png\" alt=\"\" width=\"795\" height=\"347\" srcset=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-5.png 1060w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-5-300x131.png 300w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-5-1024x446.png 1024w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-5-768x335.png 768w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><\/li>\n<li>Allocation strategy &#8211; Capacity Optimized<\/li>\n<\/ol>\n<p>Y listo, ya tenemos creado nuestro Spot Fleet.<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Instalacion y configuracion del plugin de Jenkins<\/strong><\/h3>\n<p>Antes de instalar el plugin, tendremos que crear y asignar un nuevo rol de IAM a la instancia que aloja el nodo principal para que sea capaz de administrar nuestro Spot fleet:<\/p>\n<p>&nbsp;<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;javascript&quot;,&quot;mime&quot;:&quot;application\/json&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:true,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">{\r\n   \"Version\":\"2012-10-17\",\r\n   \"Statement\":[\r\n      {\r\n         \"Effect\":\"Allow\",\r\n         \"Action\":[\r\n            \"ec2:DescribeSpotFleetInstances\",\r\n            \"ec2:ModifySpotFleetRequest\",\r\n            \"ec2:CreateTags\",\r\n            \"ec2:DescribeRegions\",\r\n            \"ec2:DescribeInstances\",\r\n            \"ec2:TerminateInstances\",\r\n            \"ec2:DescribeInstanceStatus\",\r\n            \"ec2:DescribeSpotFleetRequests\"\r\n         ],\r\n         \"Resource\":\"*\"\r\n      },\r\n      {\r\n         \"Effect\":\"Allow\",\r\n         \"Action\":[\r\n            \"autoscaling:DescribeAutoScalingGroups\",\r\n            \"autoscaling:UpdateAutoScalingGroup\"\r\n         ],\r\n         \"Resource\":\"*\"\r\n      },\r\n      {\r\n         \"Effect\":\"Allow\",\r\n         \"Action\":[\r\n            \"iam:ListInstanceProfiles\",\r\n            \"iam:ListRoles\",\r\n            \"iam:PassRole\"\r\n         ],\r\n         \"Resource\":\"*\"\r\n      }\r\n   ]\r\n}<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Una vez hecho esto, instalaremos el plugin <a href=\"https:\/\/plugins.jenkins.io\/ec2-fleet\/\">ec2-fleet-plugin<\/a> y nos dirigiremos a configurar desde Administrar Jenkins &gt; Administrar nodos &gt; Configure Clouds &gt; A\u00f1adir nueva nube &gt; Amazon EC2 Fleet.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8425\" src=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-6.png\" alt=\"\" width=\"795\" height=\"429\" srcset=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-6.png 2102w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-6-300x162.png 300w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-6-1024x552.png 1024w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-6-768x414.png 768w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-6-1536x829.png 1536w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-6-2048x1105.png 2048w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><\/p>\n<p>&nbsp;<\/p>\n<ol>\n<li>Asignamos un nombre<\/li>\n<li>AWS Credentials &#8211; Lo dejamos en blanco, ya que nuestra maquina ya tiene el rol descrito m\u00e1s arriba<\/li>\n<li>Region &#8211; Seleccionamos la regi\u00f3n en la que alojamos nuestros servidores.<\/li>\n<li>EC2 Fleet &#8211; <b>Solo aparecer\u00e1 cuando asignemos la regi\u00f3n y el rol est\u00e9 asignado a la m\u00e1quina correctamente<\/b>. Una vez rellenado, seleccionamos nuestro Spot fleet<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8427\" src=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-7.png\" alt=\"\" width=\"795\" height=\"443\" srcset=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-7.png 2100w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-7-300x167.png 300w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-7-1024x571.png 1024w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-7-768x428.png 768w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-7-1536x856.png 1536w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-7-2048x1141.png 2048w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><\/li>\n<li>Subimos la Private key generada en el Launch template como <strong>SSH Username with private key<\/strong><\/li>\n<li>Private IP &#8211; Seleccionar si queremos que el nodo maestro se conecte al subordinado usando la IP privada en vez de la publica<\/li>\n<li>Always Reconnect &#8211; Recomendamos no habilitarlo, ya que las instancias Spot son ef\u00edmeras por naturaleza<\/li>\n<li>Restrict Usage &#8211; Restringir\u00e1 el uso de este Spot Fleet solo a tareas que indiquen la etiqueta asignada, indistintamente de la configuraci\u00f3n global de Jenkins<\/li>\n<li>Label &#8211; La etiqueta que identifica esta nube de nodos, \u00fatil para asignar qu\u00e9 tareas se ejecutar\u00e1n en el Fleet<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8429\" src=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-8.png\" alt=\"\" width=\"795\" height=\"287\" srcset=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-8.png 2074w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-8-300x108.png 300w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-8-1024x370.png 1024w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-8-768x278.png 768w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-8-1536x555.png 1536w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-8-2048x741.png 2048w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><\/li>\n<li>Number of executors &#8211; La cantidad de trabajos simult\u00e1neos que podr\u00e1 albergar cada instancia del Spot Fleet<\/li>\n<li>Max Idle Minutes Before Scaledown &#8211; La cantidad de minutos que Jenkins mantendr\u00e1 una instancia activa sin tareas pendientes. <strong>Si se deja a 0 Jenkins jam\u00e1s apagar\u00e1 instancias, aunque est\u00e9n sin uso<\/strong><\/li>\n<li>Minimum\/Maximum cluster Size &#8211; El tama\u00f1o m\u00ednimo y m\u00e1ximo de instancias que queremos que tenga el Spot fleet. Lo ideal es dejar el m\u00ednimo a 0 para abaratar costes<\/li>\n<\/ol>\n<p>Una vez guardada la configuraci\u00f3n, tendremos una nueva secci\u00f3n en el dashboard de Jenkins, que nos indica el estado actual de nuestro Spot Fleet.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-8431 aligncenter\" src=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-9.png\" alt=\"\" width=\"336\" height=\"349\" srcset=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-9.png 700w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-9-289x300.png 289w\" sizes=\"(max-width: 336px) 100vw, 336px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Adaptaci\u00f3n de Jenkinsfile<\/strong><\/h3>\n<p>Ahora que tenemos nuestro Spot fleet configurado, es hora de realizar unos peque\u00f1os cambios para que Jenkins use este nuevo tipo de nodo a su disposici\u00f3n. Si queremos que se use de manera sistem\u00e1tica a nivel global, podemos deshabilitar la ejecuci\u00f3n de tareas en el nodo principal (el \u00fanico otro nodo en nuestro caso) desde la pantalla de configuraci\u00f3n de nodos.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-8433\" src=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-10.png\" alt=\"\" width=\"795\" height=\"408\" srcset=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-10.png 1826w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-10-300x154.png 300w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-10-1024x526.png 1024w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-10-768x395.png 768w, https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Spot-10-1536x789.png 1536w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Si por el contrario, queremos que ciertas tareas sean las que se ejecuten en los nodos subordinados, tendremos que especificarlos a nivel de JenkinsFile, a continuaci\u00f3n un ejemplo de c\u00f3mo hacerlo:<\/p>\n<p>&nbsp;<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;groovy&quot;,&quot;mime&quot;:&quot;text\/x-groovy&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;lineWrapping&quot;:true,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">#!groovy\r\npipeline {\r\n\/\/Especificamos agente a nivel de Pipeline\r\n  agent {\r\n    label 'ec2-fleet'\r\n  }\r\n\r\n  stages {\r\n        stage('Test') {\r\n          agent {\r\n            dockerfile {\r\n              \/\/ Si usamos un agente en concreto, tendremos que volver a especificar la etiqueta\r\n              label 'ec2-fleet'\r\n              filename 'Dockerfile'\r\n              dir 'docker\/images\/tests'\r\n              args '-u root'\r\n            }\r\n          }\r\n          steps {\r\n            sh 'Hello World'\r\n          }\r\n        }\r\n  }\r\n}<\/pre>\n<\/div>\n<p>Con este \u00faltimo paso, estamos listos para ejecutar cualquier tarea en nodos provisionados din\u00e1micamente dentro de instancias Spot Fleet.<\/p>\n<p>&nbsp;<\/p>\n<p>Desde Geko Consultor\u00eda Cloud, esperamos que este post te hayan gustado y sobre todo que te resulten \u00fatiles, nada nos alegrar\u00eda m\u00e1s.<br \/>\nTe invitamos a que si necesitas informaci\u00f3n sobre el mundo <strong><a href=\"https:\/\/geko.cloud\/es\/\" target=\"_blank\" rel=\"noopener\">Cloud y DevOps<\/a><\/strong>, nos contactes y sigas revisando <strong><a href=\"https:\/\/geko.cloud\/es\/blog\/labs\/\" target=\"_blank\" rel=\"noopener\">nuestro blog<\/a><\/strong> para encontrar otras publicaciones \u00fatiles.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nodos din\u00e1micos en Jenkins v\u00eda AWS Spot Fleet Provisionar nodos slave de jenkins din\u00e1micamente gracias a aws spot fleet. Hace unas semanas, un cliente contact\u00f3 con el equipo de Geko Cloud. Su petici\u00f3n era simple: \u00bfQu\u00e9 podemos hacer para optimizar a\u00fan m\u00e1s nuestro proceso automatizado de CI\/CD en Jenkins? Tras estudiar cuidadosamente las necesidades y [&hellip;]<\/p>\n","protected":false},"author":26,"featured_media":8450,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[18],"tags":[34,54],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Nodos din\u00e1micos en Jenkins v\u00eda AWS Spot Fleet - Geko Cloud<\/title>\n<meta name=\"description\" content=\"Nodos dinamicos en Jenkins via AWS Spot Fleet. Hace unas semanas, un cliente contact\u00f3 con el equipo de Geko Cloud. Su petici\u00f3n era simple...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nodos din\u00e1micos en Jenkins v\u00eda AWS Spot Fleet - Geko Cloud\" \/>\n<meta property=\"og:description\" content=\"Nodos dinamicos en Jenkins via AWS Spot Fleet. Hace unas semanas, un cliente contact\u00f3 con el equipo de Geko Cloud. Su petici\u00f3n era simple...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/\" \/>\n<meta property=\"og:site_name\" content=\"Geko Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2022-06-07T07:27:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-07-28T07:34:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Copia-de-Copia-de-Copia-de-Diseno-sin-nombre-4-1-1-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1640\" \/>\n\t<meta property=\"og:image:height\" content=\"924\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Miguel\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@geko_cloud\" \/>\n<meta name=\"twitter:site\" content=\"@geko_cloud\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/\"},\"author\":{\"name\":\"Miguel\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/person\/c7f0713147f2b516b4dac9cff3908fc5\"},\"headline\":\"Nodos din\u00e1micos en Jenkins v\u00eda AWS Spot Fleet\",\"datePublished\":\"2022-06-07T07:27:14+00:00\",\"dateModified\":\"2022-07-28T07:34:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/\"},\"wordCount\":1199,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/geko.cloud\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Copia-de-Copia-de-Copia-de-Diseno-sin-nombre-4-1-1-1.png\",\"keywords\":[\"AWS\",\"Jenkins\"],\"articleSection\":[\"Labs\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/\",\"url\":\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/\",\"name\":\"Nodos din\u00e1micos en Jenkins v\u00eda AWS Spot Fleet - Geko Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/geko.cloud\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Copia-de-Copia-de-Copia-de-Diseno-sin-nombre-4-1-1-1.png\",\"datePublished\":\"2022-06-07T07:27:14+00:00\",\"dateModified\":\"2022-07-28T07:34:48+00:00\",\"description\":\"Nodos dinamicos en Jenkins via AWS Spot Fleet. Hace unas semanas, un cliente contact\u00f3 con el equipo de Geko Cloud. Su petici\u00f3n era simple...\",\"breadcrumb\":{\"@id\":\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#primaryimage\",\"url\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Copia-de-Copia-de-Copia-de-Diseno-sin-nombre-4-1-1-1.png\",\"contentUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Copia-de-Copia-de-Copia-de-Diseno-sin-nombre-4-1-1-1.png\",\"width\":1640,\"height\":924,\"caption\":\"Nodos din\u00e1micos en Jenkins via AWS Spot Fleet\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\/\/geko.cloud\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Nodos din\u00e1micos en Jenkins v\u00eda AWS Spot Fleet\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/geko.cloud\/es\/#website\",\"url\":\"https:\/\/geko.cloud\/es\/\",\"name\":\"Geko Cloud\",\"description\":\"Servicios de consultor\u00eda cloud y devops\",\"publisher\":{\"@id\":\"https:\/\/geko.cloud\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/geko.cloud\/es\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/geko.cloud\/es\/#organization\",\"name\":\"Geko Cloud\",\"url\":\"https:\/\/geko.cloud\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png\",\"contentUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png\",\"width\":1650,\"height\":809,\"caption\":\"Geko Cloud\"},\"image\":{\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/geko_cloud\",\"https:\/\/www.instagram.com\/gekocloud\/\",\"https:\/\/www.linkedin.com\/company\/gekocloud\",\"https:\/\/www.youtube.com\/channel\/UC5EFLCqUM7fEaXSa_0nWowQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/person\/c7f0713147f2b516b4dac9cff3908fc5\",\"name\":\"Miguel\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c456c6a492f5e6d8210aadf28729f5a8?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c456c6a492f5e6d8210aadf28729f5a8?s=96&d=mm&r=g\",\"caption\":\"Miguel\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Nodos din\u00e1micos en Jenkins v\u00eda AWS Spot Fleet - Geko Cloud","description":"Nodos dinamicos en Jenkins via AWS Spot Fleet. Hace unas semanas, un cliente contact\u00f3 con el equipo de Geko Cloud. Su petici\u00f3n era simple...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/","og_locale":"es_ES","og_type":"article","og_title":"Nodos din\u00e1micos en Jenkins v\u00eda AWS Spot Fleet - Geko Cloud","og_description":"Nodos dinamicos en Jenkins via AWS Spot Fleet. Hace unas semanas, un cliente contact\u00f3 con el equipo de Geko Cloud. Su petici\u00f3n era simple...","og_url":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/","og_site_name":"Geko Cloud","article_published_time":"2022-06-07T07:27:14+00:00","article_modified_time":"2022-07-28T07:34:48+00:00","og_image":[{"width":1640,"height":924,"url":"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Copia-de-Copia-de-Copia-de-Diseno-sin-nombre-4-1-1-1.png","type":"image\/png"}],"author":"Miguel","twitter_card":"summary_large_image","twitter_creator":"@geko_cloud","twitter_site":"@geko_cloud","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#article","isPartOf":{"@id":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/"},"author":{"name":"Miguel","@id":"https:\/\/geko.cloud\/es\/#\/schema\/person\/c7f0713147f2b516b4dac9cff3908fc5"},"headline":"Nodos din\u00e1micos en Jenkins v\u00eda AWS Spot Fleet","datePublished":"2022-06-07T07:27:14+00:00","dateModified":"2022-07-28T07:34:48+00:00","mainEntityOfPage":{"@id":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/"},"wordCount":1199,"commentCount":0,"publisher":{"@id":"https:\/\/geko.cloud\/es\/#organization"},"image":{"@id":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#primaryimage"},"thumbnailUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Copia-de-Copia-de-Copia-de-Diseno-sin-nombre-4-1-1-1.png","keywords":["AWS","Jenkins"],"articleSection":["Labs"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/","url":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/","name":"Nodos din\u00e1micos en Jenkins v\u00eda AWS Spot Fleet - Geko Cloud","isPartOf":{"@id":"https:\/\/geko.cloud\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#primaryimage"},"image":{"@id":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#primaryimage"},"thumbnailUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Copia-de-Copia-de-Copia-de-Diseno-sin-nombre-4-1-1-1.png","datePublished":"2022-06-07T07:27:14+00:00","dateModified":"2022-07-28T07:34:48+00:00","description":"Nodos dinamicos en Jenkins via AWS Spot Fleet. Hace unas semanas, un cliente contact\u00f3 con el equipo de Geko Cloud. Su petici\u00f3n era simple...","breadcrumb":{"@id":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#primaryimage","url":"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Copia-de-Copia-de-Copia-de-Diseno-sin-nombre-4-1-1-1.png","contentUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/2022\/05\/Copia-de-Copia-de-Copia-de-Diseno-sin-nombre-4-1-1-1.png","width":1640,"height":924,"caption":"Nodos din\u00e1micos en Jenkins via AWS Spot Fleet"},{"@type":"BreadcrumbList","@id":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/geko.cloud\/es\/"},{"@type":"ListItem","position":2,"name":"Nodos din\u00e1micos en Jenkins v\u00eda AWS Spot Fleet"}]},{"@type":"WebSite","@id":"https:\/\/geko.cloud\/es\/#website","url":"https:\/\/geko.cloud\/es\/","name":"Geko Cloud","description":"Servicios de consultor\u00eda cloud y devops","publisher":{"@id":"https:\/\/geko.cloud\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/geko.cloud\/es\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/geko.cloud\/es\/#organization","name":"Geko Cloud","url":"https:\/\/geko.cloud\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/","url":"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png","contentUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png","width":1650,"height":809,"caption":"Geko Cloud"},"image":{"@id":"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/geko_cloud","https:\/\/www.instagram.com\/gekocloud\/","https:\/\/www.linkedin.com\/company\/gekocloud","https:\/\/www.youtube.com\/channel\/UC5EFLCqUM7fEaXSa_0nWowQ"]},{"@type":"Person","@id":"https:\/\/geko.cloud\/es\/#\/schema\/person\/c7f0713147f2b516b4dac9cff3908fc5","name":"Miguel","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/geko.cloud\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c456c6a492f5e6d8210aadf28729f5a8?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c456c6a492f5e6d8210aadf28729f5a8?s=96&d=mm&r=g","caption":"Miguel"}}]}},"_links":{"self":[{"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/posts\/8406"}],"collection":[{"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/users\/26"}],"replies":[{"embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/comments?post=8406"}],"version-history":[{"count":11,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/posts\/8406\/revisions"}],"predecessor-version":[{"id":8630,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/posts\/8406\/revisions\/8630"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/media\/8450"}],"wp:attachment":[{"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/media?parent=8406"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/categories?post=8406"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/tags?post=8406"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}