Jenkins-Springboot-2.0-bkg 6.36 KB
pipeline {
    agent any
    
    parameters {
        choice(
                description: '你需要选择哪个环境部署?',
                name: 'deploy_env',
                choices: ['release-test', 'release-integration', 'pre-release', 'production', 'springboot-qzc']
        )
    }
    //环境定义
    environment {
        //日志映射路径
        LOG_PATH = "/mnt/log/"
        //服务名称
        SVN_FOLD = readMavenPom().getArtifactId()
        SSH_PATH = "csbr5.4"
        //镜像版本号
        image_tag = readMavenPom().getVersion()
        //docker私服ip
        ip = "192.168.5.4:82"
        PROJECT_NAME = "${JOB_NAME.substring(0,JOB_NAME.lastIndexOf('/'))}"
        PROMETHEUS_PARAMS_STRING = "-javaagent:/jmx_prometheus_javaagent-0.17.0.jar=8088:/jmx/prometheus-jmx-config.yaml"
    }
    options {
        // 设置保留的最大历史构建数为6
        buildDiscarder(logRotator(numToKeepStr: '2'))
    }
    //全局定义工具
    tools {
        //工具名称必须在Jenkins 管理Jenkins → 全局工具配置中预配置。
        maven 'maven3'
    }
    stages {
        stage('release-test') {
                    when {
                        expression { return params.deploy_env == 'release-test' }
                    }
                    steps {
                        script {
                            env.SVN_TYPE = "test"
                        }
                    }
                }
        stage('release-integration') {
            when {
                expression { return params.deploy_env == 'release-integration' }
            }
            steps {
                script {
                    env.SVN_TYPE = "pre-test"
                }
            }
        }
        stage('pre-release') {
            when {
                expression { return params.deploy_env == 'pre-release' }
            }
            steps {
                script {
                    env.SVN_TYPE = "pre-release"
                    env.PROMETHEUS_PARAMS = "${PROMETHEUS_PARAMS_STRING}"
                }
            }
        }
        stage('production') {
            when {
                expression { return params.deploy_env == 'production' }
            }
            steps {
                script {
                    env.SVN_TYPE = "temp"
                    env.PROMETHEUS_PARAMS = "${PROMETHEUS_PARAMS_STRING}"
                }
            }
        }
        stage('springboot-qzc') {
            when {
                expression { return params.deploy_env == 'springboot-qzc' }
            }
            steps {
                script {
                    env.SVN_TYPE = "qzc"
                }
            }
        }
        //构建
        stage('Maven Build') {
            steps {
                //sh './gradlew build'
                //执行shell命令
                sh 'echo ${JAVA_HOMOE}'
                sh "mvn -f ./pom.xml clean package -Dmaven.test.skip=true -X  -P${params.deploy_env}"
                //sh 'mvn -f ${SVN_FOLD}/pom.xml clean package'
            }
        }
        stage('Docker Build') {
            steps {
                //分分支构建
                script {

                    //develop分支环境
                  echo 'start to deploy ${SVN_FOLD} on ${params.deploy_env} ...'
                    sh '''
                                    CID=$(docker ps -a | grep "${SVN_FOLD}" | awk '{print $1}')
                                    IID=$(docker images | grep "none" | awk '{print $3}')
                                    cp "$WORKSPACE"/target/"${SVN_FOLD}".jar "$WORKSPACE"
                                    if [ -n "$IID" ]; then
                                       echo "存在'${SVN_FOLD}'镜像,IID='$IID'"
                                       cd "$WORKSPACE"
                                       ##构建镜像到远程仓库
                                       docker login "${ip}" -u admin -p E6w611g864wQ2
docker build -t "${ip}"/csbr/"${SVN_FOLD}""-${SVN_TYPE}":"${image_tag}" . --build-arg CE="${SVN_TYPE}" --build-arg PROMETHEUS_PARAMS="${PROMETHEUS_PARAMS}"
                                       docker push "${ip}"/csbr/"${SVN_FOLD}""-${SVN_TYPE}":"${image_tag}"
                                    else
                                       echo "不存在'${SVN_FOLD}'镜像,开始构建镜像"
                                       ##构建镜像到远程仓库
                                       docker login "${ip}" -u admin -p E6w611g864wQ2
                                       docker build -t "${ip}"/csbr/"${SVN_FOLD}""-${SVN_TYPE}":"${image_tag}" . --build-arg CE="${SVN_TYPE}" --build-arg PROMETHEUS_PARAMS="${PROMETHEUS_PARAMS}"
                                       docker push "${ip}"/csbr/"${SVN_FOLD}""-${SVN_TYPE}":"${image_tag}"
                                    fi
                                    '''
                    echo 'Depoly ${SVN_FOLD} develop success ...'
                }
            }

        }
        //部署
        stage('Deploy') {
            steps {
                echo 'Deploying'
                //分分支部署
                script {

                    //develop分支环境
                  echo 'start to deploy ${SVN_FOLD} on ${params.deploy_env} ...'
                    //调用Publish Over SSH插件,上传docker-compose.yaml文件并且执行deploy脚本
                    sshPublisher(publishers: [sshPublisherDesc(configName: "csbr5.3", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: """
                            echo "日志路径 '$LOG_PATH''$SVN_FOLD'"
                            #使用k8s构建
                            kubectl delete -f /mnt/k8s/${params.deploy_env}/${SVN_FOLD}.yaml
                            kubectl apply -f /mnt/k8s/${params.deploy_env}/${SVN_FOLD}.yaml
                        """, execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/mnt/csbr/data', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'output/*.*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                    echo 'Depoly ${SVN_FOLD} success ...'

                }
                //sh './build.sh'
            }
        }
    }
    //归档
    post {
        always {
            echo 'Archive artifacts'
            archiveArtifacts artifacts: "**/target/*.jar", excludes: "**/target"
        }
    }
}