{"id":8452,"date":"2022-06-07T09:27:32","date_gmt":"2022-06-07T07:27:32","guid":{"rendered":"https:\/\/geko.cloud\/?p=8452"},"modified":"2022-06-07T09:29:52","modified_gmt":"2022-06-07T07:29:52","slug":"dynamic-nodes-in-jenkins-via-aws-spot-fleet","status":"publish","type":"post","link":"https:\/\/geko.cloud\/en\/dynamic-nodes-in-jenkins-via-aws-spot-fleet\/","title":{"rendered":"Dynamic nodes in Jenkins via AWS Spot Fleet"},"content":{"rendered":"<h3>Dynamic nodes in Jenkins via AWS Spot Fleet<\/h3>\n<p>Provisionar nodos slave de jenkins din\u00e1micamente gracias a aws spot fleet<\/p>\n<p>A few weeks ago, a customer contacted us. His request was simple: What can we do to further optimize our automated CI\/CD process in Jenkins?<\/p>\n<p>After assesing the needs and the current infrastructure of the client, we decided to change the current paradigm in terms of task execution. Until now <a href=\"https:\/\/www.jenkins.io\/\" target=\"_blank\" rel=\"noopener\"><strong>Jenkins<\/strong><\/a> executed the tasks in its main node (the machine where Jenkins is running), by changing this paradigm to one based on dynamic provisioning of subordinate nodes we would gain the following benefits:<\/p>\n<ul>\n<li>Cost savings &#8211; By moving all the computational effort away from the main node. It can be hosted on a lower performance machine, reducing the overall cost of our infrastructure. The subordinate nodes would only be running during the execution of a task, also saving money while no task is running.<\/li>\n<li>Security &#8211; As we will not execute any code on the main node, we ensure the system\u2019s integrity even if the code has been compromised, and since it is only executed on an ephemeral instance the attacker will be isolated.<\/li>\n<li>Performance &#8211; The subordinate node exists only to execute the task and can dedicate all of the node&#8217;s resources to it.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2>Requirements<\/h2>\n<p>For this change, we will perform the following tasks:<\/p>\n<ul>\n<li>Spot Fleet creation in AWS<\/li>\n<li>Installation and configuration of the Jenkins plugin<\/li>\n<li>Jenkinsfile adaptation<\/li>\n<\/ul>\n<p>For this publication we will make the following assumptions:<\/p>\n<ul>\n<li>We have an AWS account already set up<\/li>\n<li>We host Jenkins on an EC2 server<\/li>\n<li>We have knowledge of some basic Jenkins and AWS concepts<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">That said, let&#8217;s get down to business.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>In this article on &#8220;Dynamic nodes in Jenkins via AWS Spot Fleet&#8221; we will develop all the necessary steps to obtain a good result.<\/p>\n<h2>Creation of launch template and spot fleet<\/h2>\n<p>An AWS Spot Fleet is nothing more than an AutoScaling Group of EC2 machines but with spot type instances &#8211; Amazon\u2019s surplus hardware that nobody is using and that AWS sells cheaper than usual. The first step will be to create the Launch Template that the Spot Fleet will use:<\/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>&nbsp;<\/p>\n<p>The important items to be filled in will be:<\/p>\n<ol>\n<li>Name and description<\/li>\n<li>AMI to use &#8211; For example Ubuntu 22<\/li>\n<li>Type of instance to use &#8211; Choose one according to your performance needs<\/li>\n<li>Key Pair &#8211; We will need to add it later in Jenkins<\/li>\n<li>Network &#8211; Use the same Subnet as Jenkins if possible<\/li>\n<li>Security Group &#8211; For the connection between nodes to be established, it is important that we give access to port 22 from the main node. The easiest way is to create a rule that allows access either from the IP of the main node (if we have a Elastic IP assigned) or from its Security Group<\/li>\n<li>Storage &#8211; Allocate the storage according to your needs<\/li>\n<li>User data &#8211; For the Jenkins worker to run on the subordinate node, we will need to install JRE, we also installed Docker as a requirement:<\/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>Once created we will have a Launch template similar to this one:<\/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>Now it is time to create the Spot fleet as such:<\/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>In this case, the items to be filled in are:<\/p>\n<ol>\n<li>Launch parameters &#8211; Select our Launch Template created above<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; Set total to 0 for now, as it will be controlled by the Jenkins plugin. Enable 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; Assign the VPC in which the main node is hosted<\/li>\n<li>Instance type requirements &#8211; Choose the desired instance types in Manually select instance types, a larger quantity gives a better pool from which to start Spot instances<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>And that&#8217;s it, we have created our Spot Fleet.<\/p>\n<p>&nbsp;<\/p>\n<h2>Installing and configuring the Jenkins plugin<\/h2>\n<p>Before installing the plugin, we will have to create and assign a new IAM role to the instance hosting the main node so that it will be able to manage our 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>Once this is done, we will install the<a href=\"https:\/\/plugins.jenkins.io\/ec2-fleet\/\" target=\"_blank\" rel=\"noopener\"><strong> ec2-fleet-plugin<\/strong><\/a> and configure it from Manage Jenkins &gt; Manage Nodes &gt; Configure Clouds &gt; Add New Cloud &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>Assign a name<\/li>\n<li>AWS Credentials &#8211; We leave this blank, since our machine already has the role described above.<\/li>\n<li>Region &#8211; Select the region in which we host our servers.<\/li>\n<li>EC2 Fleet &#8211;<strong> It will only appear when we assign the region and the role is assigned to the machine correct<\/strong>ly. Once filled in, we select our 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>Upload the Private key generated in the Launch template as <strong>SSH Username with private key<\/strong><\/li>\n<li>Private IP &#8211; Select if we want the main node to connect to the subordinate node using the private IP instead of the public one<\/li>\n<li>Always Reconnect &#8211; We recommend not to enable it, as Spot instances are ephemeral by nature<\/li>\n<li>Restrict Usage &#8211; Restrict the use of this Spot Fleet only to tasks that specify the assigned tag, regardless of the global Jenkins configuration<\/li>\n<li>Label &#8211; The label that identifies this node cloud, useful for assigning which tasks will be executed in the 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; The number of simultaneous jobs that each Spot Fleet instance will be able to host<\/li>\n<li>Max Idle Minutes Before Scaledown &#8211; The number of minutes Jenkins will keep an instance active with no pending tasks. <strong>If left at 0 Jenkins will never terminate instances, even if they are unused<\/strong><\/li>\n<li>Minimum\/Maximum cluster Size &#8211; The minimum and maximum quantity of instances we want the Spot fleet to have. Ideally, the minimum should be set to 0 to reduce costs<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">Once the configuration is saved, we will have a new section in the Jenkins dashboard, which indicates the current status of our Spot Fleet.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/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<h2>Jenkinsfile adaptation<\/h2>\n<p>Now that we have our Spot fleet configured, it is time to make some small changes so Jenkins uses this new type of nod. If we want it to be used systematically on a global level, we can disable the execution of tasks on the main node (the only other node in our case) from the node configuration screen.<\/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>If, on the other hand, we want certain tasks to be executed in the subordinate nodes, we will have to specify them at Jenkinsfile level, here is an example of how to do it:<\/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>&nbsp;<\/p>\n<p>With this last step, we are ready to execute any task on dynamically provisioned nodes within Spot Fleet instances.<\/p>\n<p>&nbsp;<\/p>\n<p>From Geko Consulting Cloud, we hope you liked this post and above all that you find it useful, nothing would make us happier.<br \/>\nWe invite you to contact us if you need information about the <a href=\"https:\/\/geko.cloud\/en\/\" target=\"_blank\" rel=\"noopener\"><strong>Cloud and DevOps<\/strong><\/a> world and keep checking <a href=\"https:\/\/geko.cloud\/en\/blog\/labs\/\" target=\"_blank\" rel=\"noopener\"><strong>our blog<\/strong> <\/a>to find other useful publications.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dynamic nodes in Jenkins via AWS Spot Fleet Provisionar nodos slave de jenkins din\u00e1micamente gracias a aws spot fleet A few weeks ago, a customer contacted us. His request was simple: What can we do to further optimize our automated CI\/CD process in Jenkins? After assesing the needs and the current infrastructure of the client, [&hellip;]<\/p>\n","protected":false},"author":26,"featured_media":8451,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[67],"tags":[72,83],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Dynamic nodes in Jenkins via AWS Spot Fleet - Geko Cloud<\/title>\n<meta name=\"description\" content=\"Dynamic nodes in Jenkins via AWS Spot Fleet. A few weeks ago, a customer contacted us. His request was 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=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dynamic nodes in Jenkins via AWS Spot Fleet - Geko Cloud\" \/>\n<meta property=\"og:description\" content=\"Dynamic nodes in Jenkins via AWS Spot Fleet. A few weeks ago, a customer contacted us. His request was 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:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-06-07T07:29:52+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\":\"Dynamic nodes in Jenkins via AWS Spot Fleet\",\"datePublished\":\"2022-06-07T07:27:32+00:00\",\"dateModified\":\"2022-06-07T07:29:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/\"},\"wordCount\":1151,\"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\":\"en-US\",\"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\":\"Dynamic nodes in Jenkins via 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:32+00:00\",\"dateModified\":\"2022-06-07T07:29:52+00:00\",\"description\":\"Dynamic nodes in Jenkins via AWS Spot Fleet. A few weeks ago, a customer contacted us. His request was simple...\",\"breadcrumb\":{\"@id\":\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@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\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dynamic nodes in Jenkins via 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\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/geko.cloud\/es\/#organization\",\"name\":\"Geko Cloud\",\"url\":\"https:\/\/geko.cloud\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@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\":\"en-US\",\"@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":"Dynamic nodes in Jenkins via AWS Spot Fleet - Geko Cloud","description":"Dynamic nodes in Jenkins via AWS Spot Fleet. A few weeks ago, a customer contacted us. His request was 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":"en_US","og_type":"article","og_title":"Dynamic nodes in Jenkins via AWS Spot Fleet - Geko Cloud","og_description":"Dynamic nodes in Jenkins via AWS Spot Fleet. A few weeks ago, a customer contacted us. His request was 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:32+00:00","article_modified_time":"2022-06-07T07:29:52+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":"Dynamic nodes in Jenkins via AWS Spot Fleet","datePublished":"2022-06-07T07:27:32+00:00","dateModified":"2022-06-07T07:29:52+00:00","mainEntityOfPage":{"@id":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/"},"wordCount":1151,"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":"en-US","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":"Dynamic nodes in Jenkins via 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:32+00:00","dateModified":"2022-06-07T07:29:52+00:00","description":"Dynamic nodes in Jenkins via AWS Spot Fleet. A few weeks ago, a customer contacted us. His request was simple...","breadcrumb":{"@id":"https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/geko.cloud\/es\/nodos-dinamicos-en-jenkins-via-aws-spot-fleet\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@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\/en\/"},{"@type":"ListItem","position":2,"name":"Dynamic nodes in Jenkins via 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":"en-US"},{"@type":"Organization","@id":"https:\/\/geko.cloud\/es\/#organization","name":"Geko Cloud","url":"https:\/\/geko.cloud\/es\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@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":"en-US","@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\/en\/wp-json\/wp\/v2\/posts\/8452"}],"collection":[{"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/users\/26"}],"replies":[{"embeddable":true,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/comments?post=8452"}],"version-history":[{"count":8,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/posts\/8452\/revisions"}],"predecessor-version":[{"id":8484,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/posts\/8452\/revisions\/8484"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/media\/8451"}],"wp:attachment":[{"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/media?parent=8452"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/categories?post=8452"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/tags?post=8452"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}