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
# 1. 拉取官方镜像
docker pull openjdk:17-slim

# 2. 重打 tag(指向私有 Harbor)
docker tag openjdk:17-slim 172.31.10.118/library/openjdk:17-slim

# 3. 登录并推送
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