Plugin de ECS Jenkins para crear nodos efímeros de Jenkins en Fargate

En el siguiente artículo os enseñaré cómo configurar el complemento Jenkins ECS https://github.com/jenkinsci/amazon-ecs-plugin para crear nodos en Fargate a través de un archivo Jenkins. Utilizaremos una pipeline con Jenkinsfile para tener ahí la mayor cantidad de configuración posible.
Elijo Fargate para evitar la administración de nodos ECS (pero recuerde que Fargate no permite tener volúmenes permanentes, aunque se puede usar EFS, y que Fargate no está habilitado para los nodos de Windows, en el momento de escribir este artículo).
Sobre Jenkins:
Asumiré que es una máquina EC2.
Se puede instalarlo desde ansible-galaxy, Helm, … es bueno hacerlo así porque se puede instalar fácilmente los complementos de Jenkins en el futuro sin tener que codificarlo a través de la interfaz web.
Jenkins se comunicará con las tareas de ECS, por ejemplo: estar en la misma VPC y la misma subred.
Rol de IAM: el que está definido aquí https://plugins.jenkins.io/scalable-amazon-ecs/
Se debería instalar en su Jenkins el complemento (plugin): https://plugins.jenkins.io/scalable-amazon-ecs/
Cree un token Git para que la pipeline de Jenkins pueda verificar el repositorio en el Nodo.
Mange Jenkins → Nodes administration j→ Configure clouds:

Pipeline de Jenkins:

El fichero de Jenkins que usaremos en el pipeline:
pipeline {
agent none
stages {
stage('Test') {
agent {
ecs {
cloud 'jenkins-node-ecs'
image 'XXXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/jenkins-node-ansible:1.0'
launchType 'FARGATE'
memory 1024
cpu 256
subnets('subnet-08086cbe2d97a1ff1')
securityGroups('sg-08f3f54702fb3992e')
taskrole 'arn:aws:iam::XXXXXXXXX:role/ecsTaskExecutionRole'
executionRole 'arn:aws:iam::XXXXXXXXX:role/ecsTaskExecutionRole'
assignPublicIp true
}
}
steps {
sh 'ansible -h'
}
}
}
}
El IAM ecsTaskExecutionRole permisos de lectura desde ECR también.
El parámetro taskRole es para acceder al ECR.
El parámetro executionRole es para cuando las tareas ya estén en ejecución.
Sobre el Dockerfile, se puede integrar el JNLP (software para nodos Jenkin) en tu propia imagen, tal y como lo he hecho en Python de la siguiente manera:
FROM jenkins/jnlp-node:alpine as jnlp
FROM python:alpine
RUN apk -U add openjdk8-jre
COPY — from=jnlp /usr/local/bin/jenkins-agent /usr/local/bin/jenkins-agent
COPY — from=jnlp /usr/share/jenkins/agent.jar /usr/share/jenkins/agent.jar
ENTRYPOINT [“/usr/local/bin/jenkins-agent”]
También necesitarás tener un clúster ECS, tipo Fargate, con el nombre «jenkins-node-ecs», igual que en Jenkinsfile.
Más información sobre JNLP: https://hub.docker.com/r/jenkinsci/jnlp-node/
Información adicional sobre los parámetros del complemento ECS para el archivo Jenkins: https://jenkins.io/doc/pipeline/steps/amazon-ecs/
Esquemas de la arquitectura: https://www.slideshare.net/PhilippKoch11/never-stand-in-row-again-with-jenkins-on-aws-ecs-and-fargate