使用Jenkinsfile类前端项目的部署与回滚
文章发布较早,内容可能过时,阅读注意甄别。
PHP 项目的发布实际上是超级简单的,无非就是将项目代码同步到远程主机的应用目录即可,实际生产中,有不少与此类似的同类项目,也都可以借鉴如下的思路。
因为配置比较简单了,这里就不再赘述,不清楚的同学可以参考这里:https://wiki.eryajf.net/pages/3304.html
直奔主题,列出核心构建文件内容,前边文章看过,一些内容就比较熟悉了,这里就不重复介绍了,只说明一下值得注意的点。
pipeline {
agent any
environment {
// 定义项目名称方便全局引用
project = "test-php"
// 远程主机地址,这里只演示了一台,如果是多台,可以空格继续写,下边的部署嵌套个for循环即可
remote_ip = "192.168.0.1"
remote_dir = "/data/www/test-php"
}
options {
timestamps()
disableConcurrentBuilds()
timeout(time: 10, unit: 'MINUTES')
buildDiscarder(logRotator(numToKeepStr: '10'))
}
triggers{
gitlab( triggerOnPush: true,
triggerOnMergeRequest: true,
branchFilterType: 'All',
secretToken: "${env.git_token}")
}
// 这里使用参数化构建的方式,而没有使用input参数,下边会说明一下原因。
parameters {
choice(name: 'MODE', choices: ['deploy','rollback'], description: '请选择发布或者回滚?')
}
stages {
stage('部署') {
when {
environment name: 'MODE',value: 'deploy'
}
steps {
script {
try {
sh '''
ssh -p 10022 root@$remote_ip "mkdir -p /media/${project}"
rsync -avz -e 'ssh -p 34222' --exclude='Jenkinsfile' --delete ${WORKSPACE}/ root@$remote_ip:/media/${project}/${BUILD_ID}
ssh -p 10022 root@$remote_ip "rm -rf $remote_dir && ln -s /media/${project}/${BUILD_ID} $remote_dir"
'''
} catch(err) {
echo "${err}"
}
}
}
}
stage('回滚') {
when {
environment name: 'MODE',value: 'rollback'
}
steps {
script {
try {
sh '''
last_success=$(ssh -p 10022 root@$remote_ip "ls -lt /media/${project} | sed -n '3p'" | awk '{print \$9}')
ssh -p 10022 root@$remote_ip "rm -rf $remote_dir && ln -s /media/${project}/${last_success} $remote_dir"
'''
} catch(err) {
echo "${err}"
}
}
}
}
stage('清理工作空间') {
steps {
echo '清理工作空间'
cleanWs()
}
}
}
post {
success {
dingTalk accessToken:'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxx',
imageUrl:'https://ae01.alicdn.com/kf/Hdfe28d2621434a1eb821ac6327b768e79.png',
jenkinsUrl: "${env.JENKINS_URL}",
message:'构建成功 ✅',
notifyPeople:'李启龙'
}
failure {
dingTalk accessToken:'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxx',
imageUrl:'https://ae01.alicdn.com/kf/Hdfe28d2621434a1eb821ac6327b768e79.png',
jenkinsUrl: "${env.JENKINS_URL}",
message:'构建失败 ❌',
notifyPeople:'李启龙'
}
}
}
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
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
原本打算通过 input 来定义部署与回滚的参数,又想结合 when 这种判断来进行,结果发现目前 when 支持的参数项还非常有限,因此这条路恐怕是不太好走了,而我又不太想用 if 的那种判断,于是只得将 input 参数化构建改成了常规的参数化构建。
配置中添加了 push 代码自动构建,比较方便,但是慎重直接在线上环境中引用自动构建功能,因为经我测试,尽管开启了参数化构建,那么默认触发之后,是自动选择部署的。
部署与回滚的方案参考了瓦力的软链的思路,这样回滚起来,似乎也变得相对简单了。
最后的通知功能,当然是交给熟悉的钉钉啦!
上次更新: 2024/11/19, 23:11:42