From d1dbd22766238ea1f175948159525d7eb3e43722 Mon Sep 17 00:00:00 2001 From: Hiro Date: Sat, 28 Mar 2026 11:11:09 +0000 Subject: [PATCH] feat: add Jenkinsfile for CI/CD --- Jenkinsfile | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..1e2486c --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,123 @@ +pipeline { + agent { + node { + label 'java-springboot' + } + } + environment { + URL_REGISTRY = 'gitea.danielarroyo.cl' + PROJECT = 'darroyo' + REMOTE_USER = 'root' + REMOTE_HOST = '10.5.0.116' + REMOTE_PATH = '/compose' + DOCKER_CREDENTIALS = credentials('gitea-docker-registry') + } + stages { + stage('Obtener Nombre del Repositorio') { + steps { + script { + sh 'env | sort' + echo "GIT_URL: ${env.GIT_URL}" + echo "GIT_URL_1: ${env.GIT_URL_1}" + def gitUrl = env.GIT_URL ?: env.GIT_URL_1 + if (gitUrl) { + def repoName = gitUrl.tokenize('/').last().replace('.git', '') + echo "Nombre extraído del repositorio: ${repoName}" + env.NAME_SERVICE = repoName + echo "El nombre del repositorio asignado a NAME_SERVICE: ${env.NAME_SERVICE}" + } else { + echo "No se pudo obtener la URL del repositorio. GIT_URL y GIT_URL_1 no están definidos." + env.NAME_SERVICE = 'unknown' + } + } + } + } + stage('Build') { + steps { + echo "El nombre del repositorio es: ${env.NAME_SERVICE}" + script { + try { + sh """ + ls -la + ls -la src echo "Directorio src no encontrado" + ls -la src/main/docker echo "Directorio src/main/docker no encontrado" + cat .dockerignore || echo ".dockerignore no encontrado" + docker -v + docker build \ + -t ${URL_REGISTRY}/${PROJECT}/${NAME_SERVICE}:${BUILD_NUMBER} . + docker tag ${URL_REGISTRY}/${PROJECT}/${NAME_SERVICE}:${BUILD_NUMBER} \ + ${URL_REGISTRY}/${PROJECT}/${NAME_SERVICE}:latest + """ + } catch (Exception e) { + error "Build failed: ${e.message}" + } + } + } + } + stage('Push to Registry') { + steps { + script { + try { + docker.withRegistry("https://${URL_REGISTRY}", 'gitea-docker-registry') { + sh """ + docker push ${URL_REGISTRY}/${PROJECT}/${NAME_SERVICE}:${BUILD_NUMBER} + docker push ${URL_REGISTRY}/${PROJECT}/${NAME_SERVICE}:latest + """ + } + } catch (Exception e) { + error "Push to registry failed: ${e.message}" + } + } + } + } + stage('Deploy') { + steps { + script { + def dockerComposeTemplate = """ +services: + ${NAME_SERVICE}: + image: ${URL_REGISTRY}/${PROJECT}/${NAME_SERVICE}:${BUILD_NUMBER} + container_name: ${NAME_SERVICE} + labels: + - "traefik.enable=true" + - "traefik.http.services.${NAME_SERVICE}.loadbalancer.server.port=3000" + - "traefik.http.routers.${NAME_SERVICE}.entrypoints=web" + - "traefik.http.routers.${NAME_SERVICE}.rule=Host(recall.vodorod.cl)" + environment: + - TZ=America/Santiago + - DATABASE_URL=file:/app/data/dev.db + volumes: + - ./data:/app/data + networks: + - homelab-net + mem_limit: 512m + mem_reservation: 256m + restart: unless-stopped +networks: + homelab-net: + external: true +""" + writeFile file: 'docker-compose.yaml', text: dockerComposeTemplate + sshagent(['gitea-ssh']) { + sh """ + ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} 'mkdir -p ${REMOTE_PATH}/${NAME_SERVICE}' + scp docker-compose.yaml ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/${NAME_SERVICE}/ + ssh ${REMOTE_USER}@${REMOTE_HOST} 'cd ${REMOTE_PATH}/${NAME_SERVICE} && docker-compose down || true' + ssh ${REMOTE_USER}@${REMOTE_HOST} 'cd ${REMOTE_PATH}/${NAME_SERVICE} && docker-compose up -d' + """ + } + } + } + } + } + stage('Notificación') { + steps { + script { + echo "Pipeline completado exitosamente para ${NAME_SERVICE}" + echo "Build: ${BUILD_NUMBER}" + echo "URL: ${URL_REGISTRY}/${PROJECT}/${NAME_SERVICE}:${BUILD_NUMBER}" + } + } + } + } + }