Lanzar agentes de Jenkins en AWS EC2


Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 466

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 11 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 13 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 14 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag template invalid in Entity, line: 31 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag svg invalid in Entity, line: 33 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Warning: DOMDocument::loadHTML(): Tag path invalid in Entity, line: 34 in /home/customer/www/daveops.xyz/public_html/wp-content/plugins/gistpress-master/includes/class-gistpress.php on line 558

Una de las cosas que seguro necesitas en tu organización es algún tipo de nodos en los que ejecutar los agentes para tu herramienta de integración continua. Ya sea Jenkins, GitHub action, GoCD, Gitlab CI…

En mi caso utilizo Jenkins y voy a comentaros un poco cómo lo he organizado para poder escalar facil y rápidamente y a la vez intentando gastar lo menos posible.

Para ello utilizo:

  • Instancias Spot de EC2
  • Rol para controlar qué pueden hacer en AWS
  • Un grupo de auto scaling
  • cloud init para instalar y configurar todo lo que necesito

Escogiendo el tipo de instancia

Ya que compilar código es un proceso bastante intensivo en cuanto a CPU mi consejo es utilizar instancias del tipo C5, optimizadas para este tipo de uso.

En mi caso he añadido dos volúmenes EBS, uno para workspace de Jenkins y otro para que Docker almacene imágenes. Tú puede que no lo necesitas, eso ya dependerá de tu configuración.

Mi consejo para mantener los costes contrados es utilizar Spot Instances.

Rol IAM para nuestra instancia

La mejor forma de definir cómo se puede interactuar con los otros servicios de AWS desde nuestra instancia es utilizar un rol IAM. De esta forma no tendremos que guardar ningún tipo de clave o nombre de usuario en la máquina, con lo que incrementaremos la seguridad.

Crearemos una serie de políticas en formato JSON que se asociaran al rol. Por ejemplo, en nuestro caso queremos que Jenkins pueda invalidar la caché de CloudFront, por lo que utilizamos esta:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "cloudfront:CreateInvalidation",
"Resource": "*"
}
]
}

También puedes utilizar políticas escritas y gestionadas directamente por AWS. Un ejemplo puede ser AmazonEC2ContainerRegistryPowerUser, que permite leer y escribir en repositorios de ECR, pero no borrarlos.

Configurando nuestra instancia con cloud-init

¿Qué es cloud-init?

Actualmente es la forma estándar que se sigue en la industria para inicializar instancias en la nube. Es multi-plataforma y todos los principales proveedores de servicios en la nube lo soportan.

User data

Es lo que nosotros utilizaremos para indicar cómo queremos inicializar nuestra instancia. Es un fichero en yaml en el que vamos a escribir qué queremos que pase cuando se lance nuestra instancia. Las diferentes secciones que se ejecutarán en el siguiente orden.

  1. bootcmd
  2. write_files
  3. users
  4. mounts
  5. packages
  6. runcmd

Paso ahora a explicaros paso a paso mi fichero user data. Como el orden de ejecución viene pre-establecido lo he ordenado por orden alfabético. Manías.

bootcmd

Es simplemente un array de comandos. Se ejecuta en primer lugar cada vez que se inicia nuestra máquina. Yo utilizo esta sección para preparar el sistema para montar los volumenes EBS que os comenté más arriba.

bootcmd:
- mkdir -p /srv/jenkins
- mkdir -p /var/lib/docker
- while [ ! -b $(readlink -f /dev/sdb) ]; do echo "waiting for device /dev/sdb"; sleep 5 ; done
- blkid $(readlink -f /dev/sdb) || mkfs -t xfs $(readlink -f /dev/sdb)
- while [ ! -b $(readlink -f /dev/sdc) ]; do echo "waiting for device /dev/sdc"; sleep 5 ; done
- blkid $(readlink -f /dev/sdc) || mkfs -t xfs $(readlink -f /dev/sdc)
view raw user-data.yml hosted with ❤ by GitHub

  • En las dos primeras líneas creo dos directorios para luego poder montar los discos destinados a Jenkins y Docker.
  • Las líneas 4-6 hacen exactamente lo mismo, una vez para cada disco.
    • Primero espero a que el volumen EBS se adjunte a la instancia.
      • En instancias basadas en NVMe el nombre del dispositivo puede cambiar cuando se inicia la máquina. Por ejemplo, /dev/sdb puede corresponderse a /dev/nvme0n1, pero también puede ser que su dispositivo físico correspondiente sea /dev/nvme0n1. Amazon Linux crea un symlink conectando ambos y eso es lo quereadlink nos permite obtener, con lo que simpre tendremos el valor correcto.
    • Una vez está disponible, compruebo si ya está formateado. Si no lo está lo formateo.
      • blkid $(readlink -f /dev/sdb) devuelve información sobre el dispositivo.
      • Si no lo hace utilizamos mkfs -t xfs $(readlink -f /dev/sdb) para formatearlo con el sistema de archivos xfs.

