#!/usr/bin/env groovy Jenkinsfile

envConfig = [
    'dev': ['node': 'dev', 'context': 'dev-test', 'stages': ['build', 'test', 'deploy']],
    'test': ['node': 'test', 'context': 'dev-test', 'stages': ['build', 'push', 'test', 'deploy']],
    'prod': ['node': '', 'context': 'prod', 'stages': ['test', 'deploy']]
]

deploy_env = params.deploy_env
config = envConfig[deploy_env]
image = ""
tag = params.tag

def buildStage() {
    stage('build') {
        // docker.image('node').inside('-u root -v /data/node_modules/:/data/node_modules/') {
        //     sh "npm install"
        // }
    }

    sh "docker build -t ${image} ."
}

def pushStage() {
    stage('push') {
        withDockerRegistry(credentialsId: 'aliyun-singapore-registry', url: 'https://registry.ap-southeast-1.aliyuncs.com') {
            sh "docker push ${image}"
        }
    }
}

def testStage() {
    stage('test') {
        dir('helm/stream-computation') {
            sh "helm lint -f ${deploy_env}.yaml ."
        }
    }
}

def deployStage() {
    stage('deploy') {
        dir('helm/stream-computation') {
            withKubeConfig(contextName: "${config['context']}", credentialsId: 'kubernetes-config') {
                sh "helm upgrade ${deploy_env}-stream-computation --install -f ${deploy_env}.yaml --set image.tag=${tag} ."
            }
        }
    }
}

node("${config['node']}") {
    checkout scm

    if (deploy_env == "dev") {
        tag = sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%H'").trim()
    } else if (deploy_env == "test") {
        if (tag == null || tag == "") {
            tag = sh(returnStdout: true, script: "git describe --tags `git rev-list --tags --max-count=1`").trim()
        }

        checkout([$class: 'GitSCM', branches: [[name: "refs/tags/${tag}"]]])
    }

    image = "registry.ap-southeast-1.aliyuncs.com/adups/stream-computation:${tag}"

    for (stage in config['stages']) {
        switch(stage) {
            case 'build':
                buildStage()
                break
            case 'test':
                testStage()
                break
            case 'push':
                pushStage()
                break
            case 'deploy':
                deployStage()
                break
        }
    }
}
