<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: rodrigopztpedro900</title>
    <description>The latest articles on DEV Community by rodrigopztpedro900 (@rodrigopztpedro900).</description>
    <link>https://dev.to/rodrigopztpedro900</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F946156%2Fe6937921-4f3b-4553-b8b0-9f439e3633d6.png</url>
      <title>DEV Community: rodrigopztpedro900</title>
      <link>https://dev.to/rodrigopztpedro900</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rodrigopztpedro900"/>
    <language>en</language>
    <item>
      <title>Integración de Drone Autoscaler para un ahorro de costos y mejorar la experiencia de los devs</title>
      <dc:creator>rodrigopztpedro900</dc:creator>
      <pubDate>Tue, 18 Oct 2022 18:37:10 +0000</pubDate>
      <link>https://dev.to/rodrigopztpedro900/es-necesaria-la-integracion-del-autoscaler-de-drone-ci-43d8</link>
      <guid>https://dev.to/rodrigopztpedro900/es-necesaria-la-integracion-del-autoscaler-de-drone-ci-43d8</guid>
      <description>&lt;p&gt;La principal motivo para integrar el escalador automatico de drone es evitar la saturación de trabajos en la cola del drone y un ahorro de costos si decidimos trabajar con instancias Spot, pero antes de empezar&lt;br&gt;
&lt;strong&gt;¿Que es Drone?&lt;/strong&gt;&lt;br&gt;
Drone es una plataforma de entrega continua, simple y de código abierto que automatiza los flujos de trabajo de pruebas y lanzamiento. Está construido en Docker y escrito en Go.&lt;br&gt;
Lo mejor de drone es que se puede usar para multiples propositos como correr test, crear y subir containers a ECR, GCR, podemos correr migraciones, el cielo es el limite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Que necesitamos para usar Drone?&lt;/strong&gt;&lt;br&gt;
Principalmente una cuenta de Github, tambien podemos usar GitLab, Bitbucket, Gitea y algunos otros pero para este caso vamos a usar Github, el segundo requerimiento seria tener acceso a una cuenta de AWS con permisos para crear instancias EC2 y tener el docker instalado en nuestra maquina inicial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instalación del Drone&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Primero vamos a necesitar crear un OAuth Apps en Github&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Lv-ocaQb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/olkir2z4nq720nvp6zhc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Lv-ocaQb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/olkir2z4nq720nvp6zhc.png" alt="Image description" width="503" height="661"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos a necesitar el Client ID, Client secret y que el Homepage URL , Authorization callback URL apunten a la URL donde va a estar el drone.&lt;/p&gt;

&lt;p&gt;Luego vamos a AWS y levantamos una máquina Ec2, con una t3.small es suficiente, es este vamos a instalar docker, después de esto vamos a necesitar ejecutar este comando en nuestra instancia y debemos guardar la respuesta del comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openssl rand -hex 16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora si estamos listos para enviar nuestro comando para correr el drone-server, recuerda añadir un admin, el autoscaler requiere un token de usuario admin para poder conectarse al drone server, puede ser tu usuario de admin o también podemos &lt;a href="https://docs.drone.io/server/user/admin/"&gt;crear un nuevo usuario que tenga los mismos permisos.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo docker run \ 
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITHUB_CLIENT_ID=******************** \
  --env=DRONE_GITHUB_CLIENT_SECRET=**************************************** \
  --env=DRONE_RPC_SECRET=******************************** \
  --env=DRONE_SERVER_HOST=drone.organization.com \
  --env=DRONE_SERVER_PROTO=https \
  --env=DRONE_LOGS_DEBUG=true \
  --env=DRONE_TLS_AUTOCERT=true \
  --env=DRONE_USER_CREATE=username:yourgithubuser,admin:true \
  --publish=80:80 \
  --publish=443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;&lt;br&gt;
DRONE_GITHUB_CLIENT_ID: Id del OAuth Apps&lt;br&gt;
DRONE_GITHUB_CLIENT_SECRET: Secreto del OAuth Apps&lt;br&gt;
DRONE_RPC_SECRET: La respuesta del comando "openssl rand -hex 16"&lt;br&gt;
DRONE_USER_CREATE: Nuestro usuario de github&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nHfS2QMI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/czkw838w2eiuhyuffg9b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nHfS2QMI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/czkw838w2eiuhyuffg9b.png" alt="Image description" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si todo salió bien, al entrar al drone.organization.com debería retornarnos algo similar a esta vista.&lt;br&gt;
Podemos ir a la parte de user settings y usar nuestro token para el siguiente paso, pero también podemos crear nuevo usuario con privilegios de admin y usar su token&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G4A3kjvz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bp78u293050m9wug0rho.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G4A3kjvz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bp78u293050m9wug0rho.png" alt="Image description" width="837" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y ahora estamos listos para integrar el drone autoscaler, en la misma instancia que está corriendo el drone server vamos a  correr el drone autoscaler&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo docker run -d -v /var/lib/autoscaler:/data \
  -e DRONE_LOGS_DEBUG=true \
  -e DRONE_POOL_MIN=0 \
  -e DRONE_POOL_MAX=15 \
  -e DRONE_AMAZON_IAM_PROFILE_ARN=arn:aws:iam::************:instance-profile/drone-worker-role \
  -e DRONE_POOL_MIN_AGE=3m \
  -e DRONE_INTERVAL=30s \
  -e DRONE_SERVER_PROTO=https \
  -e DRONE_SERVER_HOST=drone.organization.com \
  -e DRONE_SERVER_TOKEN=******************************** \
  -e DRONE_AGENT_TOKEN=******************************** \
  -e DRONE_AMAZON_TAGS=Proyect:drone-autoscaler,ResourceType:ec2-instance-drone-autoscaler,Proyect-Environment:droneapp-all-environment \
  -e DRONE_AMAZON_IMAGE=ami-07dd19a7900a1f049 \
  -e DRONE_AMAZON_VOLUME_TYPE=gp3 \
  -e DRONE_AGENT_CONCURRENCY=2 \
  -e DRONE_TLS_AUTOCERT=true \
  -e DRONE_AMAZON_VOLUME_SIZE=100 \
  -e DRONE_AGENT_IMAGE=drone/drone-runner-docker:1.8.2 \
  -e DRONE_AGENT_ENVIRON=DRONE_LOGS_DEBUG=true,DRONE_RUNNER_CAPACITY=2,DRONE_DEBUG=true,DRONE_REGISTRY_ENDPOINT=true,DRONE_RUNNER_NAME=localhost,DRONE_RPC_SECRET=********************************,DRONE_LOGS_PRETTY=true,DRONE_RPC_HOST=drone.organization.com,DRONE_LOGS_TRACE=true,DRONE_RPC_PROTO=https,DRONE_REGISTRY_ENDPOINT=http://drone.organization.com:3000,DRONE_REGISTRY_SECRET=******************************** \
  -e DRONE_AMAZON_INSTANCE=z1d.xlarge \
  -e DRONE_AMAZON_REGION=us-west-2 \
  -e DRONE_AMAZON_SUBNET_ID=subnet-******** \
  -e DRONE_AMAZON_SECURITY_GROUP=sg-***************** \
  -e DRONE_AMAZON_SSHKEY=ssh_key \
  -e AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_ACCESS_KEY \
  -p 8080:8080 \
  --restart=always \
  --name=autoscaler \
  drone/autoscaler:1.8.2 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui dejo una pequeña descripción de cada variable&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DRONE_POOL_MIN: El mínimo de instancias activas&lt;br&gt;
