Configuración de Agentes Jenkins para Clústeres Kubernetes

Este artículo detalla el proceso para crear una imagen Docker personalizada para un agente de compilación de Jenkins, optimizada para su despliegue en un entorno Kubernetes. Cubriremos la configuración del Dockerfile, el script de inicio del agente, los ajustes de Maven y los pasos para construir y cargar la imagen en un registro de contenedores.

  1. Preparación de los Componentes del Agente Jenkins

1.1. Creación del Dockerfile para el Agente de Jenkins

Definimos los requisitos base y los componentes esenciales para nuestro agente Jenkins dentro de un Dockerfile. Utilizaremos una imagen de OpenJDK como base para un entorno Java ligero y configuraremos las dependencias necesarias para tareas de compilación comunes como Maven y Git.


FROM openjdk:8-jdk-slim

LABEL description="Agente de compilación Jenkins con Java, Maven y Git"

RUN apt-get update && \
   apt-get install -y --no-install-recommends \
       maven \
       git \
       curl \
       libtool-ltdl-dev && \
   apt-get clean && \
   rm -rf /var/lib/apt/lists/* && \
   mkdir -p /opt/jenkins-agent

# Copiamos los archivos necesarios
COPY jenkins-agent.jar /opt/jenkins-agent/jenkins-agent.jar
COPY launch-agent.sh /usr/local/bin/launch-agent.sh
COPY maven-global-settings.xml /etc/maven/settings.xml

RUN chmod +x /usr/local/bin/launch-agent.sh

ENTRYPOINT ["/usr/local/bin/launch-agent.sh"]

1.2. Script de Inicio del Contenedor del Agente

Este script se encarga de iniciar el agente Jenkins dentro del contenedor, interpretando las variables de entorno para configurar la conexión con el controlador de Jenkins. Permite flexibilizar la configuración de túneles, URL del maestro y directorios de trabajo.


#!/usr/bin/env sh

if [ "$#" -eq 1 ]; then
   # Si se proporciona solo un argumento, asumimos que el usuario desea ejecutar un comando alternativo (ej. bash)
   exec "$@"
else
   AGENT_TUNNEL_ARGS=""
   if [ -n "$JENKINS_AGENT_TUNNEL" ]; then
       AGENT_TUNNEL_ARGS="-tunnel $JENKINS_AGENT_TUNNEL"
   fi

   AGENT_WORKDIR_ARGS=""
   if [ -n "$JENKINS_AGENT_WORKDIR" ]; then
       AGENT_WORKDIR_ARGS="-workDir $JENKINS_AGENT_WORKDIR"
   fi

   MASTER_URL_ARGS=""
   if [ -n "$JENKINS_MASTER_URL" ]; then
       MASTER_URL_ARGS="-url $JENKINS_MASTER_URL"
   fi

   AGENT_NAME_ARGS=""
   if [ -n "$JENKINS_NODE_NAME" ]; then
       AGENT_NAME_ARGS="$JENKINS_NODE_NAME"
   fi

   # Deshabilitar JnlpProtocol3 por defecto si no está definido para compatibilidad
   JNLP_PROTOCOL_OPTS="${JNLP_PROTOCOL_OPTS:--Dorg.jenkinsci.remoting.engine.JnlpProtocol3.disabled=true}"

   AGENT_SECRET_PARAM=""
   if [ -n "$JENKINS_NODE_SECRET" ]; then
       AGENT_SECRET_PARAM="$JENKINS_NODE_SECRET"
   fi
   
   # Iniciar el proceso del agente Jenkins
   exec java $JAVA_OPTS $JNLP_PROTOCOL_OPTS \
       -cp /opt/jenkins-agent/jenkins-agent.jar \
       hudson.remoting.jnlp.Main -headless \
       $AGENT_TUNNEL_ARGS \
       $MASTER_URL_ARGS \
       $AGENT_WORKDIR_ARGS \
       $AGENT_SECRET_PARAM \
       $AGENT_NAME_ARGS \
       "$@"
fi

1.3. Configuración Global de Maven para el Agente

El archivo maven-global-settings.xml configura Maven para utilizar un espejo (mirror) para los repositorios centrales, lo que puede acelerar las descargas de dependencias y mejorar la fiabilidad en entornos de compilación. Aquí se usa el repositorio público de Maven Central.


<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

 <!-- mirrors
  | Configuración de espejos para acelerar la descarga de artefactos.
  | Se recomienda utilizar un espejo cercano o un proxy de repositorio local.
  |-->
 <mirrors>
   <mirror>     
     <id>central-mirror</id>     
     <mirrorOf>central</mirrorOf>     
     <name>Maven Central Mirror</name>
     <url>https://repo.maven.apache.org/maven2</url>     
   </mirror>
 </mirrors>

 <!-- profiles
  | Perfiles de configuración de Maven.
  |-->
 <profiles>
   <profile>
     <id>default-profile</id>
     <activation>
       <activeByDefault>true</activeByDefault>
     </activation>
     <properties>
       <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
   </profile>
 </profiles>

 <!-- activeProfiles
  | Lista de perfiles activos para todas las compilaciones.
  |-->
 <activeProfiles>
   <activeProfile>default-profile</activeProfile>
 </activeProfiles>

</settings>

1.4. Obtención del Archivo JAR del Agente Jankins

El archivo jenkins-agent.jar es el cliente JNLP que permite al agente comunicarce con el controlador de Jenkins. Debe descargarse directamente desde la instancia de su Jenkins Master. Puede encontrarlo en la siguiente URL, reemplazando la dirección IP y el puerto con los de su servidor Jenkins:


 http://<su_ip_jenkins_master>:<puerto_jenkins>/jnlpJars/agent.jar
 

Asegúrese de guardar este archivo como jenkins-agent.jar en el mismo directorio donde se encuentran su Dockerfile y script de inicio.

  1. Construcción y Distribución de la Imagen Docker del Agente

Una vez que todos los archivos de configuración y el JAR del agente están en su lugar, podemos proceder a construir la imagen Docker y subirla a un registro de contenedores.

2.1. Proceso de Construcción de la Imagen

Ejecute el siguiente comando docker build en el directorio que contiene su Dockerfile, launch-agent.sh, maven-global-settings.xml y jenkins-agent.jar. Reemplace myregistry.local/jenkins/jenkins-build-agent:1.0 con la ruta de su imagen deseada.


docker build -t myregistry.local/jenkins/jenkins-build-agent:1.0 .
 

2.2. Autenticación en el Registro de Contenedores

Antes de poder subir la imagen, debe autenticarse en su regisstro de contenedores privado (por ejemplo, Harbor). Reemplace myregistry.local con la URL de su registro y proporcione sus credenciales.


docker login -u <usuario> -p'<contraseña>' myregistry.local
 

2.3. Verificación de la Imagen Construida

Confirme que la imagen se ha construido correctamente y está presente en su sistema local:


docker images | grep jenkins-build-agent
 

Debería ver una salida similar a esta:


REPOSITORY                           TAG       IMAGE ID       CREATED          SIZE
myregistry.local/jenkins/jenkins-build-agent   1.0       <ID_DE_IMAGEN>   Hace X minutos   <TAMAÑO>
 

2.4. Subida de la Imagen al Registro Privado

Finalmente, suba la imagen a su registro de contenedores privado para que Kubernetes pueda acceder a ella.


docker push myregistry.local/jenkins/jenkins-build-agent:1.0
 

El proceso de subida mostrará el progreso de cada capa de la imagen. Una vez completado, su imagen estará disponible para ser utilizada por los despliegues de Jenkins en su clúster Kubernetes.

Etiquetas: Kubernetes Jenkins Docker maven CI/CD

Publicado el 7-3 16:02