def FeiShu(status, serviceName){
    def jobNameParts = JOB_NAME.tokenize('/') as String[]
    def folderName = jobNameParts[0]
    String statusText = ""
    if (status == 1) {
        statusText = "<font color=\\\"green\\\">成功<font>"
    } else if (status == 2) {
        statusText = "<font color=\\\"yellow\\\">不稳定<font>"
    } else {
        statusText = "<font color=\\\"red\\\">失败<font>"
    }
    env.COMMIT_SHORT_HASH = "${sh(script:'git log --pretty=format:\"%h\" --no-merges|head -1', returnStdout: true)}".trim()
    env.COMMIT_MESSAGE = "${sh(script:'git log --pretty=format:\"%s\" --no-merges|head -1', returnStdout: true)}".trim()
    env.COMMIT_AUTHOR = "${sh(script:'git log --pretty=format:\"%cn\" --no-merges|head -1', returnStdout: true)}".trim()
    sh """
        curl --location --request POST 'https://open.feishu.cn/open-apis/bot/v2/hook/1babaf75-a3e4-4bf0-b236-ee9112b5f68f' \
        --header 'Content-Type: application/json' \
        --data '{
            "msg_type": "interactive",
            "card": {
                "config": {
                        "update_multi": true,
                        "enable_forward": true
                },
                "header": {
                    "template": "blue",
                    "title": {
                          "content": "项目 四合一后端 构建报告",
                          "tag": "plain_text"
                    }
                },
                "card_link": {
                    "url": "${JENKINS_URL}/blue/organizations/jenkins/${folderName}/detail/${BRANCH_NAME}/${BUILD_NUMBER}/pipeline",
                    "pc_url": "",
                    "android_url": "",
                    "ios_url": ""
                },
                "elements": [
                    {
                        "tag": "markdown",
                        "content": "**构建分支**：${BRANCH_NAME}\\n**构建编号**：${BUILD_NUMBER}\\n**提交成员**：${COMMIT_AUTHOR}\\n**提交信息**：${COMMIT_MESSAGE}\\n**构建服务**：${serviceName}\\n**构建状态**：${statusText}"
                    }
                ]
            }
        }'
    """
}

