Creación del Pipeline - Eziuz/Proyecto-POLI-Generador-de-Claves GitHub Wiki

⚙️ Creación del Pipeline

Esta guía te mostrará cómo crear y configurar un pipeline de CI/CD en Jenkins para automatizar la construcción y publicación de la aplicación POLI-Generador-de-Claves mediante builds manuales.

🎯 ¿Qué vamos a crear?

Un pipeline que:

  • 🖱️ Se ejecuta manualmente cuando lo necesitamos
  • 🏗️ Construye imágenes Docker de la aplicación
  • Verifica que las imágenes funcionen correctamente
  • 📦 Publica en Docker Hub con versionado semántico
  • 🧹 Limpia recursos automáticamente

🏗️ Flujo del Pipeline

graph TB
    A[🖱️ Build Manual] --> B[📥 Checkout Code]
    B --> C[🏷️ Determine Version]
    C --> D[🏗️ Build Docker Image]
    D --> E[✅ Verify Image]
    E --> F[📦 Push to Docker Hub]
    F --> G[🧹 Cleanup Resources]
    
    style A fill:#e3f2fd
    style F fill:#e8f5e8
    style G fill:#fff3e0

📋 Prerrequisitos

Antes de crear el pipeline, asegúrate de tener:

  • Jenkins instalado y funcionando
  • Credenciales configuradas (Docker Hub)
  • Repositorio en GitHub con el código
  • Jenkinsfile en el repositorio

🚀 Creación del Job

Paso 1: Crear Nuevo Item

  1. Ir a Jenkinshttp://localhost:8080

  2. Hacer clic en "New Item" (o "Nuevo elemento")

  3. Configurar el job:

Campo Valor Descripción
Item name POLI-Generador-de-Claves Nombre del pipeline
Type Pipeline Tipo de proyecto
  1. Hacer clic en "OK"

¿Por qué Pipeline Regular?

Ventaja Descripción
🎮 Control manual Ejecutas builds cuando lo necesitas
🔄 Simplicidad Configuración más sencilla
📊 Claridad Un solo job para todo el proceso
🛠️ Personalización Fácil de modificar y adaptar

🔧 Configuración del Pipeline

Paso 2: Configurar Pipeline Definition

En la página de configuración del job, desplázate hasta la sección Pipeline:

Campo Valor Descripción
Definition Pipeline script from SCM Usar Jenkinsfile del repositorio
SCM Git Sistema de control de versiones
Repository URL https://github.com/Eziuz/Proyecto-POLI-Generador-de-Claves.git URL del repositorio
Credentials - none - (para repos públicos) Credenciales de GitHub
Branch Specifier */main Rama principal
Script Path Jenkinsfile Ruta al archivo de pipeline

Para repositorios privados:

  • Seleccionar las credenciales de GitHub que configuraste anteriormente

Paso 3: Configurar Opciones Adicionales (Opcional)

Build Triggers

  • No seleccionar ningún trigger - Usaremos builds manuales

Pipeline

  • Do not allow concurrent builds - Evita builds simultáneos
  • Pipeline speed/durability override - Seleccionar "Performance-optimized"

📄 Preparar el Repositorio

Paso 4: Verificar Jenkinsfile

Asegúrate de que tu repositorio tenga el Jenkinsfile en la raíz:

Proyecto-POLI-Generador-de-Claves/
├── Jenkinsfile          ← ¡Debe estar aquí!
├── Dockerfile
├── package.json
├── app/
├── components/
└── ...

Contenido del Jenkinsfile (ya lo tienes, pero verifica que esté actualizado):

pipeline {
    agent any

    environment {
        // Configuración de DockerHub
        DOCKERHUB_CREDENTIALS = credentials('dockerhub-credentials')
        DOCKERHUB_USERNAME = "${DOCKERHUB_CREDENTIALS_USR}"
        DOCKERHUB_REPO = 'generador-claves'

        // Etiquetas de la imagen con versionado semántico
        IMAGE_NAME = "${DOCKERHUB_USERNAME}/${DOCKERHUB_REPO}"
        GIT_COMMIT_SHORT = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
    }

    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }

        stage('Determine Version') {
            steps {
                script {
                    // Lógica de versionado...
                }
            }
        }

        stage('Build Docker Image') {
            steps {
                script {
                    sh """
                        docker build -t ${IMAGE_NAME}:${VERSION} \
                                     -t ${IMAGE_NAME}:latest \
                                     -t ${IMAGE_NAME}:${GIT_COMMIT_SHORT} .
                    """
                }
            }
        }

        stage('Verify Image') {
            steps {
                script {
                    sh """
                        echo "Verificando que la imagen existe..."
                        docker images ${IMAGE_NAME}:${VERSION}
                        # ... más verificaciones
                    """
                }
            }
        }

        stage('Push to DockerHub') {
            steps {
                script {
                    sh "echo ${DOCKERHUB_CREDENTIALS_PSW} | docker login -u ${DOCKERHUB_CREDENTIALS_USR} --password-stdin"
                    sh """
                        docker push ${IMAGE_NAME}:${VERSION}
                        docker push ${IMAGE_NAME}:${GIT_COMMIT_SHORT}
                    """
                    // ... lógica de latest tag
                }
            }
        }
    }

    post {
        always {
            cleanWs()
            // ... limpieza de imágenes
        }
    }
}

✅ Ejecutar el Primer Build

Paso 5: Guardar y Ejecutar

  1. Hacer clic en "Save" para guardar la configuración
  2. Volver a la página principal del job
  3. Hacer clic en "Build Now" para iniciar manualmente el build

