CI/CD
El pipeline de Jenkins se define en un archivo llamado Jenkinsfile
que debe residir en la raíz de tu repositorio. Para que Jenkins detecte y ejecute automáticamente este Jenkinsfile al producirse cambios, es necesario conectar Jenkins al repositorio (GitLab o GitHub) mediante el plugin correspondiente y configurar las credenciales y un webhook en la plataforma de Git, o bien habilitar el “polling” del repositorio desde Jenkins.
Estructura Básica de un Jenkinsfile
Dentro de un Jenkinsfile Declarativo encontraremos varias secciones clave:
- pipeline
Bloque raíz que engloba toda la definición del pipeline. - agent
Define el nodo o entorno donde se ejecuta el pipeline (por ejemploany
, etiqueta de nodo o contenedor Docker). - environment
Variables de entorno globales para todas las etapas. - parameters
Parámetros de entrada que permiten personalizar la ejecución (p. ej. rama, versión). - options
Opciones de ejecución, como tiempo máximo (timeout
) o número de reintentos (retry
). - stages
Conjunto de bloquesstage
, cada uno con su propiosteps
(comandos a ejecutar). - post
Acciones que se disparan tras la ejecución, según el resultado (success
,failure
,always
).
Ejemplo de skeleton de Jenkinsfile
pipeline {
agent any
environment {
APP_NAME = 'mi-aplicacion'
DOCKER_REGISTRY = 'registry.ejemplo.com'
}
parameters {
string(name: 'BRANCH', defaultValue: 'main', description: 'Rama a construir')
}
options {
timeout(time: 30, unit: 'MINUTES')
retry(2)
}
stages {
stage('Checkout') {
steps {
git branch: "${params.BRANCH}", url: 'https://github.com/org/mi-repo.git'
}
}
stage('Build') {
steps {
sh 'mvn clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
stage('Docker Build & Push') {
when {
branch 'main'
}
steps {
script {
docker.build("${DOCKER_REGISTRY}/${APP_NAME}:${env.BUILD_NUMBER}")
.push()
}
}
}
}
post {
success {
echo 'Pipeline finalizado correctamente.'
}
failure {
echo 'Ha ocurrido un error en el pipeline.'
}
always {
cleanWs()
}
}
}