#!/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发版结果:成功!\\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发版结果:失败!\\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 }