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
-
Ir a Jenkins →
http://localhost:8080
-
Hacer clic en "New Item" (o "Nuevo elemento")
-
Configurar el job:
Campo | Valor | Descripción |
---|---|---|
Item name | POLI-Generador-de-Claves |
Nombre del pipeline |
Type | Pipeline |
Tipo de proyecto |
- 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
- Hacer clic en "Save" para guardar la configuración
- Volver a la página principal del job
- Hacer clic en "Build Now" para iniciar manualmente el build
Paso 6: Monitorear el Build
- Hacer clic en el número de build en el historial
- 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:
- Hacer clic en "Open Blue Ocean" en el menú lateral
- Navegar a tu pipeline
- Ver ejecución en tiempo real con interfaz visual
🚨 Troubleshooting
Error: "Jenkinsfile not found"
Síntomas:
ERROR: Jenkinsfile not found in repository
Soluciones:
- ✅ Verificar que
Jenkinsfile
esté en la raíz del repositorio - ✅ Confirmar que el nombre sea exactamente
Jenkinsfile
(sin extensión) - ✅ Verificar permisos del archivo
- ✅ Hacer commit y push del Jenkinsfile
- ✅ Verificar que la rama especificada sea correcta (
*/main
)
Error: "Repository not found"
Síntomas:
ERROR: Repository not found
Soluciones:
- ✅ Verificar que la URL del repositorio sea correcta
- ✅ Confirmar que el repositorio sea público o que tengas credenciales configuradas
- ✅ Verificar que el repositorio exista en GitHub
- ✅ 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:
- ✅ Verificar que Docker esté instalado en Jenkins
- ✅ Confirmar que jenkins-docker esté ejecutándose
- ✅ Verificar variables de entorno DOCKER_HOST
Error: "Permission denied"
Síntomas:
Got permission denied while trying to connect to the Docker daemon socket
Soluciones:
- ✅ Verificar configuración de Docker-in-Docker
- ✅ Confirmar que las variables de entorno estén configuradas
- ✅ Reiniciar contenedores si es necesario
Error: "Credentials not found"
Síntomas:
ERROR: Could not find credentials entry with ID dockerhub-credentials
Soluciones:
- ✅ Verificar que las credenciales estén configuradas
- ✅ Confirmar que el ID sea exactamente
dockerhub-credentials
- ✅ Verificar que estén en el scope "Global"
🔧 Configuraciones Avanzadas
Configurar Parámetros de Build
Para hacer builds más flexibles:
- Editar la configuración del job
- Activar "This project is parameterized"
- 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:
- Manage Jenkins → Configure System
- E-mail Notification
- 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
Verificación Final
- ✅ Pipeline ejecutándose correctamente
- ✅ Imagen disponible en Docker Hub
- ✅ Logs sin errores críticos
- ✅ Versionado funcionando