jenkins gitlab nexus3/harbor 此类清单已有,安装部署不再叙述

我这里ci/cd都在Jenkins同一个job内完成。如果ci/cd都在Jenkins中完成的话,正常的gitops应是ci/cd分为两个pipeline job完成,并通过gitlab webhook进行提交自动触发构建部署;或者ci在Jenkins中完成,cd通过argocd来完成纯自动化的devops。

我这里没有使用纯自动化的原因是,不太喜欢纯自动化。后续会把这个文档gitlab配置nexus3/harbor配置完善起来。同时也写一下上边我说的Jenkins分为ci/cd两个job纯自动化构建部署,很ci使用jenkins,cd采用argocd。

需准备:
用于提交开发代码的gitlab代码仓库(拉取代码 => 编译源码 => 通过dockerfile打包镜像推送至仓库)

用于存放yaml/helm资源清单配置文件(拉取配置清单 => sed修改镜像版本 => kubectl apply滚动更新或 rollback回滚)

Github: https://github.com/alexclownfish/jenkins_pipline
资源清单均在以上github地址

  • 版本发布失败/成功推送钉钉
  • 版本回滚成功/失败推送钉钉
  • 构建stage过程成功/失败推送钉钉

    jenkins 所需插件

    网络延迟大下载慢,可以到下边地址下载,再load到jenkins
    https://updates.jenkins-ci.org/download/plugins/
    1
    2
    3
    4
    5
    6
    Docker plugin
    Kubernetes plugin
    Kubernetes CLI Plugin
    DingTalk
    GitLab Plugin
    Localization: Chinese (Simplified)

    kubernetes clouds 配置

    添加kubernetes clouds

    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Pod Templates

在这里插入图片描述

jenkins-slave

在这里插入图片描述

maven-3.6

在这里插入图片描述
在这里插入图片描述

docker-and-maven 继承maven-3.6,挂载docker.sock以便后续docker.build

在这里插入图片描述
在这里插入图片描述

kubectl (用于kubectl apply 滚动更新)

在这里插入图片描述

docker-and-maven-and-kubectl 继承docker-and-maven

在这里插入图片描述

pipeline to dingding

在这里插入图片描述

凭据

在这里插入图片描述

Job 配置

参数化构建 (版本回滚)

在这里插入图片描述

pipeline as vscode

将pipeline 以Jenkinsfile形式存放到代码仓库

在这里插入图片描述

配置Pipeline script from SCM (pipeline从代码仓库检出)

在这里插入图片描述

