pipeline {
    agent any
    options { disableConcurrentBuilds() }
    environment {
        IMAGE_NAME = 'docker.nextuser.com/nextuser/poc_elc_ai-api:latest'
        CONTAINER_NAME = 'poc_elc_ai-api'
        REGISTRY = credentials('jenkins-portus')
        PROJECT = projectName()
        SWAGGER_PROD = 'https://elc-ai.nextuser.com/'
    }

    stages {
	stage('Build App') {
            steps {
                sh 'docker build . --no-cache -t ' + IMAGE_NAME
            }
         }

        stage('Docker Image Push') {
            when {
                branch 'master'
            }

            steps {
                dockerLogin REGISTRY_USR, REGISTRY_PSW
                sh 'docker push ' + IMAGE_NAME
                sh 'docker rmi ' + IMAGE_NAME
            }
        }
        
        stage('deploy prod') {
            when {
                branch 'master'
            }
            environment {
                DOCKER_HOST = 'tcp://172.13.0.46:2375'
            }
            steps {
                script {
                    def deployTime = benchmark {
                        	dockerLogin REGISTRY_USR, REGISTRY_PSW
                        	if (!swarmCheck().contains(CONTAINER_NAME)) {
                                swarmDeploy CONTAINER_NAME
                                echo 'deployed entire service'
                        	} else {
                                swarmUpdate(CONTAINER_NAME + "_" + CONTAINER_NAME, IMAGE_NAME)
                                echo 'updated service'
                            }
                    }
                    def buildTime = currentBuild.durationString.replace(' and counting', '')
                    slackMessage = "Deployed *${env.JOB_NAME} to PROD* \n" +
                                                "Links: <${env.RUN_DISPLAY_URL}|Pipeline>" +
                                                ", <${LinkGenerator.kibana("${CONTAINER_NAME}")}|Logtrail>" +
                                                ", <${SWAGGER_PROD}|Swagger> \n" +
                                                "Deployment time: ${deployTime} ms, Pipeline time: ${buildTime}"
                }
                slackSend(channel: 'general', color: 'good', message: slackMessage)
            }
        }
    }
    post {
        success {
            script {
                if (env.BRANCH_NAME == 'master') {
                    return
                }
                def buildTime = currentBuild.durationString.replace(' and counting', '')
                slackSend(channel: 'general', color: 'good',
                        message: "Success *${env.JOB_NAME} [${env.BUILD_NUMBER}]*" +
                                " (<${env.RUN_DISPLAY_URL}|Pipeline>)" +
                                "\nPipeline time: ${buildTime}")
            }
        }
        failure {
            slackSend(color: 'danger', message:
                    "Failed '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (<${env.RUN_DISPLAY_URL}|Pipeline>)")
        }
    }
}
