#!groovy

import groovy.transform.Field

@Field
def agentPod = '''
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: main
    image: pulumi/pulumi:v3.3.1
    command:
    - cat
    tty: true
    resources:
      requests:
        memory: "2000Mi"
        cpu: 1000m
      limits:
        memory: "4000Mi"
        cpu: 1000m
    env:
    - name: AWS_WEB_IDENTITY_TOKEN_FILE
      value: /identity/token
    - name: DOCKER_HOST
      value: tcp://localhost:2375
    volumeMounts:
    - mountPath: /identity
      name: identity
  - name: auth
    image: gcr.io/pingcap-gardener/jenkins/gcp-web-identity:20201201
    env:
    - name: AWS_WEB_IDENTITY_TOKEN_FILE
      value: /identity/token
    volumeMounts:
    - mountPath: /identity
      name: identity
  - name: dind
    image: docker:18.09-dind
    securityContext:
      privileged: true
  volumes:
  - emptyDir: {}
    name: identity
  restartPolicy: Never
'''

pipeline {
    agent {
        kubernetes {
            yaml agentPod
            defaultContainer "main"
            customWorkspace "/home/jenkins/agent/workspace/go/src/github.com/pingcap/mimir"
        }
    }

    environment {
        AWS_ROLE_ARN = credentials("dbaas-dev-aws-role")
        GOPATH = "/home/jenkins/agent/workspace/go"
        GITHUB_BOT = credentials("github-sre-bot")
        BUCKET = "mimir-cicd-dev"
        REGION = "us-west-2"
    }

    stages {
        stage('Setup') {
            steps {
                sh '''
                # permission to get private go packages
                echo "machine github.com login ${GITHUB_BOT_USR} password ${GITHUB_BOT_PSW}" > ~/.netrc
                
                # for image publish
                gcloud auth configure-docker

                # install zip command
                apt-get install -y zip
                '''
            }
        }
        stage('Check') {
            steps {
                sh '''
                # TODO: implement check
                '''
            }
        }
        stage('Publish Lambda Dev') {
            when {
                not { changeRequest() }
            }
            steps {
                sh '''
                aws s3api create-bucket --region=${REGION} --create-bucket-configuration LocationConstraint=${REGION} --bucket ${BUCKET} || true

                make build_pgdy_collector_linux
                make package_pgdy_collector
                aws s3 cp bin/pgdy-collector.zip s3://${BUCKET}/pgdy-collector/${TAG_NAME:-$GIT_COMMIT}/pgdy-collector.zip

                make package_gcp_collector
                aws s3 cp bin/gcp_cost.zip s3://${BUCKET}/gcp_cost/${TAG_NAME:-$GIT_COMMIT}/gcp_cost.zip
                '''
            }
        }
        stage('Publish Lambda Prod') {
            environment {
                AWS_ROLE_ARN = credentials("dbaas-prod-aws-role")
                BUCKET = "mimir-cicd-prod"
            }
            when {
                not { changeRequest() }
            }
            steps {
                sh '''
                aws s3api create-bucket --region=${REGION} --create-bucket-configuration LocationConstraint=${REGION} --bucket ${BUCKET} || true

                make build_pgdy_collector_linux
                make package_pgdy_collector
                aws s3 cp bin/pgdy-collector.zip s3://${BUCKET}/pgdy-collector/${TAG_NAME:-$GIT_COMMIT}/pgdy-collector.zip

                make package_gcp_collector
                aws s3 cp bin/gcp_cost.zip s3://${BUCKET}/gcp_cost/${TAG_NAME:-$GIT_COMMIT}/gcp_cost.zip
                '''
            }
        }
        stage('Publish Service') {
            when {
                not { changeRequest() }
            }
            steps {
                sh '''
                IMG="gcr.io/pingcap-public/mimir/server:${TAG_NAME:-$GIT_COMMIT}"
                make IMG=${IMG} docker_build_server docker_push
                echo "${IMG} pushed"
                '''
            }
        }
        stage('Publish Flink') {
            when {
                not { changeRequest() }
            }
            steps {
                sh '''
                IMG="gcr.io/pingcap-public/mimir/flink:${TAG_NAME:-$GIT_COMMIT}"
                make IMG=${IMG} docker_build_flink docker_push
                echo "${IMG} pushed"
                '''
            }
        }
        stage('Publish DBaas Snapshoter') {
            when {
                not { changeRequest() }
            }
            steps {
                sh '''
                IMG="gcr.io/pingcap-public/mimir/dbaas_snapshoter:${TAG_NAME:-$GIT_COMMIT}"
                make IMG=${IMG} docker_build_dbaas_snapshot docker_push
                echo "${IMG} pushed"
                '''
            }
        }
        stage('Publish Table Checker') {
            when {
                not { changeRequest() }
            }
            steps {
                sh '''
                IMG="gcr.io/pingcap-public/mimir/table_checker:${TAG_NAME:-$GIT_COMMIT}"
                make IMG=${IMG} docker_build_table_checker docker_push
                echo "${IMG} pushed"
                '''
            }
        }
        stage('Publish Default Mapper') {
            when {
                not { changeRequest() }
            }
            steps {
                sh '''
                IMG="gcr.io/pingcap-public/mimir/default_mapper:${TAG_NAME:-$GIT_COMMIT}"
                make IMG=${IMG} docker_build_default_mapper docker_push
                echo "${IMG} pushed"
                '''
            }
        }
    }
}