PIPELINE

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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
pipeline {
environment {
appName = "spring-boot-helloword"
appVersion = "v1.0.3"
registryCredential = "nexus3-admin"
registry = "http://sonatype-nexus.cicd.svc.cluster.local:8082"
STATUS_URL = "http://xxx/job/spring-boot-helloword/${BUILD_NUMBER}/"
CONSOLE_URL = "http://xxx/job/spring-boot-helloword/${BUILD_NUMBER}/console"
}
agent {
kubernetes {
inheritFrom 'docker-and-maven-and-kubectl'
}
}

stages {
stage ("PULL CODES FROM CANGKU") {
when {
environment name: 'action',value: 'deploy'
}
steps {
git branch: 'master', url: 'http://gitlab.cicd.svc.cluster.local:31080/root/spring-boot-demo.git'
}
post {
failure {
dingtalk (
robot: '1174f280-4f5a-43e7-aa2f-a062c3808993',
type: 'MARKDOWN',
title: 'spring-boot项目',
text: [
'### Jenkins_job_spring-boot',
'---',
'- 状态:<font color=#FF0000 >${appName}拉取代码失败</font>',
'- 版本:${BUILD_NUMBER}',
'- [查看部署详情](${STATUS_URL})',
'- [查看日志Console](${CONSOLE_URL})'
],
at: [
'15737927244'
]
)
}
}
}
stage ("BUILD JAR") {
when {
environment name: 'action',value: 'deploy'
}
steps {
container ('maven') {
sh 'mvn clean test package'
}
}
post {
failure {
dingtalk (
robot: '1174f280-4f5a-43e7-aa2f-a062c3808993',
type: 'MARKDOWN',
title: 'spring-boot项目',
text: [
'### Jenkins_job_spring-boot',
'---',
'- 状态:<font color=#FF0000 >${appName}代码编译失败</font>',
'- 版本:${BUILD_NUMBER}',
'- [查看部署详情](${STATUS_URL})',
'- [查看日志Console](${CONSOLE_URL})'
],
at: [
'15737927244'
]
)
}
}
}
stage ("BUILDING APP IMAGE") {
when {
environment name: 'action',value: 'deploy'
}
steps {
container ('docker') {
script {
dockerImage = docker.build appName + ":" + appVersion + "-" + BUILD_NUMBER
}
}
}
post {
failure {
dingtalk (
robot: '1174f280-4f5a-43e7-aa2f-a062c3808993',
type: 'MARKDOWN',
title: 'spring-boot项目',
text: [
'### Jenkins_job_spring-boot',
'---',
'- 状态:<font color=#FF0000 >${appName}镜像打包失败</font>',
'- 版本:${BUILD_NUMBER}',
'- [查看部署详情](${STATUS_URL})',
'- [查看日志Console](${CONSOLE_URL})'
],
at: [
'15737927244'
]
)
}
}
}
stage ("Push App Image") {
when {
environment name: 'action',value: 'deploy'
}
steps {
container('docker') {
script {
docker.withRegistry(registry,registryCredential) {
dockerImage.push()
}
}
}
}
post {
failure {
dingtalk (
robot: '1174f280-4f5a-43e7-aa2f-a062c3808993',
type: 'MARKDOWN',
title: 'spring-boot项目',
text: [
'### Jenkins_job_spring-boot',
'---',
'- 状态:<font color=#FF0000 >${appName}推送镜像失败</font>',
'- 版本:${BUILD_NUMBER}',
'- [查看部署详情](${STATUS_URL})',
'- [查看日志Console](${CONSOLE_URL})'
],
at: [
'15737927244'
]
)
}
}
}
stage('Pull Source Config File') {
steps {
git branch: 'master',url:'http://gitlab.cicd.svc.cluster.local:31080/root/spring-boot-deploy.git'
}
post {
failure {
dingtalk (
robot: '1174f280-4f5a-43e7-aa2f-a062c3808993',
type: 'MARKDOWN',
title: 'spring-boot项目',
text: [
'### Jenkins_job_spring-boot',
'---',
'- 状态:<font color=#FF0000 >${appName}配置清单拉取失败</font>',
'- 版本:${BUILD_NUMBER}',
'- [查看部署详情](${STATUS_URL})',
'- [查看日志Console](${CONSOLE_URL})'
],
at: [
'15737927244'
]
)
}
}
}
stage('Apply App Yaml') {
when {
environment name: 'action',value: 'deploy'
}
steps {
container('kubectl') {
withKubeConfig([credentialsId: 'k8s-cluster-admin-kubeconfig-file']) {
sh '''
sed -ri "s@image: .*@image: sonatype-nexus.cicd.svc.cluster.local:8082/${appName}:${appVersion}-${BUILD_NUMBER}@g" deploy/03-deployment.yaml
kubectl apply -f deploy/ --record
'''
}
}
}
post {
success {
dingtalk (
robot: '1174f280-4f5a-43e7-aa2f-a062c3808993',
type: 'ACTION_CARD',
title: 'spring-boot项目',
text: [
'### Jenkins_job_spring-boot',
'---',
'- 状态:<font color=#00CD00 >${appName}滚动更新成功</font>',
'- 版本:${BUILD_NUMBER}',
'- [查看部署详情](${STATUS_URL})',
'- [查看日志Console](${CONSOLE_URL})'
],
at: [
'15737927244'
]
)
}
failure {
dingtalk (
robot: '1174f280-4f5a-43e7-aa2f-a062c3808993',
type: 'MARKDOWN',
title: 'spring-boot项目',
text: [
'### Jenkins_job_spring-boot',
'---',
'- 状态:<font color=#FF0000 >${appName}滚动更新失败</font>',
'- 版本:${BUILD_NUMBER}',
'- [查看部署详情](${STATUS_URL})',
'- [查看日志Console](${CONSOLE_URL})'
],
at: [
'15737927244'
]
)
}
}
}
stage('Rollback') {
when {
environment name: 'action',value: 'rollback'
}
steps {
container('kubectl') {
withKubeConfig([credentialsId: 'k8s-cluster-admin-kubeconfig-file']) {
sh '''
sed -ri "s@image: .*@image: sonatype-nexus.cicd.svc.cluster.local:8082/${appName}:${appVersion}-${BUILD_NUMBER}@g" deploy/03-deployment.yaml
kubectl apply -f deploy/ --record
'''
}
}
}
post {
success {
dingtalk (
robot: '1174f280-4f5a-43e7-aa2f-a062c3808993',
type: 'MARKDOWN',
title: 'spring-boot项目',
text: [
'### Jenkins_job_spring-boot',
'---',
'- 状态:<font color=#00CD00 >${appName}回滚成功</font>',
'- 版本:${BUILD_NUMBER}',
'- [查看部署详情](${STATUS_URL})',
'- [查看日志Console](${CONSOLE_URL})'
],
at: [
'15737927244'
]
)
}
failure {
dingtalk (
robot: '1174f280-4f5a-43e7-aa2f-a062c3808993',
type: 'MARKDOWN',
title: 'spring-boot项目',
text: [
'### Jenkins_job_spring-boot',
'---',
'- 状态:<font color=#FF0000 >${appName}回滚失败</font>',
'- 版本:${BUILD_NUMBER}',
'- [查看部署详情](${STATUS_URL})',
'- [查看日志Console](${CONSOLE_URL})'
],
at: [
'15737927244'
]
)
}
}
}
}
}