#!/usr/bin/env groovy

@Library('infraLib') _

pipeline {
  agent {
    label 'linux-agents'
  }
  options {
    ansiColor('xterm')
    disableConcurrentBuilds()
    authorizationMatrix([])
  }
  environment {
    PROJECT        = "datavalidation"
    PROJECT_GROUP  = "delphi"
    AWS_PROFILE    = "gdb-delphi-dev"
    AWS_ACCOUNT_ID = "475275892927"
    AWS_REGION     = "us-east-1"
    WORK_DIR       = "${WORKSPACE}"
    VERSION        = octopus.getVersion(env.BRANCH_NAME,env.WORK_DIR)
    ECR_REPOSITORY = "delphi/${env.PROJECT}"

    OCTOPUS_PROJECT     = "delphi.datavalidation"
    OCTOPUS_CLI_SERVER  = "https://octopus.delphi.zone"
    OCTOPUS_CLI_API_KEY = utility.getSecretValueById('infra/jenkins/octopus_api_key', 'gdb-delphi-dev')
    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'
  }
  parameters {
    choice(
        choices: [
            'prod',
            'skip_deployment'
        ],
        description: 'Set environment for deployment. Development by default',
        name: 'DEPLOY_ENV_CHOICE'
    )
    choice(
        choices: [
            'default',
            'yes',
            'no'
        ],
        description: 'By default deploy is only triggered for develop/release/master branch',
        name: 'TRIGGER_DEPLOY'
    )
    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: [
            'no',
            'yes'
        ],
        description: "Don't raise errors in case release already exists",
        name: 'SKIP_RELEASE_CREATION'
    )
  }
  stages {
    stage('Validate Software Catalog Definition') {
      steps {
        library "jenkins-global-libraries@master"
        datadogSoftwareCatalogValidate()
      }
    }
    stage('Build') {
      steps {
        script { currentBuild.displayName = env.VERSION }
        sh """
            make docker/login
            make docker/image/build
          """
      }
    }
    stage('Deploy') {
      when {
        anyOf {
          branch 'master'
          branch 'develop'
          expression { return params.TRIGGER_DEPLOY.equals('yes') }
        }
      }
      stages {
        stage('Check version') {
          when { expression { return params.IMAGE_UPLOAD_MODE == 'error' && octopus.ecrImageTagExists(env.VERSION,env.ECR_REPOSITORY,env.AWS_PROFILE) }}
          steps { error "Image with ${env.VERSION} version tag already exists. To ignore this error set IMAGE_UPLOAD_MODE parameter to overwrite or skip_build"}
        }
        stage('Push to ECR') {
          when {
            expression { return params.IMAGE_UPLOAD_MODE == 'overwrite' || !octopus.ecrImageTagExists(env.VERSION,env.ECR_REPOSITORY,env.AWS_PROFILE) }
          }
          steps {
            sh """
              make docker/login
              make docker/image/push
            """
          }
        }
        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.equals('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 {
            not { expression { return env.DEPLOY_ENV.equals('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 pattern: 'release.*', comparator: 'REGEXP'
            }
          }
          steps {
            script {
              datadogSoftwareCatalogPublish(fetchAdditionalMetadata: false)
            }
          }
        }
      }
    }
  }
  post {
    always {
      script {
        utility.slackNotify(currentBuild.currentResult, env.NOTIFICATIONS_CHANNEL)
      }
    }
    cleanup {
      deleteDir()
    }
  }
}