Akemi

jenkins构建pipeline项目到k8s

2024/10/15

jenkins与k8s的对接有多种方法:

jenkins与k8s的插件对接说明

使用clouds插件对接
在jenkins执行构建时,k8s上会运行一个jnlp节点,本质上是一种jenkins主从架构的slave节点

jnlp节点通过调用k8s的API,在k8s中创建资源

这种方法比较复杂,因为很多时候jnlp镜像都是需要自己装docker、maven和jdk环境的,还要调整jenkins的设置

jenkins与k8s的脚本对接说明

在k8s的master节点上创建jenkins的工作目录,将其作为jenkins-slave使用,写入脚本创建资源

流程说明:
添加jenkins-slave→git checkout→maven→docker build and push→k8s拉取images→创建资源文件→创建资源

pipeline脚本

我这里的环境和上一篇《jenkins构建pipeline项目到docker》一致,代码同样是用的hellowolrd的一个项目

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
node ("k8s-master") {
stage('git checkout') {
git branch: 'main', credentialsId: '3ecfd94e-fbba-458e-b3f6-4a65f5762751', url: 'http://gitlab.wangsheng.com/group01/java_discuz.git'
}
stage('maven build') {
sh '''export JAVA_HOME=/usr/java/jdk-11
/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true'''
}
stage('build and push images') {
sh '''docker pull 192.168.10.130/jenkins-demo/tomcat8:v1
cat > Dockerfile << EOF
FROM 192.168.10.130/jenkins-demo/tomcat8:v1
RUN rm -rf /usr/local/tomcat8/webapps/* && mkdir /usr/local/tomcat8/webapps/ROOT
ADD webapp/target/webapp.war /usr/local/tomcat8/webapps/hello-world.war
EOF
docker build -t 192.168.10.130/jenkins-demo/tomcat8-demo:latest .
docker push 192.168.10.130/jenkins-demo/tomcat8-demo:latest
'''
}
stage('镜像测试') { //测试镜像是否可以正常运行
sh '''docker rm -f jenkins-test | true'''
sh '''docker run -itd -p 8081:8080 --name jenkins-test 192.168.10.130/jenkins-demo/tomcat8-demo:latest /bin/bash'''
sh '''docker ps | grep -i -w -q jenkins-test && echo "deploy successfully"'''
sh '''docker rm -f jenkins-test'''
}
stage('传送镜像') {
sh '''docker save -o tomcat.tar.gz 192.168.10.130/jenkins-demo/tomcat8-demo:latest
scp tomcat.tar.gz ws-k8s-node1:/root/
ssh ws-k8s-node1 "ctr -n=k8s.io image import tomcat.tar.gz"'''
}
stage('dp资源文件') { // 该文件也可以放在项目中直接上传
sh '''cat > deployment.yaml<<EOF
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-dp
namespace: default
labels:
app: tomcat
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
name: tomcat-test
labels:
app: test
spec:
nodeName: ws-k8s-node1
containers:
- name: tomcat-dp1
image: 192.168.10.130/jenkins-demo/tomcat8-demo:latest
imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
targetPort: 8080
nodePort: 30080
selector:
app: test
EOF
'''
sh '''kubectl delete deployments.apps tomcat-dp| true''' //删除原有dp
sh '''kubectl apply -f deployment.yaml && echo "deploy sucessful" ''' //部署新dp
}
stage('页面测试') { //通过curl返回的http状态码判断网页状态
sh '''HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}\n" 192.168.10.131:30080/hello-world)
if [[ $HTTP_CODE =~ ^(200|301|302)$ ]];then
echo "operational testing sucessfully"
else echo "operational testing failed"
fi '''
}
}

CATALOG
  1. 1. pipeline脚本