#!groovy

@Library('infraLib') _

def BRANCHES_TO_DEPLOY = [
    "master", "develop", "release",
    "qa", "uat", "production"
]

pipeline {
  agent {
    label 'linux-agents'
  }
  options {
    ansiColor('xterm')
    disableConcurrentBuilds()
  }
  environment {
    DEPLOY_TO_TEST = "${params.DEPLOY_TO_TEST || utility.getGithubComment() == 'deploy me'}"
    ENV_PREFIX     = "${env.DEPLOY_TO_TEST == 'true' ? 'dev' : privateApiHelpers.getEnvPrefixByBranch(env.BRANCH_NAME)}"
    PROJECT        = "${env.DEPLOY_TO_TEST == 'true' ? 'privateapi-test' : privateApiHelpers.getProjectNameByBranchName(env.BRANCH_NAME)}"
    PROJECT_GROUP  = "apollo"
    REPOSITORY     = "filtr/privateapi"
    CLUSTER        = "${privateApiHelpers.getClusterName(env.BRANCH_NAME, env.ENV_PREFIX, env.PROJECT_GROUP)}"
    SERVICE        = "${env.ENV_PREFIX}-${env.PROJECT_GROUP}-${env.PROJECT}"
    TASK_DEF       = "${env.ENV_PREFIX}-${env.PROJECT_GROUP}-${env.PROJECT}"
    TAG            = "${env.DEPLOY_TO_TEST == 'true' ? 'test' : env.BRANCH_NAME}"
    ECR            = "${params.ECR}"
    AWS_PROFILE    = "${privateApiHelpers.getAWSProfileNameByBranchName(env.BRANCH_NAME)}"

    DEPLOYMENT_NOTIFICATIONS_CHANNEL = '#apollo-deployments'
  }
  parameters {
    string(name: 'ECR', defaultValue: '475275892927.dkr.ecr.us-east-1.amazonaws.com', description: 'Docker images repository.')
    booleanParam(name: 'DEPLOY_TO_TEST', defaultValue: false, description: 'Deploy this build to test environment')
  }
  triggers {
    issueCommentTrigger('.*build me.*|.*deploy me.*')
  }
  stages {
    stage('Build container') {
      steps {
        echo "Using tag ${params.ECR}/${env.REPOSITORY}:${env.TAG}"
        echo "PG - ${env.PROJECT_GROUP} | ENV - ${env.ENV_prefix} | Project - ${env.PROJECT}"
        echo "service ${env.SERVICE} task-definition ${env.TASK_DEF} cluster ${env.CLUSTER}"
        sh "docker build -t ${params.ECR}/${env.REPOSITORY}:${env.TAG} ./"
      }
    }
    stage('Upload image') {
      when {
        anyOf {
          expression { return env.BRANCH_NAME =~ /release*/ }
          expression { return BRANCHES_TO_DEPLOY.contains(env.BRANCH_NAME) }
          expression { return env.DEPLOY_TO_TEST.toBoolean() }
        }
      }
      environment {
        AWS_PROFILE = "gdb-delphi-dev"
      }
      steps {
        sh "aws ecr get-login --no-include-email | awk '{print \$6}' | docker login -u AWS --password-stdin https://${params.ECR}"
        sh "docker push ${params.ECR}/${env.REPOSITORY}:${env.TAG}"
      }
    }
    stage('Update ECS service') {
      when {
        anyOf {
          expression { return env.BRANCH_NAME =~ /release*/ }
          expression { return BRANCHES_TO_DEPLOY.contains(env.BRANCH_NAME) }
          expression { return env.DEPLOY_TO_TEST.toBoolean() }
        }
      }
      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>"
        }
      }
    }
  }
}
