pipeline { options { ansiColor('xterm') } agent { kubernetes { yamlFile 'builder.yaml' } } // Definición de variables de entorno environment { NOMBRE_APP = 'reymota' REGISTRO = 'harbor.reymota.es/reymota' } // Definición de parámetros parameters { booleanParam(name: 'install', description: 'Instalar todo', defaultValue: false) booleanParam(name: 'clean', description: 'Borrar todo', defaultValue: false) booleanParam(name: 'claims', description: 'Crea PVC', defaultValue: false) booleanParam(name: 'borraclaims', description: 'Borra PVC', defaultValue: false) booleanParam(name: 'namespace', description: 'Crea namespace', defaultValue: false) booleanParam(name: 'borranamespace', description: 'Borra namespace', defaultValue: false) booleanParam(name: 'creadb', description: 'Crea el objeto para crear la DB en el cúster', defaultValue: false) booleanParam(name: 'borradb', description: 'Borra el objeto que creó la DB, no la DB', defaultValue: false) booleanParam(name: 'servicelb', description: 'Crea el servicio LoadBalancer', defaultValue: false) booleanParam(name: 'servicenp', description: 'Crea el servicio NodePort', defaultValue: false) } stages { stage('Crea las PVC') { when { expression { params.claims} } steps { echo "Creando las PVC..." container('kubectl') { withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) { sh """#!/bin/bash cat K8S/pvc-${NOMBRE_APP}.yaml | sed -e "s//${NAMESPACE}/" | kubectl create -f - cat K8S/pvc-static.yaml | sed -e "s//${NAMESPACE}/" | kubectl create -f - """ } } } } stage('Borra las PVC') { when { expression { params.borraclaims} } steps { echo "Borrando las PVC..." container('kubectl') { withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) { sh """#!/bin/bash cat K8S/pvc-${NOMBRE_APP}.yaml | sed -e "s//${NAMESPACE}/" | kubectl delete -f - cat K8S/pvc-static.yaml | sed -e "s//${NAMESPACE}/" | kubectl delete -f - """ } } } } stage('Crea el objeto para crear la DB') { when { expression { params.creadb} } steps { echo "Creando el objeto que crea la DB..." container('kubectl') { withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) { sh """#!/bin/bash kubectl create -f K8S/${NOMBRE_APP}-db.yaml """ } } } } stage('Borra el objeto que creó la DB, no la DB') { when { expression { params.borradb} } steps { echo "Borrando el objeto que creó la DB..." container('kubectl') { withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) { sh """#!/bin/bash kubectl delete -f K8S/${NOMBRE_APP}-db.yaml """ } } } } stage('Crea el servicio NodePort') { when { expression { params.servicenp} } steps { echo "Creando el servicio NodePort..." container('kubectl') { withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) { sh """#!/bin/bash cat K8S/${NOMBRE_APP}-service-lb.yaml | sed -e "s//${NAMESPACE}/" | kubectl delete -f - || true cat K8S/${NOMBRE_APP}-service-np.yaml | sed -e "s//${NAMESPACE}/" | kubectl create -f - """ } } } } stage('Crea el servicio LoadBalancer') { when { expression { params.servicelb} } steps { echo "Creando el servicio LoadBalancer..." container('kubectl') { withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) { sh """#!/bin/bash cat K8S/${NOMBRE_APP}-service-np.yaml | sed -e "s//${NAMESPACE}/" | kubectl delete -f - || true cat K8S/${NOMBRE_APP}-service-lb.yaml | sed -e "s//${NAMESPACE}/" | kubectl create -f - """ } } } } stage('Borra todo') { when { expression { params.clean } } steps { echo "Borrando todo..." container('kubectl') { withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) { sh """#!/bin/bash sed -i 's||"${NAMESPACE}"|' K8S/${NOMBRE_APP}-deployment.yaml sed -i 's||${REGISTRO}|' K8S/${NOMBRE_APP}-deployment.yaml sed -i 's||"${NAMESPACE}"|' K8S/${NOMBRE_APP}-ingress.yaml sed -i 's||"${NAMESPACE}"|' K8S/reg-secret.yaml sed -i 's||"${NAMESPACE}"|' K8S/secreto-db.yaml sed -i 's||"${NAMESPACE}"|' K8S/env-prod-configmap.yaml kubectl delete -f K8S/${NOMBRE_APP}-deployment.yaml||true kubectl delete -f K8S/${NOMBRE_APP}-ingress.yaml||true kubectl delete -f K8S/secreto-db.yaml||true kubectl delete -f K8S/reg-secret.yaml||true kubectl delete -f K8S/env-prod-configmap.yaml||true """ } } } } stage('Borra namespace') { when { expression { params.borranamespace } } steps { echo "Borrando namespace..." container('kubectl') { withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) { sh """#!/bin/bash cat K8S/namespace.yaml | sed -e "s//${NAMESPACE}/" | kubectl delete -f - """ } } } } stage('Crea namespace') { when { expression { params.namespace } } steps { echo "Creando namespace..." container('kubectl') { withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) { sh """#!/bin/bash cat K8S/namespace.yaml | sed -e "s//${NAMESPACE}/" | kubectl create -f - """ } } } } stage('Construir image y subirla al registry con Kaniko') { when { allOf { expression { !params.clean } expression { !params.namespace } expression { !params.borranamespace } expression { !params.claims } expression { !params.borraclaims } expression { !params.creadb } expression { !params.borradb } expression { !params.servicelb } expression { !params.servicenp } } } steps { container('kaniko') { script { sh ''' /kaniko/executor --dockerfile `pwd`/Dockerfile \ --context `pwd` \ --destination=${REGISTRO}/${NOMBRE_APP}:${BUILD_NUMBER} ''' } } } } stage('Instala todo') { when { expression { params.install } } steps { echo "Creando todo..." container('kubectl') { withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) { sh """#!/bin/bash sed -i 's||"${NAMESPACE}"|' K8S/${NOMBRE_APP}-deployment.yaml sed -i 's||${REGISTRO}|' K8S/${NOMBRE_APP}-deployment.yaml sed -i 's||"${NAMESPACE}"|' K8S/${NOMBRE_APP}-ingress.yaml sed -i 's||"${NAMESPACE}"|' K8S/reg-secret.yaml sed -i 's||"${NAMESPACE}"|' K8S/secreto-db.yaml sed -i 's||"${NAMESPACE}"|' K8S/env-prod-configmap.yaml kubectl create -f K8S/reg-secret.yaml||true kubectl create -f K8S/secreto-db.yaml||true kubectl apply -f K8S/env-prod-configmap.yaml sed -i "s//${BUILD_NUMBER}/" K8S/${NOMBRE_APP}-deployment.yaml kubectl apply -f K8S/${NOMBRE_APP}-deployment.yaml kubectl create -f K8S/${NOMBRE_APP}-ingress.yaml||true """ } } } } stage('Despliega la aplicación en Kubernetes') { when { allOf { expression { !params.clean } expression { !params.namespace } expression { !params.borranamespace } expression { !params.claims } expression { !params.borraclaims } expression { !params.creadb } expression { !params.borradb } expression { !params.servicelb } expression { !params.servicenp } } } steps { echo "Desplegando la aplicación" container('kubectl') { withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) { sh """#!/bin/bash sed -i 's||"${NAMESPACE}"|' K8S/${NOMBRE_APP}-deployment.yaml sed -i 's||${REGISTRO}|' K8S/${NOMBRE_APP}-deployment.yaml sed -i "s//${BUILD_NUMBER}/" K8S/${NOMBRE_APP}-deployment.yaml kubectl delete -f K8S/${NOMBRE_APP}-deployment.yaml || true kubectl apply -f K8S/${NOMBRE_APP}-deployment.yaml """ } } } } } post { always { mail to: 'creylopez@yahoo.es', subject: "Trabajo ${currentBuild.fullDisplayName}", body: "El resultado del trabajo '${currentBuild.fullDisplayName}' ha sido ${currentBuild.result}: Comprueba la salida de consola en ${env.BUILD_URL} para ver los resultados.", mimeType: 'text/html' } failure { mail to: 'creylopez@yahoo.es', subject: "El trabajo ${currentBuild.fullDisplayName} ha fallado", body: "El trabajo ha FALLADO: Comprueba la salida de consola en ${env.BUILD_URL} para ver los resultados.", mimeType: 'text/html' } unstable { echo 'El trabajo ${currentBuild.fullDisplayName} ha sido marcado como inestable' } changed { mail bcc: '', body: "El estado del trabajo '${currentBuild.fullDisplayName}' ha cambiado", from: '', replyTo: '', subject: "El estado del trabajo ha cambiado", to: 'creylopez@yahoo.es', mimeType: 'text/html' } } }