#!groovy
@Library('infraLib') _

pipeline {
  agent {
    label 'linux-agents'
  }
  options {
    ansiColor('xterm')
    disableConcurrentBuilds()
    disableResume()
    timeout(60)
    timestamps()
    buildDiscarder logRotator(artifactDaysToKeepStr: '',
            artifactNumToKeepStr: '',
            daysToKeepStr: '',
            numToKeepStr: '15')
  }
  environment {
    PROJECT       = "go-apollo"
    PROJECT_GROUP = "apollo"

    AWS_PROFILE    = "gdb-delphi-dev"
    AWS_ACCOUNT_ID = "475275892927"
    AWS_REGION     = "us-east-1"

    ECR_REGISTRY        = "${env.AWS_ACCOUNT_ID}.dkr.ecr.${env.AWS_REGION}.amazonaws.com"
    ECR_REPOSITORY_NAME = "apollo-etl/go-apollo"
    ECR_REGISTRY_URI    = "${env.ECR_REGISTRY}/${env.ECR_REPOSITORY_NAME}"

    OCTOPUS_PROJECT_APPLE   = "${env.PROJECT_GROUP}.${env.PROJECT}-apple"
    OCTOPUS_PROJECT_SPOTIFY = "${env.PROJECT_GROUP}.${env.PROJECT}-spotify"
    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.setDeploymentEnvV4(params.DEPLOY_ENV_CHOICE, env.PROJECT_GROUP, env.BRANCH_NAME, 'prod', 'prod')

    APPLECONSUMERANALYTICS_VERSION   = "apple-${octopus.getVersion(env.BRANCH_NAME, "${env.WORKSPACE}/cmd/appleconsumeranalytics/")}"
    SPOTIFYCONSUMERANALYTICS_VERSION = "spotify-${octopus.getVersion(env.BRANCH_NAME, "${env.WORKSPACE}/cmd/spotifyconsumeranalytics/")}"
  }
  parameters {
    // Ability to set particular environment for deployment or to skip it at all
    choice(
      choices: [
        'default',
        '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 - overwrite 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('Build') {
      options { retry(2) }
      steps {
        sh label: 'build', script: 'make docker/image/build'
      } /** end: steps */
    } /** end: stage */
    stage('Deploy') {
      when {
        anyOf {
          branch 'master'
          expression { return params.TRIGGER_DEPLOY.equals('yes') }
        }
      }
      stages {
        stage('Check version Apple') {
          when {
            anyOf {
              expression {
                return params.IMAGE_UPLOAD_MODE == 'error' && octopus.ecrImageTagExists(env.APPLECONSUMERANALYTICS_VERSION, env.ECR_REPOSITORY_NAME, env.AWS_PROFILE)
              }
              expression {
                return params.IMAGE_UPLOAD_MODE == 'error' && octopus.ecrImageTagExists(env.SPOTIFYCONSUMERANALYTICS_VERSION, env.ECR_REPOSITORY_NAME, env.AWS_PROFILE)
              }
            }
          }
          steps { error "Image with ${env.APPLECONSUMERANALYTICS_VERSION} or ${env.SPOTIFYCONSUMERANALYTICS_VERSION} version tag already exists."}
        } /** end: stage */
        stage('Push to ECR') {
          when {
            allOf {
              expression {
                return params.IMAGE_UPLOAD_MODE == 'overwrite' || !octopus.ecrImageTagExists(env.APPLECONSUMERANALYTICS_VERSION, env.ECR_REPOSITORY_NAME, env.AWS_PROFILE)
              }
              expression {
                return params.IMAGE_UPLOAD_MODE == 'overwrite' || !octopus.ecrImageTagExists(env.SPOTIFYCONSUMERANALYTICS_VERSION, env.ECR_REPOSITORY_NAME, env.AWS_PROFILE)
              }
            }
          }
          stages {
            stage('Scan image') {
              when {
                not {
                  expression { return params.SKIP_IMAGE_SCAN }
                }
              }
              steps {
                script {
                  octopus.prismaCloudScanImage(env.APPLECONSUMERANALYTICS_VERSION, env.ECR_REPOSITORY_NAME, env.AWS_PROFILE)
                  octopus.prismaCloudScanImage(env.SPOTIFYCONSUMERANALYTICS_VERSION, env.ECR_REPOSITORY_NAME, env.AWS_PROFILE)
                }
              } /** end: steps */
            } /** end: stage */
            stage('Push image') {
              steps {
                sh label: 'push', script: 'make docker/image/push'
              } /** end: steps */
            } /** end: stage */
          } /** end: stages */
        } /** end: stage */
        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_APPLE,env.APPLECONSUMERANALYTICS_VERSION) && !octopus.releaseExists(env.OCTOPUS_PROJECT_SPOTIFY,env.SPOTIFYCONSUMERANALYTICS_VERSION)
            }
          }
          steps {
            echo octopus.createRelease(env.OCTOPUS_PROJECT_APPLE, env.APPLECONSUMERANALYTICS_VERSION, env.OCTOPUS_CHANNEL)
            echo octopus.createRelease(env.OCTOPUS_PROJECT_SPOTIFY, env.SPOTIFYCONSUMERANALYTICS_VERSION, env.OCTOPUS_CHANNEL)
          } /** end: steps */
        } /** end: stage */
        stage('Deploy release in octopus') {
          when {
            not { expression { return env.DEPLOY_ENV.equals('skip_deployment') } }
          }
          steps {
            echo octopus.deployRelease(env.OCTOPUS_PROJECT_APPLE, env.DEPLOY_ENV, env.APPLECONSUMERANALYTICS_VERSION, env.OCTOPUS_CHANNEL)
            echo octopus.deployRelease(env.OCTOPUS_PROJECT_SPOTIFY, env.DEPLOY_ENV, env.SPOTIFYCONSUMERANALYTICS_VERSION, env.OCTOPUS_CHANNEL)
          } /** end: steps */
        } /** end: stage */
      } /** end: stages */
    } /** end: stage */
  }
}