mount

En esta sección indico cómo se van a montar los volúmenes EBS. Como podéis ver estoy usando los directorios que creamos anteriormente y el mismo sistema de archivos.

mounts:
- [ /dev/sdb, /srv/jenkins, xfs ]
- [ /dev/sdc, /var/lib/docker, xfs ]
view raw user-data.yml hosted with ❤ by GitHub

output

Aquí simplemente indicamos dónde queremos que los logs de la ejecución de cloud-init se guarden.

output: {all: '| tee -a /var/log/cloud-init-output.log'}
view raw user-data.yml hosted with ❤ by GitHub

Con esto podemos hacer SSH y seguir los logs en tiempo real usando tail.

packages y repo_upgrade

packages es la forma genérica de usar el gestor de paquetes de nuestra distribución y decir qué paquetes queremos instalar.

packages:
- git
- tmux
- zip
- wget
- curl
repo_upgrade: all
view raw user-data.yml hosted with ❤ by GitHub

Además, repo_upgrade: all actualizará todos los paquetes que estén instalados en nuestro sistema cada vez que se inicie.

users

Aquí es donde vamos a definir los usuarios que queremos crear en nuestro sistema.

- name: myuser
sudo: [ "ALL=(ALL) NOPASSWD:ALL" ]
shell: /bin/bash
ssh-authorized-keys:
- Your public key goes here
- name: jenkins
system: true
shell: /bin/bash
homedir: /srv/jenkins
view raw user-data.yml hosted with ❤ by GitHub

El primero es «nuestro» usuario. El que usaremos para hacer SSH y conectarnos a la instancia si no necesitamos. El segundo es un usuario de sistema, jenkins para nuestro agente swarm.

write_files

En esta sección definimos algunos archivos que queremos generar con cloud-init. En este caso son dos. Un fichero con las etiquetas que podremos utilizar en Jenkins para referenciar los agentes y el archivo de unidad de systemd.

- path: /root/swarm_labels
owner: root:root
permissions: '0644'
content: amazonLinux docker linux
- path: /etc/systemd/system/jenkins_swarm.service
owner: root:root
permissions: '0600'
content: |
[Unit]
Description=Jenkins Swarm Client
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=jenkins
Group=jenkins
ExecStart=/bin/java -jar /opt/swarm/swarm-client.jar -disableSslVerification -master http://mymaster.com:8080 -username VALUE_JENKINS_SWARM_USERNAME_VALUE -password VALUE_JENKINS_SWARM_PASSWORD_VALUE -name swarm -labelsFile /srv/jenkins/labels -fsroot /srv/jenkins -executors 2
Restart=always
[Install]
WantedBy=multi-user.target
view raw user-data.yml hosted with ❤ by GitHub

En esta sección indico cómo se van a montar los volúmenes EBS. Como podéis ver estoy usando los directorios que creamos anteriormente y el mismo sistema de archivos.

mounts:
- [ /dev/sdb, /srv/jenkins, xfs ]
- [ /dev/sdc, /var/lib/docker, xfs ]
view raw user-data.yml hosted with ❤ by GitHub

output

Aquí simplemente indicamos dónde queremos que los logs de la ejecución de cloud-init se guarden.

output: {all: '| tee -a /var/log/cloud-init-output.log'}
view raw user-data.yml hosted with ❤ by GitHub

Con esto podemos hacer SSH y seguir los logs en tiempo real usando tail.

packages y repo_upgrade

packages es la forma genérica de usar el gestor de paquetes de nuestra distribución y decir qué paquetes queremos instalar.

packages:
- git
- tmux
- zip
- wget
- curl
repo_upgrade: all
view raw user-data.yml hosted with ❤ by GitHub

Además, repo_upgrade: all actualizará todos los paquetes que estén instalados en nuestro sistema cada vez que se inicie.

users

Aquí es donde vamos a definir los usuarios que queremos crear en nuestro sistema.

users:
- name: myuser
sudo: [ "ALL=(ALL) NOPASSWD:ALL" ]
shell: /bin/bash
ssh-authorized-keys:
- Your public key goes here
- name: jenkins
system: true
shell: /bin/bash
homedir: /srv/jenkins
view raw user-data.yml hosted with ❤ by GitHub

