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

  environment {
    PKG = 'code.justin.tv/foundation/admin-panel-lambdas'
  }

  stages {
    stage('clean') {
      steps {
        sh 'git clean -dfx'
      }
    }

    stage('terraform-lint') {
      agent { docker { image 'hashicorp/terraform' } }
      steps {
        sh 'terraform fmt -check=true ./terraform/'
      }
    }

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

        sh 'make test-coverage'
        stash name: 'coverage', includes: 'coverage.txt'

        sh 'make build'
        stash name: 'build', includes: 'build/*.zip'
      }
    }

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

    stage('deploy-staging') {
      when {
        expression { BRANCH_NAME ==~ /^release\/.+$/ }
      }
      steps {
        withCredentials([[
          $class: 'AmazonWebServicesCredentialsBinding',
          credentialsId: 'team-sse-jenkins'
        ]]) {
          unstash name: 'build'
          sh 'make deploy-staging'
        }
      }
    }

    stage('deploy-production') {
      when {
        branch 'master'
      }
      steps {
        withCredentials([[
          $class: 'AmazonWebServicesCredentialsBinding',
          credentialsId: 'team-sse-jenkins'
        ]]) {
          unstash name: 'build'
          sh 'make deploy-production'
        }
      }
    }
  }
}
