自动触发构建
之前的构建都是采用手动选择分支进行构建的,实际使用时,项目可能有很多,如果都是手动触发可能比较消耗人力。所以推荐可以按需配置自动触发,即提交代码后自动触发 Jenkins 进 行构建任务。
本次用 Java 项目进行演示。首先找到 Java 项目的 Job,点击
Configure
;选择
Build Triggers
,勾选Build when a change...
,记录 webhook URL:
点击
Advanced
,进入分支配置这里选择
Allow all branches
,如果不想任何分支都可以触发该流水线,可以选择 Filter 进行条件匹配。之后点击Generate
生成Secret token
,最后点击 Save 即可。
接下来配置 GitLab,首先点击
Menu
–>Admin
选择
Settings
–>Network
–>Outbound requests
–> 勾选Allow requests to the local network from web hooks and services
保存配置之后,找到 Java 项目,点击 Settings –> WebHooks:
在新页面中输入 WebHook 地址和 token
确认无误后点击 Add webhook
之后会在下方出现新添加的 Project Hooks,可以点击 Test 进行 push 测试
点击 Test –> Push event 之后,即可在 Jenkins 上看到任务被触发
也可以通过 Blue Ocean 看到是自动触发的 stage 被执行
以上就是通过 GitLab 的事件触发 Jenkins 任务,在实际使用时,此功能非常常用,一般会用于开发、测试等环境,省去了手动构建的过程。而在 UAT 和生产环境,一般不需要再次构建,而是选择其它环境产生的镜像进行发版,接下来看一下如何进行不构建进行发版。
一次构建多次部署
创建一个新的 Job,名字为 sprint-boot-project-uat,类型为 Pipeline
点击页面的 This Project is parameterized(参数化构建),选择参数类型为 Image Tag Parameter(需要安装
Image Tag Parameter Plugin
插件)
定义 Name 为变量的名称,Image Name 为 Harbor 的目录和镜像名称
点击
Advanced
,输入 harbor 仓库地址,以及选择 harbor 的凭证。(注意: 如果配置了证书,需要配置 https)
点击 Save,然后测试能否获取到进行 Tag。保存后点击
Build with Parameters
如果可以获取到镜像的 tag,则点击 Configure,添加 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
77pipeline {
agent {
kubernetes {
cloud 'kubernetes-test'
slaveConnectTimeout 1200
yaml '''
apiVersion: v1
kind: Pod
spec:
containers:
# 只需要配置 jnlp 和 kubectl 镜像即可
- image: \'registry.cn-beijing.aliyuncs.com/citools/jnlp:alpine\'
imagePullPolicy: IfNotPresent
name: jnlp
args: [\'$(JENKINS_SECRET)\', \'$(JENKINS_NAME)\']
volumeMounts:
- mountPath: "/etc/localtime"
name: "localtime"
readOnly: false
- image: "registry.cn-beijing.aliyuncs.com/citools/kubectl:self-1.17"
imagePullPolicy: "IfNotPresent"
name: "kubectl"
command:
- "cat"
env:
- name: "LANGUAGE"
value: "en_US:en"
- name: "LC_ALL"
value: "en_US.UTF-8"
- name: "LANG"
value: "en_US.UTF-8"
tty: true
volumeMounts:
- mountPath: "/etc/localtime"
name: "localtime"
readOnly: false
restartPolicy: "Never"
nodeSelector:
build: "true"
securityContext: {}
volumes:
- hostPath:
path: "/usr/share/zoneinfo/Asia/Shanghai"
name: "localtime"
'''
}
}
stages {
stage('Deploy') {
environment {
MY_KUBECONFIG = credentials('kubernetes-test')
}
steps {
container(name: 'kubectl'){
sh """
# 该变量即为前台选择的镜像
echo ${IMAGE_TAG}
kubectl --kubeconfig=${MY_KUBECONFIG} \
set image deployment -l app=${IMAGE_NAME} \
${IMAGE_NAME}=${HARBOR_ADDRESS}/${IMAGE_TAG} \
-n ${NAMESPACE}
kubectl --kubeconfig=${MY_KUBECONFIG} \
get pod -l app=${IMAGE_NAME} \
-n ${NAMESPACE} -w
"""
}
}
}
}
environment {
HARBOR_ADDRESS = "harbor.china-snow.net"
NAMESPACE = "kubernetes"
IMAGE_NAME = "spring-boot-project"
TAG = ""
}
}点击保存后,选择一个镜像 build,即可看到是直接将镜像版本更新至 Kubernetes,并无构建过程,可以省下很多时间。该流水线也可以选择之前的版本进行回滚操作。