SpringBoot 3 生产 K8s 部署手册
1. Jenkins 全局工具配置
| 工具 |
版本 |
安装方式 |
备注 |
| JDK |
17 |
自动安装 |
命名 jdk17 |
| Maven |
3.9.5 |
自动安装 |
命名 maven3.9.5 |
路径:
Manage Jenkins → Global Tool Configuration → 分别新增 JDK & Maven,Name 必须与 pipeline 中 tools 块保持一致。
2. 基础镜像准备(openjdk:17-slim)
1 2 3 4 5 6 7 8 9
| docker pull openjdk:17-slim
docker tag openjdk:17-slim 172.31.10.118/library/openjdk:17-slim
docker login 172.31.10.118 -u admin -p Harbor12345 docker push 172.31.10.118/library/openjdk:17-slim
|
3. Jenkins 流水线(完整 Jenkinsfile)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| pipeline { agent any
tools { jdk 'jdk17' maven 'maven3.9.5' }
environment { docker_directory = 'docker' serverport = '' }
stages { stage('SCM') { steps { checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xjcares_git', url: 'http://172.31.70.132:33788/xjcares/xjkygpt.git']]]) sh 'echo "nodefinished:<$(date +\'%Y-%m-%d %H:%M:%S\')>"' } }
stage('Build core') { steps { sh ''' cd core-paas-component mvn clean deploy -Dmaven.test.skip=true -U ''' sh 'echo "nodefinished:<$(date +\'%Y-%m-%d %H:%M:%S\')>"' } }
stage('Build') { steps { sh ''' cd ${module} mvn clean package -Dmaven.test.skip=true -U ''' sh 'echo "nodefinished:<$(date +\'%Y-%m-%d %H:%M:%S\')>"' } }
stage('Build & Push Image') { steps { sh ''' docker login -u admin -p Harbor12345 172.31.10.118 cd ${module}/target
BUILD_TAG=$(date +%Y%m%d-%H%M%S)-${BUILD_NUMBER} REPOSITORY=172.31.10.118/xjcares/${module}:${BUILD_TAG} JAR_FILE=$(ls *.jar | head -n 1)
cat > Dockerfile <<EOF FROM 172.31.10.118/library/openjdk:17-slim ENV TZ=PRC RUN ln -snf /usr/share/zoneinfo/\$TZ /etc/localtime && echo \$TZ > /etc/timezone ADD ${JAR_FILE} /${module}.jar ENTRYPOINT ["java","-jar","-Xms${memory}","-Xmx${memory}","-Denv=pro","/${module}.jar","--spring.profiles.active=prod"] EOF
docker build -t $REPOSITORY . docker push $REPOSITORY echo "$REPOSITORY" > ../../IMAGE_TAG.txt docker logout 172.31.10.118 docker rmi $REPOSITORY ''' } }
stage('Deploy to K8s') { steps { kubeconfig(caCertificate: '', credentialsId: 'snowlotus-kubeconfig', serverUrl: '') { sh ''' cd ${module}/target/classes prop_value=$(grep -w ^server.port application.properties | cut -d= -f2) cd ../../..
NEW_IMAGE_TAG=$(cat IMAGE_TAG.txt)
sed -i "s|IMAGE_PLACEHOLDER|${NEW_IMAGE_TAG}|g" podTemplate.yaml sed -i "s|PODNAME|${module}|g" podTemplate.yaml sed -i "s|PORT|${prop_value}|g" podTemplate.yaml sed -i "s|INSTANCENUM|${instanceNum}|g" podTemplate.yaml
kubectl delete -f podTemplate.yaml --ignore-not-found=true kubectl apply -f podTemplate.yaml ''' } } } }
post { always { cleanWs() } } }
|
4. SpringBoot 2 → 3