#!/usr/bin/env groovy

def PROTECTED_BRANCH

node {
    stage('Setup') {
        PROTECTED_BRANCH = [
            'dev',
            'test',
            'master',
            'main',
            'beta'
        ].contains(env.BRANCH_NAME)

        // https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#using-environment-variables
        echo "NODE_NAME: ${env.NODE_NAME}"
        echo "WORKSPACE: ${env.WORKSPACE}"
    }
}
pipeline {
    agent any
    options {
        disableConcurrentBuilds()
    }
    stages {
        stage('Version') {
            when {
                expression { PROTECTED_BRANCH }
            }
            steps {
                script {
                    def packageJson = readJSON file: 'package.json'
                    def version = "${packageJson.version}-build${env.BUILD_ID}"
                    writeFile(file: 'VERSION.txt', text: version)
                    echo "VERSION: ${version}"
                }
            }
        }
        stage('Build') {
            when {
                expression { PROTECTED_BRANCH }
            }
            environment {
                VERSION = readFile 'VERSION.txt'
            }
            parallel {
                stage('Producer') {
                    steps {
                        dockerBuild 'mycdc-producer', '.', 'assets/Dockerfile.producer'
                    }
                }
                stage('Consumer') {
                    steps {
                        dockerBuild 'mycdc-consumer', '.', 'assets/Dockerfile.consumer'
                    }
                }
            }
        }
        stage('Deploy') {
            when {
                branch 'dev'
                branch 'test'
            }
            environment {
                VERSION = readFile 'VERSION.txt'
            }
            steps {
                withKubeConfig([
                    serverUrl: "$KUBERNETES_API",
                    credentialsId: 'kubernetes',
                    namespace: "mycdc-${env.BRANCH_NAME}"
                ]) {
                    sh 'kubectl set image deployment/producer main=$REGISTRY/mycdc-producer:$VERSION'
                    sh 'kubectl set image deployment/consumer main=$REGISTRY/mycdc-consumer:$VERSION'
                }
            }
        }
    }
    post {
        unsuccessful {
            setEnv()
            sendEmail()
        }
    }
}

def dockerBuild(imageName, context, dockerfile = null) {
    if (dockerfile == null)
        dockerfile = "${context}/Dockerfile"
    def baseImage = "${imageName}:${env.VERSION}"
    def image = docker.build(baseImage, "-f ${dockerfile} ${context}")
    dockerPush(image)
}

def dockerPush(image) {
    def isLatest = ['master', 'main'].contains(env.BRANCH_NAME)
    docker.withRegistry("https://${env.REGISTRY}", 'docker-registry') {
        image.push()
        image.push(env.BRANCH_NAME)
        if (isLatest) image.push('latest')
    }
}