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)
  }
  
  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('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 }
        }
      }
      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 }
        }
      }
      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
            """
          }
        }
      }
    }   
  }
  
  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'
    }
  }
}
