pipeline {
  agent any
  options {
    timestamps()
    ansiColor('xterm')
  }

  environment {
    PKG = 'code.justin.tv/foundation/history-service'
    REPO = 'docker-registry.internal.justin.tv/foundation-history-service'
  }

  stages {
    stage('lint') {
      parallel {
        stage('lint-tf') {
          agent { docker { image 'hashicorp/terraform' } }
          steps {
            sh 'terraform fmt -check terraform'
          }
        }

        stage('lint-go') {
          agent { docker { image 'docker.internal.justin.tv/devtools/xenial/go1.11.4' } }
          steps {
            sh 'mkdir -p $(dirname $GOPATH/src/$PKG)'
            sh 'cp -r $(pwd) $GOPATH/src/$PKG'
            sh 'go get github.com/twitchtv/retool'
            sh 'retool build'
            sh 'cd $GOPATH/src/$PKG && retool do gometalinter ./...'
          }
        }
      }
    }

    stage('build-go') {
      agent { docker { image 'docker.internal.justin.tv/devtools/xenial/go1.11.4' } }
      steps {
        sh 'mkdir -p $(dirname $GOPATH/src/$PKG)'
        sh 'cp -r $(pwd) $GOPATH/src/$PKG'
        withCredentials([
          [$class: 'AmazonWebServicesCredentialsBinding', credentialsId: 'admin-platform-jenkins'],
        ]) {
          sh 'make test-coverage'
        }
        stash name: 'coverage', includes: 'coverage.txt'

        sh 'go build -o ./bin/deploy $PKG/scripts'
        sh 'go build -o ./bin/alarm $PKG/scripts/alarm'
        sh 'go build -o ./bin/task-delete-user $PKG/ecstasks/delete-user'
        sh 'go build -o ./bin/task-generate-user-report $PKG/ecstasks/generate-user-report'

        sh 'go build -o ./bin/lambda-stream-ingest $PKG/lambda/stream-ingest'
        sh 'go build -o ./bin/lambda-delete-user $PKG/lambda/delete-user'
        sh 'go build -o ./bin/lambda-generate-user-report $PKG/lambda/generate-user-report'
        sh 'go build -o ./bin/lambda-hard-delete-event-handler $PKG/lambda/hard-delete-event-handler'

        sh 'mkdir -p ./lambdas'
        sh 'zip -j ./lambdas/delete-user-$GIT_COMMIT.zip ./bin/lambda-delete-user'
        sh 'zip -j ./lambdas/generate-user-report-$GIT_COMMIT.zip ./bin/lambda-generate-user-report'
        sh 'zip -j ./lambdas/hard-delete-event-handler-$GIT_COMMIT.zip ./bin/lambda-hard-delete-event-handler'
        sh 'zip -j ./lambdas/stream-ingest-$GIT_COMMIT.zip ./bin/lambda-stream-ingest'

        stash name: 'bin', includes: 'bin/*'
        stash name: 'lambdas', includes: 'lambdas/*'
      }
    }

    stage('upload-coverage') {
      agent { docker { image 'docker.internal.justin.tv/devtools/bionic/base' } }
      steps {
        unstash name: 'coverage'
        withCredentials([
          [$class: 'StringBinding', credentialsId: 'history-service-codecov-token', variable: 'CODECOV_TOKEN']
        ]) {
          sh 'make upload-coverage'
        }
      }
    }

    stage('build-docker') {
      steps {
        unstash name: 'bin'
        sh 'docker build --target gdpr-delete-user -t $REPO:history-task-delete-user-$GIT_COMMIT .'
        sh 'docker push $REPO:history-task-delete-user-$GIT_COMMIT'

        sh 'docker build --target gdpr-generate-user-report -t $REPO:history-task-generate-user-report-$GIT_COMMIT .'
        sh 'docker push $REPO:history-task-generate-user-report-$GIT_COMMIT'
      }
    }

    stage('deploy-staging') {
      when { expression { BRANCH_NAME ==~ /^release\/.+$/ } }
      steps {
        unstash name: 'bin'
        unstash name: 'lambdas'
        withCredentials([
         [$class: 'AmazonWebServicesCredentialsBinding', credentialsId: 'admin-platform-jenkins'],
        ]) {
          sh 'ENVIRONMENT="staging" bash ./scripts/deploy.sh'
        }
      }
    }

    stage('deploy-production') {
      when { branch 'master' }
      steps {
        unstash name: 'bin'
        unstash name: 'lambdas'
        withCredentials([
          [$class: 'StringBinding', credentialsId: 'sse_pagerduty_deployment_alarm_key', variable: 'PAGERDUTY_KEY'],
          [$class: 'AmazonWebServicesCredentialsBinding', credentialsId: 'admin-platform-jenkins'],
        ]) {
          sh 'ENVIRONMENT="prod" bash ./scripts/deploy.sh'
        }
      }

      post {
        failure {
          sh 'make notify-failure'
        }
      }
    }
  }
}
