소스 검색

Añado Jenkinsfile

Celestino Rey 5 달 전
부모
커밋
456a0e4a00
1개의 변경된 파일346개의 추가작업 그리고 0개의 파일을 삭제
  1. 346 0
      Jenkinsfile

+ 346 - 0
Jenkinsfile

@@ -0,0 +1,346 @@
+pipeline {
+
+  options {
+    ansiColor('xterm')
+  }
+
+  agent {
+    kubernetes {
+      yamlFile 'builder.yaml'
+    }
+  }
+  
+  // Definición de variables de entorno
+  environment {
+    NOMBRE_APP = 'jugaralpadel'
+    REGISTRO = 'harbor.reymota.es/jugaralpadel'
+    //REGISTRO = 'registry.reymota.es'
+  }
+
+  // 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)
+    booleanParam(name: 'latest', description: 'Instala la última versión', 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/<NS>/${NAMESPACE}/" | kubectl create -f -
+	    cat K8S/pvc-static.yaml | sed -e "s/<NS>/${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/<NS>/${NAMESPACE}/" | kubectl delete -f -
+	    cat K8S/pvc-static.yaml | sed -e "s/<NS>/${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/<NS>/${NAMESPACE}/" | kubectl delete -f - || true
+	    cat K8S/${NOMBRE_APP}-service.yaml | sed -e "s/<NS>/${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.yaml | sed -e "s/<NS>/${NAMESPACE}/" | kubectl delete -f - || true
+	    cat K8S/${NOMBRE_APP}-service-lb.yaml | sed -e "s/<NS>/${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|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-deployment.yaml
+            sed -i 's|<REGISTRO>|${REGISTRO}|' K8S/${NOMBRE_APP}-deployment.yaml
+            sed -i 's|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-ingress.yaml
+            sed -i 's|<NS>|"${NAMESPACE}"|' K8S/reg-secret.yaml
+            sed -i 's|<NS>|"${NAMESPACE}"|' K8S/secreto-db.yaml
+            sed -i 's|<NS>|"${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/<NS>/${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/<NS>/${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.servicenp }
+          expression { !params.servicelb }
+          expression { !params.latest }
+        }
+      }
+      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|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-deployment.yaml
+            sed -i 's|<REGISTRO>|${REGISTRO}|' K8S/${NOMBRE_APP}-deployment.yaml
+            sed -i 's|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-ingress.yaml
+            sed -i 's|<NS>|"${NAMESPACE}"|' K8S/reg-secret.yaml
+            sed -i 's|<NS>|"${NAMESPACE}"|' K8S/secreto-db.yaml
+            sed -i 's|<NS>|"${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/<TAG>/${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.servicenp }
+          expression { !params.servicelb }
+          expression { !params.latest }
+        }
+      }
+      steps {
+        echo "Desplegando la aplicación" 
+        container('kubectl') {
+          withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
+          sh """#!/bin/bash
+            sed -i 's|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-deployment.yaml
+            sed -i 's|<REGISTRO>|${REGISTRO}|' K8S/${NOMBRE_APP}-deployment.yaml
+            sed -i "s/<TAG>/${BUILD_NUMBER}/" K8S/${NOMBRE_APP}-deployment.yaml
+            kubectl delete -f K8S/${NOMBRE_APP}-deployment.yaml || true
+            kubectl apply -f K8S/${NOMBRE_APP}-deployment.yaml
+            """
+          }
+        }
+      }
+    }   
+
+    stage('Despliega la aplicación en Kubernetes con la última imagen') {
+      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.servicenp }
+          expression { !params.servicelb }
+          expression { params.latest }
+        }
+      }
+      steps {
+        echo "Desplegando la aplicación" 
+        container('kubectl') {
+          withCredentials([file(credentialsId: env.Destino, variable: 'KUBECONFIG')]) {
+          sh """#!/bin/bash
+            sed -i 's|<NS>|"${NAMESPACE}"|' K8S/${NOMBRE_APP}-deployment.yaml
+            sed -i 's|<REGISTRO>|${REGISTRO}|' K8S/${NOMBRE_APP}-deployment.yaml
+            sed -i "s/<TAG>/latest/" 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 <b>${currentBuild.result}</b>: 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 <b>FALLADO</b>: 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'
+    }
+  }
+}