pipeline {
    agent any

    triggers {
        pollSCM('*/5 * * * *')
    }

    environment {
        PROJECT_NAME = 'cqyt_system'
    }

    stages{

        stage("Update All Check") {

            when {
                anyOf {
                    branch "develop"
                    branch "test"
                    branch "master"
                }
            }

            agent {
                docker {
                    image "ubuntu:22.04"
                    args "-v hash_storage:/hash"
                }
            }

            steps {
                dir("${env.WORKSPACE}/jeecg-boot-base-core") {
                    sh '''#!/bin/bash -xe
                        cp -r /hash/${PROJECT_NAME}/env ./
                        buildFIle="./isBuild"
                        sumPath="/hash/${PROJECT_NAME}/jeecg-boot-base-core"
                        sumFile="${sumPath}/${BRANCH_NAME}"
                        checksum=$(find . -type f -exec md5sum {} + | LC_ALL=C sort | md5sum)
                        checksum=${checksum:0:32}
                        if [[ ! -d ${sumPath} ]]
                        then
                            mkdir -p ${sumPath}
                        fi
                        if [[ ! -f ${sumFile} ]]
                        then
                            echo ${checksum} > ${sumFile}
                            echo "TRUE" > ${buildFIle}
                        else
                            if [[ "${checksum}" = "$(cat ${sumFile})" ]]
                            then
                                echo "FALSE" > ${buildFIle}
                            else
                                echo ${checksum} > ${sumFile}
                                echo "TRUE" > ${buildFIle}
                            fi
                        fi
                    '''
                    script {
                        env.IS_BUILD = readFile('./isBuild').trim()
                        env.NACOS_SERVER_ADDR = readFile("./env/NACOS_SERVER_ADDR").trim()
                        env.NACOS_USERNAME = readFile("./env/NACOS_USERNAME").trim()
                        env.NACOS_PASSWORD = readFile("./env/NACOS_PASSWORD").trim()
                        env.NACOS_NAMESPACE = readFile("./env/NACOS_NAMESPACE").trim()
                        if ( env.BRANCH_NAME == 'master' ) {
                            env.NETWORK_NAME = 'stage'
                        } else
                        if ( env.BRANCH_NAME == 'test' ) {
                            env.NETWORK_NAME = 'test'
                        } else {
                            env.NETWORK_NAME = 'dev'
                        }
                        env.PROFILE_NAME = env.NETWORK_NAME
                        env.NACOS_GROUP = env.NETWORK_NAME
                    }
                    sh "rm -f ./isBuild"
                }
            }

        }

        stage("Microservice CI") {

            when {
                anyOf {
                    branch "develop"
                    branch "test"
                    branch "master"
                }
            }

            matrix {

                axes {

                    axis {
                        name 'SERVICE_NAME'
                        values 'jeecg-system', 'health-im', 'health-medical', 'health-emergency', 'health-consultation'
                    }

                }

                stages {

                    stage("Diff Check") {
                        agent {
                            docker {
                                image "ubuntu:22.04"
                                args "-v hash_storage:/hash"
                            }
                        }
                        steps {
                            dir("${env.WORKSPACE}/${SERVICE_NAME}") {
                                sh '''#!/bin/bash -xe
                                    buildFIle="./isBuild"
                                    if [[ "${IS_BUILD}" = "TRUE" ]]
                                    then
                                        echo "TRUE" > ${buildFIle}
                                        exit 0
                                    fi
                                    sumPath="/hash/${PROJECT_NAME}/${SERVICE_NAME}"
                                    sumFile="${sumPath}/${BRANCH_NAME}"
                                    checksum=$(find . -type f -exec md5sum {} + | LC_ALL=C sort | md5sum)
                                    checksum=${checksum:0:32}
                                    if [[ ! -d ${sumPath} ]]
                                    then
                                        mkdir -p ${sumPath}
                                    fi
                                    if [[ ! -f ${sumFile} ]]
                                    then
                                        echo ${checksum} > ${sumFile}
                                        echo "TRUE" > ${buildFIle}
                                    else
                                        if [[ "${checksum}" = "$(cat ${sumFile})" ]]
                                        then
                                            echo "FALSE" > ${buildFIle}
                                        else
                                            echo ${checksum} > ${sumFile}
                                            echo "TRUE" > ${buildFIle}
                                        fi
                                    fi
                                '''
                                script {
                                    env."${SERVICE_NAME}_IS_BUILD" = readFile('./isBuild').trim()
                                }
                                sh "rm -f ./isBuild"
                            }
                        }
                    }

                    stage("Maven Package") {
                        when {
                            environment name: "${SERVICE_NAME}_IS_BUILD", value: "TRUE"
                        }
                        agent {
                            docker {
                                image "maven:3-eclipse-temurin-8"
                                args "-v maven-repo:/root/.m2 -v maven-conf:/usr/share/maven/conf"
                            }
                        }
                        steps {
                            dir("${env.WORKSPACE}") {
                                echo "Package ${SERVICE_NAME}"
                                sh "mvn -pl health-system-boms,${SERVICE_NAME}/${SERVICE_NAME}-start -e -B -U -am clean install"
                            }
                            dir("${env.WORKSPACE}/${SERVICE_NAME}/${SERVICE_NAME}-start/target") {
                                echo "Copy ${SERVICE_NAME} JAR"
                                stash(name: "${SERVICE_NAME}_jar", includes: "${SERVICE_NAME}-start.jar")
                            }
                            dir("${env.WORKSPACE}") {
                                echo "Clean Build"
                                sh "mvn clean"
                            }
                        }
                    }

                    stage("Docker Build & Run") {
                        when {
                            environment name: "${SERVICE_NAME}_IS_BUILD", value: "TRUE"
                        }
                        agent any
                        environment {
                            REGISTER_HOST = "registry.cn-shanghai.aliyuncs.com"
                            REGISTER_REPO = "yg7709"
                            IMAGE_NAME = "${PROJECT_NAME}_${SERVICE_NAME}"
                            IMAGE_TAG_LATEST = "${BRANCH_NAME}-latest"
                            IMAGE_TAG_COMMIT = "${BRANCH_NAME}-${GIT_COMMIT}"
                        }
                        steps {
                            dir("${env.WORKSPACE}/.jenkins") {
                                unstash("${SERVICE_NAME}_jar")
                                echo "Docker Build ${SERVICE_NAME}"
                                sh "docker compose -f docker-compose.build.yaml build"
                                echo "Docker Push ${SERVICE_NAME}"
                                sh "docker push ${REGISTER_HOST}/${REGISTER_REPO}/${IMAGE_NAME}:${IMAGE_TAG_LATEST}"
                                sh "docker push ${REGISTER_HOST}/${REGISTER_REPO}/${IMAGE_NAME}:${IMAGE_TAG_COMMIT}"
                                echo "Docker Deploy ${SERVICE_NAME}"
                                sh "docker compose -p ${PROJECT_NAME}_${PROFILE_NAME} up -d ${SERVICE_NAME}"
                            }
                        }

                        post {
                            success {
                                FeiShu(1,SERVICE_NAME)
                            }
                        }

                    }

                }

                post {
                    unstable {
                        FeiShu(2,SERVICE_NAME)
                    }
                    failure {
                        FeiShu(3,SERVICE_NAME)
                    }
                }

            }
        }

    }

}