El primero es «nuestro» usuario. El que usaremos para hacer SSH y conectarnos a la instancia si no necesitamos. El segundo es un usuario de sistema, jenkins para nuestro agente swarm.

write_files

En esta sección definimos algunos archivos que queremos generar con cloud-init. En este caso son dos. Un fichero con las etiquetas que podremos utilizar en Jenkins para referenciar los agentes y el archivo de unidad de systemd.

write_files:
- path: /root/swarm_labels
owner: root:root
permissions: '0644'
content: amazonLinux docker linux
- path: /etc/systemd/system/jenkins_swarm.service
owner: root:root
permissions: '0600'
content: |
[Unit]
Description=Jenkins Swarm Client
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=jenkins
Group=jenkins
ExecStart=/bin/java -jar /opt/swarm/swarm-client.jar -disableSslVerification -master http://mymaster.com:8080 -username VALUE_JENKINS_SWARM_USERNAME_VALUE -password VALUE_JENKINS_SWARM_PASSWORD_VALUE -name swarm -labelsFile /srv/jenkins/labels -fsroot /srv/jenkins -executors 2
Restart=always
[Install]
WantedBy=multi-user.target
view raw user-data.yml hosted with ❤ by GitHub
  • path: lugar donde se debe generará el fichero.
  • owner: dueño, en este caso el usuario root y el grupo root.
  • permissions: los permisos que aplican a cada fichero.
  • content: contenido del fichero.

Modifica los valores para que se adapten a tu configuración. Hay dos valores, VALUE_JENKINS_SWARM_USERNAME_VALUE y VALUE_JENKINS_SWARM_PASSWORD_VALUE que reemplazaremos automáticamente usando cloud-init.

runcmd

Ya sé que esto no está en orden alfabético, pero necesitaba enseñaros lo anterior antes de llegar aquí, para que tenga sentido lo que se vamos a ver ahora. Esta es la última sección en ejecutarse y es donde terminamos la instalación y configuración de nuestro agente.

runcmd:
- amazon-linux-extras install -y vim python3.8 docker java-openjdk11
- usermod -aG docker jenkins
- curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
- chmod +x /usr/local/bin/docker-compose
- systemctl start docker
- chown -R jenkins:jenkins /srv/jenkins
- mv /root/swarm_labels /srv/jenkins/labels
- chown jenkins:jenkins /srv/jenkins/labels
- mkdir /opt/swarm
- chmod 0755 /opt/swarm
- wget https://repo.jenkins-ci.org/releases/org/jenkins-ci/plugins/swarm-client/3.28/swarm-client-3.28.jar -O /opt/swarm/swarm-client.jar
- export JENKINS_SWARM_USERNAME=`aws --region eu-west-1 ssm get-parameter --name /PATH/TO/JENKINS_SWARM_USERNAME --output text --query 'Parameter.Value' --with-decryption`
- export JENKINS_SWARM_PASSWORD=`aws --region eu-west-1 ssm get-parameter --name /PATH/TO/ec2-jenkins-agent/JENKINS_SWARM_PASSWORD --output text --query 'Parameter.Value' --with-decryption`
- sed -i 's|VALUE_JENKINS_SWARM_USERNAME_VALUE|'$JENKINS_SWARM_USERNAME'|g' /etc/systemd/system/jenkins_swarm.service
- sed -i 's|VALUE_JENKINS_SWARM_PASSWORD_VALUE|'$JENKINS_SWARM_PASSWORD'|g' /etc/systemd/system/jenkins_swarm.service
- systemctl daemon-reload
- systemctl restart jenkins_swarm
view raw user-data.yml hosted with ❤ by GitHub

Empezamos:

  • Amazon Linux 2 proporciona una manera de consumir nuevos paquetes de software en un sistema estable. Esto es Amazon Linux Extras. Lo utilizamos para instalar vim, python3, docker y java.
  • A continuación añadimos el usuario de jenkins al grupo docker para que pueda utilizarlo sin sudo.
  • Nos descargamos docker-compose y cambiamos los permisos para hacerlo ejecutable.
  • Iniciamos docker.
  • Cambiamos el dueño de /srv/jenkins, que pasa a ser jenkins.
  • Anteriormente creamos el fichero que donde guardamos las etiquetas para Jenkins. Ahora es momento de copiarlo a la carpeta de Jenkins. También cambiamos el dueño del fichero para que sea jenkins.
  • Descargamos el cliente Swarm (un fichero Jar de Java) y lo guardamos en /opt/swarm.
  • Por seguridad yo guardé el usuario y contraseña en el Systems Manager Parameter Store. Ahora es momento de recuperarlos para usarlos en nuestro fichero de systemd.
    • El usuario que swarm utiliza para conectarse es un usuario normal de Jenkins. Debes generar una clave API.
    • El rol que creamos antes debe tener los permisos suficientes para acceder a estos parámetros en el Parameter Store.
  • Usando sed reemplazamos el usuario y clave API en el fichero systemd.
  • Refrescamos el demonio e iniciamos swarm.