Paso 6: Monitorear el Build

  1. Hacer clic en el número de build en el historial
  2. Hacer clic en "Console Output" para ver los logs en tiempo real

📊 Monitorear el Pipeline

Vista de Ejecución

Durante la ejecución verás:

Started by user admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/POLI-Generador-de-Claves
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Checkout)
[Pipeline] checkout
Selected Git installation does not exist. Using Default
The recommended git tool is: NONE
using credential github-token
Cloning the remote Git repository
...

Stages del Pipeline

Stage Duración Esperada Descripción
Checkout 10-30s Clona el código del repositorio
Determine Version 5-10s Calcula la versión semántica
Build Docker Image 2-5 min Construye la imagen Docker
Verify Image 10-30s Verifica que la imagen funcione
Push to DockerHub 30s-2min Sube la imagen al registry

Blue Ocean View (Opcional)

Para una vista más moderna:

  1. Hacer clic en "Open Blue Ocean" en el menú lateral
  2. Navegar a tu pipeline
  3. Ver ejecución en tiempo real con interfaz visual

🚨 Troubleshooting

Error: "Jenkinsfile not found"

Síntomas:

ERROR: Jenkinsfile not found in repository

Soluciones:

  1. ✅ Verificar que Jenkinsfile esté en la raíz del repositorio
  2. ✅ Confirmar que el nombre sea exactamente Jenkinsfile (sin extensión)
  3. ✅ Verificar permisos del archivo
  4. ✅ Hacer commit y push del Jenkinsfile
  5. ✅ Verificar que la rama especificada sea correcta (*/main)

Error: "Repository not found"

Síntomas:

ERROR: Repository not found

Soluciones:

  1. ✅ Verificar que la URL del repositorio sea correcta
  2. ✅ Confirmar que el repositorio sea público o que tengas credenciales configuradas
  3. ✅ Verificar que el repositorio exista en GitHub
  4. ✅ Comprobar permisos de acceso al repositorio

Error: "Docker command not found"

Síntomas:

/var/jenkins_home/workspace/...@tmp/durable.../script.sh: line 2: docker: command not found

Soluciones:

  1. ✅ Verificar que Docker esté instalado en Jenkins
  2. ✅ Confirmar que jenkins-docker esté ejecutándose
  3. ✅ Verificar variables de entorno DOCKER_HOST

Error: "Permission denied"

Síntomas:

Got permission denied while trying to connect to the Docker daemon socket

Soluciones:

  1. ✅ Verificar configuración de Docker-in-Docker
  2. ✅ Confirmar que las variables de entorno estén configuradas
  3. ✅ Reiniciar contenedores si es necesario

Error: "Credentials not found"

Síntomas:

ERROR: Could not find credentials entry with ID dockerhub-credentials

Soluciones:

  1. ✅ Verificar que las credenciales estén configuradas
  2. ✅ Confirmar que el ID sea exactamente dockerhub-credentials
  3. ✅ Verificar que estén en el scope "Global"

🔧 Configuraciones Avanzadas

Configurar Parámetros de Build

Para hacer builds más flexibles:

  1. Editar la configuración del job
  2. Activar "This project is parameterized"
  3. Agregar parámetros:

| Tipo | Nombre | Valor por defecto | Descripción |-----|-----|----- | String | VERSION_OVERRIDE | (vacío) | Versión manual (opcional) | Choice | BUILD_TYPE | normal, release | Tipo de build | Boolean | PUSH_LATEST | false | Actualizar tag latest

En el Jenkinsfile, agregar:

stage('Determine Version') {
    steps {
        script {
            if (params.VERSION_OVERRIDE?.trim()) {
                env.VERSION = params.VERSION_OVERRIDE.trim()
                echo "Using override version: ${env.VERSION}"
            } else {
                // Lógica normal de versionado
            }
            
            env.PUSH_LATEST = params.PUSH_LATEST ? "true" : "false"
        }
    }
}

Configurar Notificaciones

Para recibir notificaciones por email:

  1. Manage JenkinsConfigure System
  2. E-mail Notification
  3. Configurar SMTP server

En el Jenkinsfile, agregar:

post {
    failure {
        emailext (
            subject: "Build Failed: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
            body: "Build failed. Check console output at ${env.BUILD_URL}",
            to: "[email protected]"
        )
    }
}

📋 Checklist de Configuración

Antes de continuar, verifica:

  • Pipeline creado en Jenkins
  • Repositorio conectado correctamente
  • Jenkinsfile presente en el repositorio
  • Credenciales configuradas y funcionando
  • Primer build ejecutado exitosamente
  • Imagen publicada en Docker Hub

Configuraciones Opcionales

  • Parámetros de build configurados
  • Notificaciones por email configuradas
  • Blue Ocean instalado para mejor UI

🎉 ¡Pipeline Creado!

¡Excelente! Ahora tienes un pipeline completamente funcional que puedes ejecutar manualmente cuando lo necesites.

¿Qué acabas de lograr?

  • 🎮 Control manual del proceso de CI/CD
  • 🏗️ Builds consistentes con cada ejecución
  • 📦 Publicación automatizada en Docker Hub
  • 🏷️ Versionado semántico controlado
  • 🧹 Limpieza automática de recursos

Próximos Pasos

  1. 🔍 Entender el Jenkinsfile →
  2. 🐳 Análisis de Docker →
  3. 📜 Scripts de Automatización →

Verificación Final

  • ✅ Pipeline ejecutándose correctamente
  • ✅ Imagen disponible en Docker Hub
  • ✅ Logs sin errores críticos
  • ✅ Versionado funcionando

📚 Referencias