Fase 6
Jenkins LTS

Jenkins on Kubernetes · CI/CD Self-Hosted

Jenkins self-hosted corriendo como pod en k3s, con agentes dinamicos que se crean y destruyen por build. Complementa GitHub Actions del Proyecto 1, cubriendo ambos enfoques de CI/CD.

01

Por que Jenkins en k3s

Jenkins no compite con GitHub Actions. Coexisten en industrias distintas. Empresas cloud-native usan Actions. Empresas con infraestructura on-premise usan Jenkins. Este proyecto cubre ambos enfoques deliberadamente.

Self-hosted
Jenkins corre como un pod en el cluster. Esto significa control total sobre el entorno de build, los plugins disponibles y las versiones.
Agentes dinamicos
Cada build lanza un pod nuevo en k3s. El pod se destruye al terminar. Cero mantenimiento de VMs para builds.
Pipeline as Code
El Jenkinsfile vive en el repo, junto al codigo. El pipeline se versiona, se audita y se revisa como cualquier otro archivo.
Dashboards + Metricas
Jenkins expone /prometheus con metricas. Grafana muestra builds, tasa de exito y agentes activos en tiempo real.
02

Componentes del Deployment

Cinco recursos de Kubernetes forman el despliegue de Jenkins. Cada uno tiene una responsabilidad clara.

Deployment
Una replica del oficial jenkins/jenkins:lts. Corre como UID 1000 (jenkins). Expone puertos 8080 (UI) y 50000 (agentes JNLP). PVC de 10Gi para jobs, plugins y configuracion.
deployment.yml
Service
ClusterIP que expone la UI en el puerto 8080 y el puerto JNLP en el 50000. El puerto 50000 permite que los agentes dinamicos se conecten al master.
service.yml
PVC
10Gi de almacenamiento persistente para /var/jenkins_home. Contiene jobs, plugins, configuracion y credentials. Sin esto, todo se pierde al reiniciar el pod.
pvc.yml
ServiceAccount + RBAC
ServiceAccount jenkins con ClusterRole que permite crear, listar y eliminar pods en el namespace aiops. Necesario para que el plugin de Kubernetes pueda lanzar agentes dinamicos.
rbac.yml, serviceaccount.yml
ConfigMap
Script Groovy que configura el security realm de Jenkins en el primer arranque. Crea el usuario admin y deshabilita el wizard de setup inicial.
configmap.yml
03

Configuracion del Primer Arranque

Jenkins normalmente pide configurar un usuario admin en el primer arranque via wizard web. Con el flag -Djenkins.install.runSetupWizard=false y un script Groovy, esto se automatiza.

Parte del script create-admin.groovy (ConfigMap)
if (currentRealmClass.contains("None")) {
    def hudsonRealm = new HudsonPrivateSecurityRealm(false)
    hudsonRealm.createAccount("admin", "admin123")
    instance.setSecurityRealm(hudsonRealm)

    def strategy = new FullControlOnceLoggedInAuthorizationStrategy()
    strategy.setAllowAnonymousRead(false)
    instance.setAuthorizationStrategy(strategy)
    instance.save()
}

El script se monta en /usr/share/jenkins/ref/init.groovy.d/. Jenkins ejecuta todos los scripts en ese directorio al iniciar. Si el security realm ya esta configurado, el script no hace nada — es idempotente.

Java Options

-Djenkins.install.runSetupWizard=false
Deshabilita el wizard de primer arranque. Jenkins arranca sin security realm y el script Groovy del ConfigMap lo configura.
-Djava.util.logging.config.file=/var/jenkins_home/logging.properties
Configuracion de logging. Permite ajustar el nivel de log sin reiniciar con plugins.
04

Plugins Esenciales

Cinco plugins que transforman Jenkins de un servidor de CI generico en una plataforma integrada con Kubernetes y el observability stack.

Kubernetes
Permite lanzar agentes como pods efimeros en el cluster. Cada build crea un pod, lo ejecuta y lo destruye al terminar.
Git
Clona repositorios Git. Necesario para que los pipelines lean el codigo fuente del repo del proyecto.
Pipeline
Soporte para Jenkinsfile (declarative pipeline). Define el pipeline como codigo dentro del repositorio.
Prometheus Metrics
Expone /prometheus con metricas de Jenkins: builds, jobs, agentes activos. Prometheus lo scrapea para Grafana.
AnsiColor
Renderiza colores ANSI en la salida de los builds. Util cuando los linters producen output coloreado.
05

Metricas para Grafana

El plugin Prometheus Metrics expone /prometheus en el puerto 8080. Prometheus scrapea este endpoint y Grafana muestra dashboards con builds, jobs y agentes.

prometheus/configmap.yml — scrape job para Jenkins
- job_name: jenkins
  metrics_path: /prometheus
  static_configs:
    - targets: ['jenkins.aiops.svc.cluster.local:8080']

Siguiente: Agentes Dinamicos

La pagina siguiente explica como Jenkins lanza pods efimeros por build usando el plugin de Kubernetes — agentes que no existian antes del build y no existen despues.

Agentes