Versión: 1.0
Fecha: 23 de Enero, 2026
Estado: NORMATIVO - Automatización y Despliegue
Arquitecto: Carlos Alberto Torres Camargo
// Jenkinsfile - CentricaModel (Librería de DTOs)
pipeline {
agent any
tools {
maven 'Maven-3.9'
jdk 'JDK-25'
}
environment {
NEXUS_URL = "${env.NEXUS_REPOSITORY_URL}" // ej: nexus.centrica.internal
NEXUS_CREDENTIALS = credentials('nexus-credentials-id')
SONAR_URL = "${env.SONARQUBE_URL}"
SONAR_TOKEN = credentials('sonarqube-token-id')
}
stages {
stage('Checkout') {
steps {
checkout scm
script {
env.GIT_COMMIT_MSG = sh(
script: 'git log -1 --pretty=%B',
returnStdout: true
).trim()
}
}
}
stage('Version Bump') {
when {
branch 'develop'
}
steps {
script {
// Determinar incremento SemVer desde commit message
def versionIncrement = 'patch'
if (env.GIT_COMMIT_MSG ==~ /.*BREAKING CHANGE.*/) {
versionIncrement = 'major'
} else if (env.GIT_COMMIT_MSG ==~ /^feat(\(.+\))?:.*/) {
versionIncrement = 'minor'
}
sh """
mvn build-helper:parse-version \
versions:set \
-DnewVersion=\\\${parsedVersion.majorVersion}.\\\${parsedVersion.minorVersion}.\\\${parsedVersion.nextIncrementalVersion}-SNAPSHOT \
versions:commit
"""
}
}
}
stage('Build') {
steps {
sh 'mvn clean compile -DskipTests'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Quality Gate') {
steps {
withSonarQubeEnv('SonarQube') {
sh """
mvn sonar:sonar \
-Dsonar.host.url=${SONAR_URL} \
-Dsonar.login=${SONAR_TOKEN}
"""
}
timeout(time: 5, unit: 'MINUTES') {
waitForQualityGate abortPipeline: true
}
}
}
stage('Deploy to Nexus') {
when {
anyOf {
branch 'develop'
branch 'main'
branch pattern: 'release/.*', comparator: 'REGEXP'
}
}
steps {
sh """
mvn deploy -DskipTests \
-DaltDeploymentRepository=nexus::default::http://${NEXUS_URL}/repository/maven-snapshots/
"""
}
}
}
}
// Jenkinsfile - nebula-accounting (Microservicio)
pipeline {
agent any
tools {
maven 'Maven-3.9'
jdk 'JDK-25'
}
environment {
DOCKER_REGISTRY = "${env.DOCKER_REGISTRY_URL}" // ej: registry.centrica.internal
DOCKER_CREDENTIALS = credentials('docker-registry-creds')
K8S_NAMESPACE = "nebula-${env.BRANCH_NAME == 'main' ? 'prod' : 'dev'}"
APP_NAME = 'nebula-accounting'
}
stages {
stage('Preparation') {
steps {
checkout scm
script {
env.VERSION = sh(
script: "mvn help:evaluate -Dexpression=project.version -q -DforceStdout",
returnStdout: true
).trim()
env.IMAGE_TAG = "${env.VERSION}-${env.BUILD_NUMBER}"
}
}
}
stage('Build') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('Unit Tests') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
jacoco execPattern: 'target/jacoco.exec'
}
}
}
stage('Quality Gate') {
steps {
withSonarQubeEnv('SonarQube') {
sh 'mvn sonar:sonar'
}
waitForQualityGate abortPipeline: true
}
}
stage('Build Docker Image') {
steps {
script {
sh """
docker build \
-t ${DOCKER_REGISTRY}/${APP_NAME}:${IMAGE_TAG} \
-t ${DOCKER_REGISTRY}/${APP_NAME}:latest \
.
"""
}
}
}
stage('Push Docker Image') {
steps {
script {
docker.withRegistry("https://${DOCKER_REGISTRY}", 'docker-registry-creds') {
sh """
docker push ${DOCKER_REGISTRY}/${APP_NAME}:${IMAGE_TAG}
docker push ${DOCKER_REGISTRY}/${APP_NAME}:latest
"""
}
}
}
}
stage('Deploy to DEV') {
when {
branch 'develop'
}
steps {
sh """
kubectl set image deployment/${APP_NAME} \
${APP_NAME}=${DOCKER_REGISTRY}/${APP_NAME}:${IMAGE_TAG} \
-n ${K8S_NAMESPACE}
kubectl rollout status deployment/${APP_NAME} -n ${K8S_NAMESPACE}
"""
}
}
stage('Deploy to PROD') {
when {
branch 'main'
}
steps {
sh """
kubectl set image deployment/${APP_NAME} \
${APP_NAME}=${DOCKER_REGISTRY}/${APP_NAME}:${IMAGE_TAG} \
-n nebula-prod
kubectl rollout status deployment/${APP_NAME} -n nebula-prod
"""
}
}
}
}
Build:
Test:
Quality Gate:
Docker Build:
# Kubernetes
kubectl rollout undo deployment/nebula-accounting -n nebula-prod
# Revertir último commit en main
git checkout main
git revert HEAD
git push origin main
Documento Técnico - Pipeline CI/CD
© 2025 CatcSoft - Medellín, Colombia
| Version | Fecha | Autor | Descripcion |
|---|---|---|---|
| 1.1.0 | 2026-03-04 | Carlos Torres | Revision, sanitizacion y publicacion en Wiki Arquitectura Centrica. |
| 1.0.0 | 2025-12-27 | Carlos Torres | Creacion del documento. |