#!/usr/bin/env groovy
pipeline {
    options {
        //禁止并发构建
        disableConcurrentBuilds()
        //持久化工件和控制台输出，用于保存Pipeline最近几次运行的数据
        buildDiscarder(logRotator(numToKeepStr: '20'))
        preserveStashes(buildCount: 5)
        //设置Pipeline运行的超时时间，之后Jenkins应该中止Pipeline
        timeout(time: 1, unit: 'HOURS')
    }
    agent {
        kubernetes {
            label "slave-${UUID.randomUUID().toString()}"
            cloud "Kubernetes"
        }

    }
    environment {
        PROJECT_NAME = 'hk-boa'
        IMAGE_NAME = 'services'
        CONTAINER_PORT = '8081'
        ENV = 'test'

    }
    parameters {
        string(name: 'REPLICAS', defaultValue: '1', description: '部署副本数')
        string(name: 'JVM_OPTS', defaultValue: '-Xmx500m -Xms500m -Xmn200m ', description: 'JVM信息')
        string(name: 'NODE_PORT', defaultValue: '30710', description: '发布端口')
        string(name: 'CPU', defaultValue: '500', description: '限制最大能使用的CPU，1000为1核')
        string(name: 'MEMORY', defaultValue: '600', description: '限制最大能使用的内存数量单位M')
        string(name: 'EMAILS', defaultValue: 'fengsw@bjrrtx.com', description: '企业微信通知人员，多个使用逗号隔开')
        booleanParam(name: 'FIRST_BUILD', defaultValue: false, description: '是否是首次构建')
    }
    stages {
        stage('拉取代码') {
            steps {
                checkout scm
            }
        }
        stage('构建应用') {
            steps {
                echo "构建应用"
                sh 'mvn clean package -U  -Dmaven.test.skip=true --settings /data/nfs/maven/settings.xml'
            }
        }
//        stage("测试应用") {
//            steps {
//                withSonarQubeEnv('sonar') {
//                    sh 'mvn clean  sonar:sonar --settings /data/nfs/maven/settings.xml'
//                }
//            }
//        }
//        stage("代码质量检查") {
//            steps {
//                timeout(time: 1, unit: 'HOURS') {
//                    waitForQualityGate abortPipeline: true
//                }
//            }
//        }
        stage('构建镜像') {
            steps {
                echo "构建镜像"
                sh "docker build -t reg.bjrrtx.com:5000/${env.PROJECT_NAME}/${env.IMAGE_NAME}-${ENV}:v${env.BUILD_NUMBER} -f deploy/Dockerfile ."
            }
        }
        stage('推送镜像') {
            steps {
                echo "推送镜像"
                sh '/opt/accessAuth.sh'
                sh "docker push reg.bjrrtx.com:5000/${env.PROJECT_NAME}/${env.IMAGE_NAME}-${ENV}:v${env.BUILD_NUMBER}"
            }
        }
        stage('部署应用') {
            steps {
                sh "sed -i \"s/{PROJECT_NAME}/${PROJECT_NAME}/g\" deploy/deploy.yaml"
                sh "sed -i \"s/{IMAGE_NAME}/${IMAGE_NAME}/g\" deploy/deploy.yaml"
                sh "sed -i \"s/{CONTAINER_PORT}/${CONTAINER_PORT}/g\" deploy/deploy.yaml"
                sh "sed -i \"s/{REPLICAS}/${params.REPLICAS}/g\" deploy/deploy.yaml"
                sh "sed -i \"s/{JVM_OPTS}/${params.JVM_OPTS}/g\" deploy/deploy.yaml"
                sh "sed -i \"s/{ENV}/${ENV}/g\" deploy/deploy.yaml"
                sh "sed -i \"s/{NODE_PORT}/${params.NODE_PORT}/g\" deploy/deploy.yaml"
                sh "sed -i \"s/{CPU}/${params.CPU}/g\" deploy/deploy.yaml"
                sh "sed -i \"s/{MEMORY}/${params.MEMORY}/g\" deploy/deploy.yaml"
                sh "sed -i \"s/{BUILD_NUMBER}/${env.BUILD_NUMBER}/g\" deploy/deploy.yaml"
                script {
                    if (FIRST_BUILD == 'true') {
                        sh 'kubectl create -f deploy/deploy.yaml'
                    } else {
                        sh 'kubectl delete -f deploy/deploy.yaml'
                        sh 'kubectl create -f deploy/deploy.yaml'
                    }
                }
            }
        }
        stage('发送企业微信通知') {
            steps {
                script {
                    def info = "发版工程：${env.JOB_NAME} \\n发版结果：<font color=\\\"info\\\">成功！</font>\\n发布版本：V${env.BUILD_NUMBER} \\n更新记录：\\n" + getChanges()
                    sh "curl -X GET http://mb.test.bjrrtx.com/magpie-bridge/jenkinsNotify -H \'Content-Type: application/json\' --data-binary \'{\"emails\":[\"${params.EMAILS}\"], \"content\":\"${info} \" }\' "
                }
            }
        }

    }
    post {
        always {
            echo 'This will always run'
        }
        success {
            echo "This will run if success"
        }
        failure {
            script {
                def info = "发版工程：${env.JOB_NAME} \\n发版结果：<font color=\\\"warning\\\">失败！</font>\\n发布版本：V${env.BUILD_NUMBER} \\n更新记录：\\n" + getChanges()
                sh "curl -X GET http://mb.test.bjrrtx.com/magpie-bridge/jenkinsNotify -H \'Content-Type: application/json\' --data-binary \'{\"emails\":[\"${params.EMAILS}\"], \"content\":\"${info} \" }\' "
            }
        }
        unstable {
            echo 'This will run only if the run was marked as unstable'
        }
        changed {
            echo 'This will run only if the state of the Pipeline has changed'
            echo 'For example, if the Pipeline was previously failing but is now successful'
        }
    }
}

@NonCPS
def getChanges() {
    MAX_MSG_LEN = 100
    def changeString = ""
    def changeLogSets = currentBuild.changeSets
    for (int i = 0; i < changeLogSets.size(); i++) {
        def entries = changeLogSets[i].items
        for (int j = 0; j < entries.length; j++) {
            def entry = entries[j]
            change_msg = entry.msg.take(MAX_MSG_LEN)
            change_author = entry.author.fullName
            changeString += " ${change_msg}" + "---" + "${change_author}\\n"
        }
    }
    if (!changeString) {
        changeString = " No changes "
    }
    return changeString
}
