def arraySets() {
    return ['--set image.tag=1.0.0','--set envVars.dao_host=dao-csharp-grpc-svc','--set envVars.dao_port=8445','--set envVars.cbc_host=cb-cloud-consumer-python-grpc-svc','--set envVars.cbc_port=8446','--set service.name=api-core-daas-svc','--set service.port=8444']
}

pipeline {
    agent {
        // Only master node can communicate with k8s cluster
        label 'master'
    }
    environment {
        SKIP_BUILD = 'false' // env
        VERSION_TAG = '1.0.0'
        // Gitlab data
        GIT_REPO_URL = 'https://gitlab.triara.com/devsecops/api_core_daas.git'     // env
        GIT_BRANCH = 'main'
        GIT_CREDENTIALS_ID = 'GitTrdeo'
        // Docker data (Harbor repo)
        HARBOR_REGISTRY = 'harborstgsvcs.telmex.com/daas'
        DOCKER_IMAGE_NAME = 'api-daas'     // env
        // Chart Helm data (allocated gitlab)
        HELM_REPO_URL = 'https://gitlab.triara.com/api/v4/projects/288/packages/helm/stable'
        HELM_REPO_NAME = 'charts-daas'
        HELM_CHART_NAME = 'api-core-daas'      // env
        HELM_CHART_VERSION = '1.0.0'       // env
        HELM_SETS = arraySets()
        // K8s cluster data
        CLUSTER_NAMESPACE = 'daas-stg-qa'
        CLUSTER_SERVER = 'https://172.30.205.123:6443'
        CLUSTER_CREDENTIALS_ID = 'tkgs-cluster-2-config-proxied'
    }
    
    stages {
        stage('Checkout') {
            when {
                expression {
                    !env.SKIP_BUILD.toBoolean()
                }
            }
            steps {
                script {
                    git branch: "main",
                        credentialsId: "${GIT_CREDENTIALS_ID}",
                        url: "${GIT_REPO_URL}"

                    sh "git checkout tags/${VERSION_TAG}"
                }
            }
        }

        stage('Building Image') {
            when {
                expression {
                    !env.SKIP_BUILD.toBoolean()
                }
            }
            steps {
                script {
                    sh "docker buildx build --no-cache --platform=linux/amd64 -t ${DOCKER_IMAGE_NAME} ."
                }
            }
        }

        stage('Tagging and Pushing Image') {
            when {
                expression {
                    !env.SKIP_BUILD.toBoolean()
                }
            }
            steps {
                script {
                    sh "docker tag ${DOCKER_IMAGE_NAME} ${HARBOR_REGISTRY}/${DOCKER_IMAGE_NAME}:${VERSION_TAG}"
                    sh "docker push ${HARBOR_REGISTRY}/${DOCKER_IMAGE_NAME}:${VERSION_TAG}"
                }
            }
        }

        stage('Helm Repository') {
            steps {
                script {
                    withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId:"${GIT_CREDENTIALS_ID}", usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
                        sh "helm repo add --username $USERNAME --password $PASSWORD ${HELM_REPO_NAME} ${HELM_REPO_URL}"
                        sh "helm repo update"
                    }
                }
            }
        }

        stage('Install Helm Chart') {
            steps {
                script {
                    withKubeConfig([credentialsId: "${CLUSTER_CREDENTIALS_ID}", serverUrl: "${CLUSTER_SERVER}"]) {
                        def cmd = "helm upgrade ${HELM_CHART_NAME} ${HELM_REPO_NAME}/${HELM_CHART_NAME} "
                        // sh "helm upgrade ${HELM_CHART_NAME} ${HELM_REPO_NAME}/${HELM_CHART_NAME} ${HELM_SETS}.join(' ') --install -n ${CLUSTER_NAMESPACE}"
                        for (set in "${HELM_SETS}") {
                            cmd+= " "
                            cmd+= set
                        }
                        cmd += " --install -n ${CLUSTER_NAMESPACE}"
                    }
                }
            }
        }
    }
    
    post {
        always {
            cleanWs()
        }
    }
}
