import groovy.json.JsonSlurper

pipeline {
    agent {
        node {
            label 'ubuntu'
        }
    }

    options {
        buildDiscarder(logRotator(daysToKeepStr: '14', artifactNumToKeepStr: '10'))
    }

    environment {
        JAVA_HOME = "${tool 'JDK 1.8 (latest)'}"
    }

    tools {
        maven 'Maven 3 (latest)'
        jdk 'JDK 1.8 (latest)'
    }

    triggers {
        cron '''TZ=Asia/Shanghai
        H 2,14 * * *'''
        pollSCM '''TZ=Asia/Shanghai
        H H/2 * * *'''
    }


    stages {
        stage('Clone') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CloneOption', noTags: true, reference: '', shallow: true]], gitTool: 'Default', submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/apache/dubbo.git']]])
            }
        }

        stage('Duplicate deploy check') {
            steps {
                script {
                    def deployedCommitId = sh(returnStdout: true, script: "curl --silent https://builds.apache.org/job/Apache%20Dubbo/job/${env.JOB_BASE_NAME}/lastSuccessfulBuild/artifact/DEPLOY_COMMIT_ID || true").trim()
                    env.DEPLOYED_COMMIT_ID = deployedCommitId
                    def commitId = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
                    env.COMMIT_ID = commitId

                    if (commitId == deployedCommitId) {
                        env.STATUS_CHECK = "false"
                        println "Latest deployed commit id is $deployedCommitId, Skip deployment this time"
                    } else {
                        env.STATUS_CHECK = "true"
                        println "Current commit id hasn't been deployed, continue"
                    }
                }
            }
        }

        stage('Commit status check') {
            when {
                expression {
                    return env.STATUS_CHECK == "true";
                }
            }
            steps {
                script {
                    def commitId = env.COMMIT_ID
                    println "Current commit id: $commitId"

                    def commitStatusJson = sh(script: "curl --silent https://api.github.com/repos/apache/dubbo/commits/$commitId/status", returnStdout: true).trim()
                    println "Commit status: \r\n$commitStatusJson"

                    def jsonSlurper = new JsonSlurper()
                    def jsonObject = jsonSlurper.parseText(commitStatusJson)

                    def status = jsonObject.state

                    println "Current commit status is $status"

                    if (status == "success") {
                        env.STATUS_CHECK = "true"
                        println "Continue to deploy snapshot"
                    } else {
                        env.STATUS_CHECK = "false"
                        println "Current commit status not allow to deploy snapshot"
                    }
                }
            }
        }

        stage('Snapshot version check') {
            when {
                expression {
                    return env.STATUS_CHECK == "true";
                }
            }
            steps {
                sh 'env'
                sh 'java -version'
                sh './mvnw clean install -pl "dubbo-dependencies-bom" && ./mvnw clean install -DskipTests=true && ./mvnw clean validate -Psnapshot-ci-deploy -pl "dubbo-all"'
            }
        }

        stage('Deploy snapshot') {
            when {
                expression {
                    return env.STATUS_CHECK == "true";
                }
            }
            steps {
                timeout(35) {
                    sh './mvnw --version'
                    sh './mvnw clean package deploy -pl dubbo-dependencies-bom && ./mvnw clean package deploy -DskipTests=true'
                }
            }
        }

        stage('Save deployed commit id') {
            steps {
                script {
                    if (env.STATUS_CHECK != "true") {
                        println "Not pass status check"
                        env.COMMIT_ID = env.DEPLOYED_COMMIT_ID
                    }
                }
                writeFile file: 'DEPLOY_COMMIT_ID', text: "${env.COMMIT_ID}"
                archiveArtifacts 'DEPLOY_COMMIT_ID'
            }
        }
    }

    post {
        failure {
            mail bcc: '', body: '''Project: ${env.JOB_NAME}
            Build Number: ${env.BUILD_NUMBER}
            URL: ${env.BUILD_URL}''', cc: '', from: '', replyTo: '', subject: 'Apache Dubbo snapshot deployment fail', to: 'dev@dubbo.apache.org'
        }
    }

}
