pipeline {
  agent any
  options {
    disableConcurrentBuilds()
  }
  stages {
    stage('Build') {
      environment {
        COURIERD_PRIVATE_KEY = credentials('courierd')
        AWS_CONFIG_FILE = credentials('aws_config')
        author = sh(script: "git log -1 --pretty=%an ${GIT_COMMIT}", returnStdout: true).trim()
        commitMsg = sh(script: "git log -1 --pretty=%B ${GIT_COMMIT}", returnStdout: true).trim()
        message = "Build starting - ${env.JOB_NAME} (<${env.BUILD_URL}|Open>) Commit by <@${author}> (${author}): ``` ${commitMsg} ``` "
      }
      steps {
        script {
            if (env.BRANCH_NAME == "master") {
                slackSend (tokenCredentialId: 'samus-slack-api-token', channel: 'prime-turbo', message: message)
            }
        }
        sshagent(credentials: ['git-aws-read-key']) {
          sh './scripts/docker_build.sh'
          sh './scripts/docker_push.sh'
        }
      }
    }
    stage('Deploy to Staging') {
      environment {
        COURIERD_PRIVATE_KEY = credentials('courierd')
        AWS_CONFIG_FILE = credentials('aws_config')
        AWS_ACCESS_KEY = credentials('red-dot-staging-tcs-access-key')
        AWS_SECRET_KEY = credentials('red-dot-staging-tcs-secret-key')
      }
      when {
        branch 'master'
      }
      steps {
        sshagent(credentials: ['jtv-deploy-user']) {
          sh 'if [ -d .ebextensions ]; then rm -Rf .ebextensions; fi'
          sh 'if [ -d .elasticbeanstalk ]; then rm -Rf .elasticbeanstalk; fi'
          sh 'cp -r deploy/.ebextensions .ebextensions'
          sh 'cp -r deploy/.elasticbeanstalk .elasticbeanstalk'
          sh """set +x
                |export AWS_SECRET_ACCESS_KEY=\$AWS_SECRET_KEY
                |export AWS_ACCESS_KEY_ID=\$AWS_ACCESS_KEY
                |export PYTHONUNBUFFERED=1
                |set -x
                |export IMAGE=docker-registry.internal.justin.tv/samus-red-dot:\$GIT_COMMIT
                |
                |cat <<EOF > Dockerrun.aws.json
                |{
                |  "AWSEBDockerrunVersion": "1",
                |  "Image": {
                |    "Name": "\$IMAGE",
                |    "Update": "false"
                |  },
                |  "Ports": [
                |    {
                |      "ContainerPort": "8000"
                |    }
                |  ],
                |  "Volumes": [
                |    {
                |      "ContainerDirectory": "/var/app",
                |      "HostDirectory": "/var/app"
                |    },
                |    {
                |      "ContainerDirectory": "/etc/ssl/certs/ca-bundle.crt",
                |      "HostDirectory": "/etc/ssl/certs/ca-bundle.crt"
                |    }
                |  ],
                |  "Logging": "/var/log/"
                |}
                |EOF
                |
                | zip -r artifact.zip Dockerrun.aws.json .ebextensions
                | eb labs cleanup-versions --num-to-leave 10 --older-than 5 --force -v --region us-west-2
                | eb deploy staging-samus-red-dot-env""".stripMargin()
        }
      }
    }
    stage('Integration Tests') {
      environment {
        COURIERD_PRIVATE_KEY = credentials('courierd')
        AWS_CONFIG_FILE = credentials('aws_config')
      }
      when {
        branch 'master'
      }
      steps {
        sshagent(credentials: ['git-aws-read-key']) {
            sh 'manta -v -f build-integration-test.json'
        }
      }
    }
    stage('Deploy to Prod') {
      environment {
        COURIERD_PRIVATE_KEY = credentials('courierd')
        AWS_CONFIG_FILE = credentials('aws_config')
        AWS_ACCESS_KEY = credentials('red-dot-prod-tcs-access-key')
        AWS_SECRET_KEY = credentials('red-dot-prod-tcs-secret-key')
      }
      when {
        branch 'master'
      }
      steps {
        sshagent(credentials: ['jtv-deploy-user']) {
          sh 'if [ -d .ebextensions ]; then rm -Rf .ebextensions; fi'
          sh 'if [ -d .elasticbeanstalk ]; then rm -Rf .elasticbeanstalk; fi'
          sh 'cp -r deploy/.ebextensions .ebextensions'
          sh 'cp -r deploy/.elasticbeanstalk .elasticbeanstalk'
          sh """set +x
                |export AWS_SECRET_ACCESS_KEY=\$AWS_SECRET_KEY
                |export AWS_ACCESS_KEY_ID=\$AWS_ACCESS_KEY
                |export PYTHONUNBUFFERED=1
                |set -x
                |export IMAGE=docker-registry.internal.justin.tv/samus-red-dot:\$GIT_COMMIT
                |
                |cat <<EOF > Dockerrun.aws.json
                |{
                |  "AWSEBDockerrunVersion": "1",
                |  "Image": {
                |    "Name": "\$IMAGE",
                |    "Update": "false"
                |  },
                |  "Ports": [
                |    {
                |      "ContainerPort": "8000"
                |    }
                |  ],
                |  "Volumes": [
                |    {
                |      "ContainerDirectory": "/var/app",
                |      "HostDirectory": "/var/app"
                |    },
                |    {
                |      "ContainerDirectory": "/etc/ssl/certs/ca-bundle.crt",
                |      "HostDirectory": "/etc/ssl/certs/ca-bundle.crt"
                |    }
                |  ],
                |  "Logging": "/var/log/"
                |}
                |EOF
                |
                | zip -r artifact.zip Dockerrun.aws.json .ebextensions
                | eb labs cleanup-versions --num-to-leave 10 --older-than 5 --force -v --region us-west-2
                | eb deploy prod-samus-red-dot-env""".stripMargin()
        }
      }
    }
  }
  post {
    success {
        script {
            if (env.BRANCH_NAME == "master") {
                slackSend (tokenCredentialId: 'samus-slack-api-token', color: '#00FF00', channel: 'prime-turbo', message: "SUCCESSFUL: Job ${env.JOB_NAME} (<${env.BUILD_URL}|Open>)")
            }
        }
    }
    failure {
        script {
            if (env.BRANCH_NAME == "master") {
                slackSend (tokenCredentialId: 'samus-slack-api-token', color: '#FF0000', channel: 'prime-turbo', message: "FAILED: Job ${env.JOB_NAME} (<${env.BUILD_URL}|Open>)")
            }
        }
    }
  }
}