pipeline {
    agent any
    environment {
        IMAGE_NAME = ""
        IMAGE = "${IMAGE_NAME}:latest"
        SIT_IMAGE = "${env.SIT_DOCKER_REPO}/${IMAGE_NAME}:${env.BUILD_ID}"
        STAGE_IMAGE = "${env.STAGE_DOCKER_REPO}/${IMAGE}"
        PRODUCTION_IMAGE = "${env.PRODUCTION_DOCKER_REPO}/${IMAGE}"
        SIT_ENV = "sit"
        STAGE_ENV = "stage"
        PRODUCTION_ENV = "prod"
        COMMIT_MESSAGE = sh(script: "git log -1 --pretty=%B", returnStdout: true).trim()
    }
    stages {
        stage('deploy to sit') {
            when {
                expression {
                return (env.BRANCH_NAME != 'master' && env.BRANCH_NAME != 'master' && env.BRANCH_NAME != 'dap-staging' && env.COMMIT_MESSAGE.contains("trigger build"))
                }
            }
            agent {
                kubernetes {
                    defaultContainer 'deploy-image'
                    yaml """
                        apiVersion: v1
                        kind: Pod
                        spec:
                          nodeSelector:
                            cloud.google.com/gke-nodepool: default-pool
                          containers:
                          - name: deploy-image
                            image: docker:latest
                            tty: true
                            securityContext:
                              privileged: true

                            volumeMounts:
                            - name: service-account
                              readOnly: true
                              mountPath: /service-account
                            - name: project-service-account
                              readOnly: true
                              mountPath: /project-service-account
                            - name: dind-storage
                              mountPath: /var/lib/docker
                          volumes:
                          - name: project-service-account
                            secret:
                              secretName: dap-composer-sit
                              defaultMode: 384
                          - name: service-account
                            secret:
                              secretName: gcp-service-account
                              defaultMode: 384
                          - name: dind-storage
                            emptyDir: {}
                    """
                }
            }
            steps {
                container('deploy-image') {
                    sh '''
                          ls -a /service-account
                          ls -a /project-service-account
                          cp -r /project-service-account ./service-account
                          cat /service-account/key.json | docker login -u _json_key --password-stdin https://asia-east1-docker.pkg.dev
                          docker build \
                          --build-arg BASE_IMAGE=${SIT_DOCKER_REPO}/kkpy:latest \
                          --build-arg APP_ENV=${SIT_ENV} \
                          -t ${IMAGE} .
                          docker tag ${IMAGE} ${SIT_IMAGE};
                          docker push ${SIT_IMAGE};
                      '''
                }
                withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: GITHUB_CREDENTIALS_ID, \
                                                                          usernameVariable: 'USERNAME', \
                                                                          passwordVariable: 'ACCESS_TOKEN']]) {
                    script {
                        MESSAGE = """[${env.BRANCH_NAME}]
Project: <${env.GIT_URL}|${env.IMAGE_NAME}>
Build Commit: <${GIT_URL}/commit/${env.GIT_COMMIT}|commit>

<${env.BUILD_URL}|Build Info>

"""
                    }
                }
            }
            post {
                success {
                    slackSend color: 'good',
                              message: "${MESSAGE} sit image deployed"
                }
                failure {
                    slackSend color: 'danger',
                              message: "${MESSAGE} sit image deployed failed"
                }
            }
        }
        stage('deploy to staging') {

            when {
                beforeAgent true;
                anyOf{
                branch "master"
               }
            }

            agent {
                kubernetes {
                    defaultContainer 'deploy-image'
                    yaml """
                        apiVersion: v1
                        kind: Pod
                        spec:
                          nodeSelector:
                            cloud.google.com/gke-nodepool: default-pool
                          containers:
                          - name: deploy-image
                            image: docker:latest
                            tty: true
                            securityContext:
                              privileged: true

                            volumeMounts:
                            - name: service-account
                              readOnly: true
                              mountPath: /service-account
                            - name: project-service-account
                              readOnly: true
                              mountPath: /project-service-account
                            - name: dind-storage
                              mountPath: /var/lib/docker
                          volumes:
                          - name: project-service-account
                            secret:
                              secretName: dap-composer-stage
                              defaultMode: 384
                          - name: service-account
                            secret:
                              secretName: gcp-service-account
                              defaultMode: 384
                          - name: dind-storage
                            emptyDir: {}
                    """
                }
            }
            steps {
                container('deploy-image') {
                    sh '''
                          ls -a /service-account
                          ls -a /project-service-account
                          cp -r /project-service-account ./service-account
                          cat /service-account/key.json | docker login -u _json_key --password-stdin https://asia-east1-docker.pkg.dev
                          docker build \
                          --build-arg BASE_IMAGE=${SIT_DOCKER_REPO}/kkpy:latest \
                          --build-arg APP_ENV=${STAGE_ENV} \
                          -t ${IMAGE} .
                          docker tag ${IMAGE} ${STAGE_IMAGE};
                          docker push ${STAGE_IMAGE};
                      '''
                }
                withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: GITHUB_CREDENTIALS_ID, \
                                                                          usernameVariable: 'USERNAME', \
                                                                          passwordVariable: 'ACCESS_TOKEN']]) {
                    script {
                        MESSAGE = """[${env.BRANCH_NAME}]
Project: <${env.GIT_URL}|${env.IMAGE_NAME}>
Build Commit: <${GIT_URL}/commit/${env.GIT_COMMIT}|commit>

<${env.BUILD_URL}|Build Info>

"""
                    }
                }
            }
            post {
                success {
                    script {
                        def buildUrl = env.BUILD_URL
                        def inputUrl = "${buildUrl}input"  // Jenkins input page
                        slackSend color: 'good',
                                  attachments: [
                                [
                                    fallback: "approve：<${inputUrl}|click>",
                                    title: "approve",
                                    text: "${MESSAGE} Do you want to approve the deployment?",
                                    actions: [
                                        [
                                            type: "button",
                                            text: "Approval Page",
                                            style: "primary",
                                            url: inputUrl
                                        ]
                                    ]
                                ]
                            ]
                    }
                }
            }
        }
        stage('Approval') {
            when {
                beforeAgent true;
                anyOf{
                branch "master"
               }
            }
            steps {
                script {
                      input message: 'Do you want to approve the deployment?', ok: 'Yes'
                }
            }
        }
        stage('Build Production') {
            when {
                beforeAgent true;
                anyOf{
                branch "master"
               }
            }
            agent {
                kubernetes {
                    defaultContainer 'deploy-image'
                    yaml """
                        apiVersion: v1
                        kind: Pod
                        spec:
                          nodeSelector:
                            cloud.google.com/gke-nodepool: default-pool
                          containers:
                          - name: deploy-image
                            image: docker:latest
                            tty: true
                            securityContext:
                              privileged: true

                            volumeMounts:
                            - name: service-account
                              readOnly: true
                              mountPath: /service-account
                            - name: project-service-account
                              readOnly: true
                              mountPath: /project-service-account
                            - name: dind-storage
                              mountPath: /var/lib/docker
                          volumes:
                          - name: project-service-account
                            secret:
                              secretName: dap-composer-prod
                              defaultMode: 384
                          - name: service-account
                            secret:
                              secretName: gcp-service-account
                              defaultMode: 384
                          - name: dind-storage
                            emptyDir: {}
                    """
                }
            }
            steps {
                container('deploy-image') {
                    sh '''
                          ls -a /service-account
                          ls -a /project-service-account
                          cp -r /project-service-account ./service-account
                          cat /service-account/key.json | docker login -u _json_key --password-stdin https://asia-east1-docker.pkg.dev
                          docker build \
                          --build-arg BASE_IMAGE=${SIT_DOCKER_REPO}/kkpy:latest \
                          --build-arg APP_ENV=${PRODUCTION_ENV} \
                          -t ${IMAGE} .
                          docker tag ${IMAGE} ${PRODUCTION_IMAGE};
                          docker push ${PRODUCTION_IMAGE};
                      '''
                }
                withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: GITHUB_CREDENTIALS_ID, \
                                                                          usernameVariable: 'USERNAME', \
                                                                          passwordVariable: 'ACCESS_TOKEN']]) {
                    script {
                        MESSAGE = """[${env.BRANCH_NAME}]
Project: <${env.GIT_URL}|${env.IMAGE_NAME}>
Build Commit: <${GIT_URL}/commit/${env.GIT_COMMIT}|commit>

<${env.BUILD_URL}|Build Info>

"""
                        }
                    }
            }
            post {
                success {
                    slackSend color: 'good',
                              message: "${MESSAGE} :white_check_mark: prod image deployed :tada: "
                }
                failure {
                    slackSend color: 'danger',
                              message: "${MESSAGE} :x: prod image deployed failed :cry: "
                }
            }
        }
    }
}