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.
- 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.
- 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.