我们项目在开发过程中使用了Jenkins构建Windows版本,为了通过自动触发使构建的版本保持最新,可以采用的方法如下:
- Jenkins Poll SCM:设置Jenkins定时检查变更,在SVN版本号有变更的情况下执行构建;
- Jenkins Remote Trigger + SVN Post Commit Hook:配置SVN仓库的Post Commit Hook,在提交完成后触发Jenkins远程构建;
显然,第二种方法更可取一些。但是在公司内配置SVN Server Hooks需要申请权限和访问规则。
幸好,我们使用的TortoiseSVN支持客户端钩子脚本(Hook Scripts)。
客户端钩子脚本的类型和参数
TortoiseSVN的客户端钩子脚本支持以下几种类型:
我们需要的是Post-commit类型的脚本。在脚本执行的时候,TortoiseSVN会传递的参数信息如下:
这些参数的意义如下:
其中,PATH指向的文件包含了本次提交影响到的所有文件的路径,ERROR指向的文件包含了本次提交的错误信息。这两个参数是我们需要关心的。
Post-commit脚本
我们使用的脚本如下:
HOOKS/POST_COMMIT_HOOK.BAT
Python脚本的封装,内容如下:
|
1
2
|
~dp0
*
|
HOOKS/POST_COMMIT_HOOK.PY
实际的钩子脚本,内容如下:
|
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
|
#!/usr/bin/env python
# -*- coding:utf-8 -*-
sys
os
copyfile
json
urllib2
:
)
)
:
)
:
)
]
]
]
]
]
]
#copyfile(path, current_path + '/path.tmp')
#copyfile(message_file, current_path + '/message_file.tmp')
#copyfile(error, current_path + '/error.tmp')
# if error is not empty, the commit should not success
:
:
)
:
# no such file, which should not happen
)
# if files include source files or project files, trigger ci build
]
:
:
:
True
False
False
:
:
:
True
;
:
)
'http://USER:USER_API_TOKEN@JENKINS_URL/job/JOB_NAME/buildWithParameters?token=TOKEN_NAME&cause=svn-post-commit'
)
)
)
|
钩子脚本的主要工作如下:
1. 判断本次提交是否出错,如果有错误,说明提交未成功,退出脚本;
2. 遍历本次提交影响到的所有文件,如果包括源代码文件(‘.h’, ‘.cpp’, ‘.cc’, ‘.c’),或者项目配置文件(‘.vcxproj’, ‘.vcxproj.filters’),则说明需要触发构建,否则退出脚本;
3. 调用jenkins_job_url触发构建。
JENKINS JOB URL
钩子脚本中jenkins_job_url的定义如下:
|
1
|
'http://USER:USER_API_TOKEN@JENKINS_URL/job/JOB_NAME/buildWithParameters?token=TOKEN_NAME&cause=svn-post-commit'
|
其中的变量含义分别如下:
USER/USER_API_TOKEN
Jenkins用户名和对应的API TOKEN。
JENKINS_URL
Jenkins的访问路径。
JOB_NAME
项目名称。
TOKEN_NAME
在项目的远程构建中设置的身份验证,需要启用触发远程构建的选项。
设置钩子脚本
打开TortoiseSVN设置界面,选择钩子脚本:
点击增加,打开设置钩子脚本界面:
进行以下设置:
- 设置钩子类型为提交之后;
- 设置工作副本路径为trunk目录;
- 设置执行的命令行为post_commit_hook.bat;
- 选中运行时隐藏脚本和总是执行这些脚本选项,不要选中等待脚本运行结束选项。
验证构建
在提交版本后,检查Jenkins中是否触发了构建。如果成功触发了构建,控制台输出应该如下: