Jenkins是一款由Java编写的开源的持续集成工具。在与Oracle发生争执后,项目从Hudson项目复刻。
Jenkins提供了软件开发的持续集成服务。它运行在Servlet容器中(例如Apache Tomcat)。它支持软件配置管理(SCM)工具(包括AccuRev SCM、CVS、Subversion、Git、Perforce、Clearcase和RTC),可以执行基于Apache Ant和Apache Maven的项目,以及任意的Shell脚本和Windows批处理命令。Jenkins的主要开发者是川口耕介。Jenkins是在MIT许可证下发布的自由软件。
可以通过各种手段触发构建。例如提交给版本控制系统时被触发,也可以通过类似Cron的机制调度,也可以在其他的构建已经完成时,还可以通过一个特定的URL进行请求。
安装Jenkins
安装Jenkins的同时我们部署一个“节点”(slave),后期我们将这个“节点”信息配置在Jenkins中,让Jenkins在进行CI时就在这个“节点”中进行。
场景1:单机docker-compose部署
docker-compose.yml
文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16version: '3'
services:
jenkins:
restart: always
image: jenkinsci/jenkins:2.147-alpine
ports:
- "8080:8080"
volumes:
- ./data/jenkins_home:/var/jenkins_home
jenkins-slave:
restart: always
image: setzero/jenkins-slave:0.1.0
depends_on:
- jenkins
volumes:
- /var/run/docker.sock:/var/run/docker.sock启动命令
1
docker-compose up -d
场景2:Kubernetes集群部署
deploy.yml
文件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
106
107
108
109
110
111
112
113
114
115
116
117
118apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: jenkins
name: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
containers:
- image: jenkinsci/jenkins:2.147-alpine
imagePullPolicy: IfNotPresent
name: jenkins
ports:
- containerPort: 8080
protocol: TCP
resources:
limits:
memory: 3Gi
requests:
memory: 2Gi
volumeMounts:
- mountPath: /var/jenkins_home
name: jenkins
volumes:
- emptyDir: {}
name: jenkins
apiVersion: v1
kind: Service
metadata:
labels:
app: jenkins
name: jenkins
spec:
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: jenkins
type: ClusterIP
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
labels:
app: jenkins
name: jenkins
spec:
rules:
- host: 1.2.3.4.nip.io
http:
paths:
- backend:
serviceName: jenkins
servicePort: 8080
path: /
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: jenkins-slave
name: jenkins-slave
spec:
replicas: 1
selector:
matchLabels:
app: jenkins-slave
template:
metadata:
labels:
app: jenkins-slave
spec:
containers:
- image: setzero/jenkins-slave:0.1.0
imagePullPolicy: IfNotPresent
name: jenkins-slave
ports:
- containerPort: 22
protocol: TCP
resources:
limits:
memory: 2Gi
requests:
memory: 1Gi
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock
volumes:
- hostPath:
path: /var/run/docker.sock
name: docker-sock
apiVersion: v1
kind: Service
metadata:
labels:
app: jenkins-slave
name: jenkins-slave
spec:
ports:
- name: http
port: 22
protocol: TCP
targetPort: 22
selector:
app: jenkins-slave
type: ClusterIP部署命令
1
kubectl apply -f deploy.yml -n jenkins
配置Jenkins
Jenkins启动后需要到容器中cat
一下/var/jenkins_home/secrets/initialAdminPassword
文件,查看初始密码。
安装插件,选择默认的就好了
配置“节点”,在安装Jenkins时我们同时部署了一个slave容器,我们将后面CI时会使用到的工具全部打包到此镜像中,这样做的目的就在于后期进行迁移或者重新搭建一套时环境是一致的。通过菜单
系统管理
–>节点管理
–>New Node
这里slave容器的root用户默认密码为
root
,也可使用ROOT_PASSWORD
环境变量在启动slave容器时进行设置,关于Jenkins-slave镜像的更多信息请查看:https://github.com/TimeBye/jenkins-slave
查看连接状态
安装插件
实战
新建任务,选择
流水线
填写Gitlab仓库地址
生成Secret Token,等会儿Gitlab WebHook配置时会用到它
编写CI要执行的语句
在Gitlab中配置 WebHook
创建成功进行测试
Gitlab页面顶部出现测试结果
返回Jenkins就可以看到自动执行CI的记录了