#!/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
}