pipeline {
    agent any

    environment {
        ORG         =   "extensions"
        PROJECT     =   "smart"
        CODECOV_URL =   "https://codecov.internal.justin.tv"
        DEV_ECR_URL     =   "700954093968.dkr.ecr.us-west-2.amazonaws.com"
        PROD_ECR_URL    =   "389391525107.dkr.ecr.us-west-2.amazonaws.com"
    }

    stages {
        stage("Quick Sanity Build and Test") {
            steps {
                /* Validate Jenkinsfile */
                validateDeclarativePipeline 'Jenkinsfile'

                /* Build Project */
                checkout scm
                sh "make build"

                /* Upload Test Coverage to CodeCov TODO: Cut Test Upload into it's own Stage*/
                dir('services/smart') {
                    withCredentials(
                            [
                                    string(
                                            credentialsId: 'extensions_smart_codecov_access_token',
                                            variable: 'CODECOV_TOKEN'
                                    )
                            ]
                    )
                            {
                                /* Extract Coverage XML Report from Built Container and Push to CodeCov */
                                sh "mkdir .coverage && cd .coverage"
                                sh "docker run --rm twitch-extensions-smart/service:${GIT_COMMIT} cat coverage.xml > coverage.xml"
                                sh "docker run --rm twitch-extensions-smart/service:${GIT_COMMIT} cat coverage.json > coverage.json"
                                sh "curl -s ${CODECOV_URL}/bash | bash -s - -t ghe -r ${ORG}/${PROJECT} -s ./"
                            }
                }
            }
        }
        stage("Push to AWS ECR when NOT master") {
            when {
                not {
                    branch 'master'
                }
            }
                // Push to Dev AWS ECR
                steps {
                    withCredentials([
                            string(
                                    credentialsId: '6b9d01b7-b6cc-4dca-a843-ce48c9eb0488',
                                    variable: 'AWS_ACCESS_KEY_ID'
                            ),
                            string(
                                    credentialsId: '555b80d4-7544-4c08-93c0-d3828ab46458',
                                    variable: 'AWS_SECRET_ACCESS_KEY'
                            )
                    ]) {
                        script {
                            /* ECR Login */
                            sh "aws ecr get-login --no-include-email --region us-west-2 | cut -d' ' -f6 | docker login -u AWS --password-stdin ${DEV_ECR_URL}"

                            /* Push to ECR - tag latest IF master */
                            sh "docker tag twitch-extensions-smart/service:${GIT_COMMIT} ${DEV_ECR_URL}/twitch-extensions-smart/service:${GIT_COMMIT}"
                            sh "docker push ${DEV_ECR_URL}/twitch-extensions-smart/service:${GIT_COMMIT}"
                        }
                    }
                    script {
                        /* Push to Artifactory */
                        sh "docker tag twitch-extensions-smart/service:${GIT_COMMIT} docker-registry.internal.justin.tv/twitch-extensions-smart/service:${GIT_COMMIT}"
                        sh "docker push docker-registry.internal.justin.tv/twitch-extensions-smart/service:${GIT_COMMIT}"
                    }

                }
        }
        stage("Push Containers when master") {
            when {
                branch 'master'
            }
            steps {
                /* DEV Account Tag & Push */
                withCredentials([
                        string(
                                credentialsId: '6b9d01b7-b6cc-4dca-a843-ce48c9eb0488',
                                variable: 'AWS_ACCESS_KEY_ID'
                        ),
                        string(
                                credentialsId: '555b80d4-7544-4c08-93c0-d3828ab46458',
                                variable: 'AWS_SECRET_ACCESS_KEY'
                        )
                ]) {
                    script {
                        /* ECR Login */
                        sh "aws ecr get-login --no-include-email --region us-west-2 | cut -d' ' -f6 | docker login -u AWS --password-stdin ${DEV_ECR_URL}"

                        /* Push to ECR */
                        sh "docker tag twitch-extensions-smart/service:${GIT_COMMIT} ${DEV_ECR_URL}/twitch-extensions-smart/service:${GIT_COMMIT}"
                        sh "docker push ${DEV_ECR_URL}/twitch-extensions-smart/service:${GIT_COMMIT}"
                        sh "docker tag twitch-extensions-smart/service:${GIT_COMMIT} ${DEV_ECR_URL}/twitch-extensions-smart/service:latest"
                        sh "docker push ${DEV_ECR_URL}/twitch-extensions-smart/service:latest"
                    }
                }
                /* PROD Account Tag & Push */
                withCredentials([
                        string(
                                credentialsId: 'badffc95-3797-47da-b531-c7cc39111ccc',
                                variable: 'AWS_ACCESS_KEY_ID'
                        ),
                        string(
                                credentialsId: '4de581cd-a805-489f-9f3b-fcb08133905a',
                                variable: 'AWS_SECRET_ACCESS_KEY'
                        )
                ]) {
                    script {
                        /* ECR Login */
                        sh "aws ecr get-login --no-include-email --region us-west-2 | cut -d' ' -f6 | docker login -u AWS --password-stdin ${PROD_ECR_URL}"

                        /* Push to ECR */
                        sh "docker tag twitch-extensions-smart/service:${GIT_COMMIT} ${PROD_ECR_URL}/twitch-extensions-smart/service:${GIT_COMMIT}"
                        sh "docker push ${PROD_ECR_URL}/twitch-extensions-smart/service:${GIT_COMMIT}"
                        sh "docker tag twitch-extensions-smart/service:${GIT_COMMIT} ${PROD_ECR_URL}/twitch-extensions-smart/service:latest"
                        sh "docker push ${PROD_ECR_URL}/twitch-extensions-smart/service:latest"
                    }
                }
                script {
                    /* Push to Artifactory */
                    sh "docker tag twitch-extensions-smart/service:${GIT_COMMIT} docker-registry.internal.justin.tv/twitch-extensions-smart/service:${GIT_COMMIT}"
                    sh "docker push docker-registry.internal.justin.tv/twitch-extensions-smart/service:${GIT_COMMIT}"
                    sh "docker tag twitch-extensions-smart/service:${GIT_COMMIT} docker-registry.internal.justin.tv/twitch-extensions-smart/service:latest"
                    sh "docker push docker-registry.internal.justin.tv/twitch-extensions-smart/service:latest"
                }
            }
        }
    }
}

