@Library('infraLib') _

pipeline {
  agent {
    label 'linux-agents'
  }
  options { disableConcurrentBuilds() }
  environment {
    AWS_PROFILE             = "gdb-delphi-dev"
    PROJECT_GROUP           = "delphi"
    ECR                     = "${utility.getAccountIdByProfile(env.AWS_PROFILE)}.dkr.ecr.us-east-1.amazonaws.com"
    OCTOPUS_CLI_SERVER      = "https://octopus.delphi.zone"
    OCTOPUS_CLI_API_KEY     = sh(script: "aws secretsmanager get-secret-value --profile gdb-delphi-dev --secret-id 'infra/jenkins/octopus_api_key' --output json | jq -r .SecretString", , returnStdout: true).trim()
    OCTOPUS_CHANNEL         = octopus.setOctoChannel(env.BRANCH_NAME)
    DEPLOY_ENV              = octopus.setDeploymentEnv(params.DEPLOY_ENV_CHOICE, env.PROJECT_GROUP, env.BRANCH_NAME )
    NOTIFICATIONS_CHANNEL   = "delphi-slz-cicd-alerts"

    PROJECT_NAME    = "kong"
    OCTOPUS_PROJECT = "${env.PROJECT_GROUP}.${env.PROJECT_NAME.replace('_','-')}"
    WORK_DIR        = "${WORKSPACE}"
    ECR_REPOSITORY  = "delphi/${env.PROJECT_NAME.replace('_','-')}"
    REGISTRY        = "${env.ECR}/${env.ECR_REPOSITORY}"
    VERSION         = octopus.getVersion(env.BRANCH_NAME,env.WORK_DIR)
  }
  parameters {
    choice(
      choices: [
        'default',
        'dev',
        'qa',
        'stage',
        'skip_deployment'
      ],
      description: 'Set environment for deployment. Skipped by default master/release*, dev by default for all other branches',
      name: 'DEPLOY_ENV_CHOICE'
    )
    choice(
      choices: [
        'error',
        'overwrite',
        'skip_build'
      ],
      description: "Docker image upload mode - ovewrite if the image with such tag already exists, raise error if exists, or skip build part if exists.",
      name: 'IMAGE_UPLOAD_MODE'
    )
    choice(
      choices: [
        'yes',
        'no'
      ],
      description: "Don't raise errors in case release already exists",
      name: 'FAIL_IF_RELEASE_EXISTS'
    )
  }
  stages {
    stage('Validate Software Catalog Definition') {
      steps {        
        library "jenkins-global-libraries@master"
        datadogSoftwareCatalogValidate()
      }
    }
    stage('Deploy') {
      stages {
        stage('Build image and push it to ECR') {
          steps {
            script {
              sh(script: "make docker/build",returnStdout: true).trim()
              octopus.checkVersionAndPushToECR(params.IMAGE_UPLOAD_MODE,env.VERSION,env.ECR_REPOSITORY,env.AWS_PROFILE,env.WORK_DIR)
            }
          }
        }
        stage('Create a release in octopus') {
          //Check if release already exists. If it does, raise error or skip it, based on given param
          when {
            expression { return params.SKIP_RELEASE_CREATION == 'no' || !octopus.releaseExists(env.OCTOPUS_PROJECT,env.VERSION) }
          }
          steps {
            echo octopus.createRelease(env.OCTOPUS_PROJECT,env.VERSION,env.OCTOPUS_CHANNEL)
          }
        }
        stage('Deploy release in octopus') {
          when {
            expression { return env.DEPLOY_ENV != 'skip_deployment' }
          }
          steps {
            echo octopus.deployRelease(env.OCTOPUS_PROJECT,env.DEPLOY_ENV,env.VERSION,env.OCTOPUS_CHANNEL)
          }
        }
        stage('Publish Software Catalog Definition') {
          when {
            anyOf {
              branch 'master'
              branch comparator: 'GLOB', pattern: 'release*'
            }
          }
          steps {
            datadogSoftwareCatalogPublish(fetchAdditionalMetadata: false)
          }
        }
      }
    }
  }
  post {
    always {
      echo "Changing permissions on directory ${env.WORKSPACE}"
      sh "[ -d ${env.WORKSPACE} ] || mkdir -pe ${env.WORKSPACE}"
      sh "sudo chown -R ec2-user:ec2-user ${env.WORKSPACE}"
    }
    success {
      script {
        if (currentBuild.getPreviousBuild() &&
            currentBuild.getPreviousBuild().getResult().toString() != "SUCCESS") {
          utility.slackNotifyMainBranches(currentBuild.currentResult, env.NOTIFICATIONS_CHANNEL)
        }
      }
    }
    failure {
      script {
        utility.slackNotifyMainBranches(currentBuild.currentResult, env.NOTIFICATIONS_CHANNEL)
      }
    }
    cleanup {
      echo 'Removing workspace directory'
      deleteDir()
    }
  }
}