DRONE_POOL_MAX: El máximo de instancias activas&lt;br&gt;
DRONE_INTERVAL: El intervalo de tiempo en el que se va a ir a revisar si hay algún proceso en la cola del drone&lt;br&gt;
DRONE_POOL_MIN_AGE: El tiempo que va a vivir una instancia sin uso&lt;br&gt;
DRONE_SERVER_TOKEN: El token de un usuario que sea admin&lt;br&gt;
DRONE_AGENT_TOKEN: La respuesta del comando "openssl rand -hex 16"&lt;br&gt;
DRONE_AMAZON_TAGS: Tags que se le van a atascar a las instancias creadas&lt;br&gt;
DRONE_AMAZON_IMAGE: El id de una AMI&lt;br&gt;
DRONE_AMAZON_VOLUME_TYPE: El tipo de volumen que van a tener las instancias&lt;br&gt;
DRONE_AGENT_CONCURRENCY: Este es el número de procesos que va  a correr como máximo una instancia&lt;br&gt;
y después de esto ya debería estar escalando automáticamente&lt;br&gt;
DRONE_AMAZON_VOLUME_SIZE: El tamaño del volumen&lt;br&gt;
DRONE_AMAZON_INSTANCE: El tipo de instancia&lt;br&gt;
DRONE_AMAZON_REGION: La región en donde se van a generar las instancias&lt;br&gt;
DRONE_AMAZON_SUBNET_ID: El id de tu subnet preferida&lt;br&gt;
DRONE_AMAZON_SECURITY_GROUP: El id de tu SG favorito&lt;br&gt;
DRONE_AMAZON_SSHKEY: El ssh key de tu preferencia&lt;br&gt;
AWS_ACCESS_KEY_ID: Un acces key id que tenga los permisos suficientes respecto a instancia&lt;br&gt;
AWS_SECRET_ACCESS_KEY: El secret key de tu usuario&lt;br&gt;
DRONE_AMAZON_IAM_PROFILE_ARN: Él role que se atascaran a las instancias&lt;br&gt;
DRONE_AGENT_ENVIRON: Aqui podemos pasar cualquier variable y estas van a llegar a las instancias de los runners&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ahora ya tenemos todo listo, podemos mandar &lt;strong&gt;docker ps&lt;/strong&gt; y ver que tenemos corriendo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rgI-p7Fa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6s8fbjl0rldthkj6e8z9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rgI-p7Fa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6s8fbjl0rldthkj6e8z9.jpg" alt="Image description" width="343" height="140"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tenemos el autoscaler de drone, el servidor de drone y el registry-plugin de drone, este último se usa para poder inyectar variables globales por debajo a los procesos que corran en el drone.&lt;/p&gt;

&lt;p&gt;Vamos a realizar una prueba.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0mqPWIYH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9qbgxwtpb017w298r988.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0mqPWIYH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9qbgxwtpb017w298r988.png" alt="Image description" width="880" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mF71NGhY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7uyqgy4o7mx6jiizo6vt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mF71NGhY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7uyqgy4o7mx6jiizo6vt.png" alt="Image description" width="845" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y después de unos dos minutos nuestra instancia va a estar levantada y el drone ya va a empezar a correr los procesos al drone&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5RXZ0ASC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3upuf476sr9fg94zwd1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5RXZ0ASC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3upuf476sr9fg94zwd1r.png" alt="Image description" width="880" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q7TEsjrh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eoeqt4b7kx0nb2uvn507.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q7TEsjrh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eoeqt4b7kx0nb2uvn507.png" alt="Image description" width="811" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y con esto ya tendríamos listo el autoscaler del drone, ahora una prueba que quiero hacer es crear una AMI propia, pero con el Docker y todo lo requerido para correr el Drone para bajar el tiempo de espera al levantar la máquina&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0ejbjEAr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gt84tf52zgy631ormykt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0ejbjEAr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gt84tf52zgy631ormykt.png" alt="Image description" width="880" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
