pipeline {
  agent {
    label 'linux-agents'
  }

  options {
    ansiColor('xterm')
    disableConcurrentBuilds()
  }

  environment {
    PROJECT_GROUP        = 'datascience'
    PROJECT              = "art-smlrt-mtx"
    VERSION              = sh(script: "cat inference/VERSION", returnStdout: true).trim()
    VERSION_BUILD_NUMBER = "${env.VERSION}-${env.BUILD_NUMBER}"
    AWS_PROFILE          = 'gdb-datasci-dev'
    DEPLOYMENT_NOTIFICATIONS_CHANNEL = '#datascience-deployments'

    SERVICE  = "dev-${PROJECT_GROUP}-${PROJECT}"
    TASK_DEF = "dev-${PROJECT_GROUP}-${PROJECT}"
    CLUSTER  = "dev-${PROJECT_GROUP}-clu"
  }

  stages {
    stage('Build') {
      steps {
        script { currentBuild.displayName = env.VERSION_BUILD_NUMBER }
        sh "make docker/build"
      }
    } /** end: stage */

    stage('Publish') {
      when {
        expression { return env.BRANCH_NAME == 'master' }
      }
      steps {
        sh "make docker/push"
      }
    } /** end: stage */

    stage('Update ECS service') {
      when {
        expression { return env.BRANCH_NAME == 'master' }
      }
      steps {
        slackSend channel: "${env.DEPLOYMENT_NOTIFICATIONS_CHANNEL}",
          color: 'warning',
          iconEmoji: ':rocket:',
          username: 'Deploy',
          message: "started deployment for ${env.JOB_NAME} <${env.BUILD_URL}|Open>"
        sh "aws ecs update-service --service ${env.SERVICE} --force-new-deployment --task-definition ${env.TASK_DEF} --cluster ${env.CLUSTER}"
        sh "aws ecs wait services-stable --service ${env.SERVICE} --cluster ${env.CLUSTER}"
      }
      post {
        success {
          slackSend channel: "${env.DEPLOYMENT_NOTIFICATIONS_CHANNEL}",
            color: 'good',
            iconEmoji: ':tada:',
            username: 'Deploy',
            message: "successfully finished deployment for ${env.JOB_NAME} <${env.BUILD_URL}|Open>"
        }
        unsuccessful {
          slackSend channel: "${env.DEPLOYMENT_NOTIFICATIONS_CHANNEL}",
            color: 'danger',
            iconEmoji: ':warning:',
            username: 'Deploy',
            message: "deploy failed for ${env.JOB_NAME} <${env.BUILD_URL}|Open>"
        }
      } /** end: post */
    } /** end: stage */
  } /** end: stages */
  post {
    success {
      slackSend channel: "${env.DEPLOYMENT_NOTIFICATIONS_CHANNEL}",
        color: 'good',
        iconEmoji: ':tada:',
        username: 'Jenkins',
        message: "build ${currentBuild.result} for ${env.JOB_NAME} version ${env.VERSION} <${env.BUILD_URL}|Open>"
    }
    unsuccessful {
      slackSend channel: "${env.DEPLOYMENT_NOTIFICATIONS_CHANNEL}",
        color: 'danger',
        iconEmoji: ':red_circle:',
        username: 'Jenkins',
        message: "build ${currentBuild.result} for ${env.JOB_NAME} version ${env.VERSION} <${env.BUILD_URL}|Open>"
    }
  } /** end: post */
}