Configuración de lanzamiento y grupo de Auto Scaling

Configuración de lanzamiento

Ahora que tenemos todo preparado podemos pasar a configurarlo en AWS. Para ello, lo primero que tenemos que hacer es crear una configuración de lanzamiento en EC2. Podemos encontrar dónde crearla en la parte inferior izquierda de la página.

Pasemos ahora a crear la configuración.

  1. Nombre.
  2. AMI que queremos utilizar.
    1. En nuestro caso vamos a utilizar Amazon Linux 2.
  3. Ahora elegimos el tipo de instancia que vamos a usar. Mi consejo es usar una del tipo c5, ya que están optimizadas para uso intensivo de CPU.
  4. Ahora podemos seleccionar Solicitar instancias de spot, para utilizar estas en vez de una instancia bajo demanda. Una vez marcada la casilla tendremos que decidir el precio máximo por hora que estamos dispuestos a pagar. Si no sabes muy bien de qué va esto te aconsejo que le eches un vistazo a la documentación de AWS.
  1. ¿Recuerdas el rol IAM que creamos hace un rato? Ahora tenemos que referenciarlo aquí para que las instancias que vamos a crear con esta configuración lo utilicen.
  2. Configurad el monitoreo avanzado según os venga mejor.
  3. La siguiente opción nos pregunta si queremos que nuestra instancia esté optimizada para EBS. Si no me equivoco la AMI ya lo está por defecto, con lo que no lo necesitamos marcar.
  4. Abre detalles avanzados. Puedes dejar todo con los valores por defecto salvo datos de usuario, ese yaml que acabamos de escribir arriba. No es la mejor forma de hacerlo, yo preferiría poder impotarlo desde Git, pero puedes o copiar y pegar o subirlo en forma de archivo.
  5. Hablemos de volúmenes EBS:
    1. Verás que hay ya uno por defecto.
    2. En mi caso añadí otros dos, /dev/sda y /dev/sdb. Ya que son para agentes de Jenkins que destruiremos diariamente aconsejo marcar la casilla de Eliminar al terminar, para que no nos queden volúmenes sueltos y estemos dándole dinero a Amazon por nada.
  6. En la sección de grupo de seguridad puedes crear uno o usar algún grupo que ya tengas. Como mínimo asegúrate que puedes hacer SSH a las máquinas, si es necesario que cambies algo siempre puedes modificarlo después.
  7. Finalmente elige un par de claves existente (también puedes crear uno nuevo).

Grupo de Auto Scaling

Justo debajo de la sección de configuraciones de lanzamiento están los grupos de Auto Scaling.

  1. Como siempre, lo primero que debemos hacer es ponerle un nombre.
  2. Ahora debemos cambiar de Plantilla de lanzamiento a Configuración de lanzamiento.
  1. Seleccionamos la configuración que acabamos de crear.
  1. Ahora seleccionamos la VPC, Availability Zones y subnets que vamos a usar. Esto dependerá de tu configuración.
  2. No usaremos ningún tipo de balanceador de carga.
  3. Ahora puedes configurar el tamaño de tu grupo de Auto Scaling. Yo no he configurado ningun tipo de polícia para auto escalado.
  4. En el siguiente paso puedes configurar notificaciones para que EC2 te avise cuando lance o destruya instancias.
  5. Finalmente puedes usar las etiquetas que creas convenientes. Yo recomiendo al menos utilizar Name. De esta forma todas las instancias que se creen utilizando este grupo tendrán el nombre que le asignemos y será más fácil filtrarlas.

Y ya está. Una vez el grupo se haya creado tus instancias aparecerán en la consola de EC2 y en más o menos un minuto o dos las verás aparecer en Jenkins como agentes swarm.

Antes de terminar quiero hablaros de las Acciones programadas, dentro de la pestaña de Escalado automático. Esto viene a ser la posibilidad de configurar cron jobs para lanzar y destruir instancias. Con esto podéis crearlas por la mañana y destruirlas una vez termine la jornada laboral con lo que podréis ahorrar algo más de dinero.


Como siempre, muchas gracias por haber llegado hasta aquí. Espero que el post haya sido de utilidad. ¿Hay algo que no entiendas? ¿Alguna cosa que yo haya dado por sentada y que no haya puesto? Déjame un comentario e intentaré contestar.

¡Hasta otra vez!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *