我们项目在开发过程中使用了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
set current_path=%~dp0
python.exe %current_path%\post_commit_hook.py %*

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 -*-
 
import sys
import os
from shutil import copyfile
 
import json
import urllib2
 
if len(sys.argv) < 2:
    sys.exit()
 
current_path = os.path.dirname(os.path.abspath(__file__))
 
with open(current_path + '/post_commit.log','w') as f:
    f.write(str(sys.argv[1:]))
    
if len(sys.argv) < 7:
    sys.exit()
 
path = sys.argv[1]
depth = sys.argv[2]
message_file = sys.argv[3]
revision = sys.argv[4]
error = sys.argv[5]
cwd = sys.argv[6]
 
#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
try:
    if os.stat(error).st_size > 0:
       print "[INFO] error happened"
       sys.exit()
except OSError:
    # no such file, which should not happen
    print "[ERROR] no error file"
    sys.exit()
    
# if files include source files or project files, trigger ci build
source_extensions = ['.h', '.cpp', '.cc', '.c', '.vcxproj', '.vcxproj.filters']
 
def SourcePath(file_path):
    for extension in source_extensions:
        if file_path.endswith(extension):
            return True
 
    return False
 
source_changed = False
 
with open(path) as f:
    for line in f:
        if SourcePath(line.strip()):
            source_changed = True
            break;
 
if not source_changed:
    print "[INFO] source not changed"
    sys.exit()
    
print "[INFO] source changed"
 
jenkins_job_url = 'http://USER:USER_API_TOKEN@JENKINS_URL/job/JOB_NAME/buildWithParameters?token=TOKEN_NAME&cause=svn-post-commit'
 
req = urllib2.Request(jenkins_job_url )
response = urllib2.urlopen(req)
 
print "[INFO] response = " + str(response)

钩子脚本的主要工作如下:

1. 判断本次提交是否出错,如果有错误,说明提交未成功,退出脚本;
2. 遍历本次提交影响到的所有文件,如果包括源代码文件(‘.h’, ‘.cpp’, ‘.cc’, ‘.c’),或者项目配置文件(‘.vcxproj’, ‘.vcxproj.filters’),则说明需要触发构建,否则退出脚本;
3. 调用jenkins_job_url触发构建。

JENKINS JOB URL

钩子脚本中jenkins_job_url的定义如下:

 
1
jenkins_job_url = 'http://USER:USER_API_TOKEN@JENKINS_URL/job/JOB_NAME/buildWithParameters?token=TOKEN_NAME&amp;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中是否触发了构建。如果成功触发了构建,控制台输出应该如下:

参考

最新文章

  1. linux -a 到 -z 的意义
  2. LaTex Remove Left Margin 去除左边空间
  3. NS3 日志(Logging)、命令行参数、Tracing系统概述(转载)
  4. 设计模式(七)组合模式Composite(结构型)
  5. 如何配置Git支持大小写敏感和修改文件名中大小写字母呢?(转)
  6. poj3061尺取法
  7. 基于Accord.Audio和百度语言识别
  8. ElasticSearch 集群监控
  9. 最长连续子序列(dp,分而治之递归)
  10. ubuntu16.04 解决boot空间不足
  11. HTML一片空白, 无法渲染: Empty tag doesn&#39;t work in some browsers
  12. 什么是JWT
  13. macos 下安装virtualenv,virtualenvwrapper,然后在pycharm中正常配置方法日志
  14. MUI中等待框的H5实现
  15. java资料共享
  16. UESTC 1059 - 秋实大哥与小朋友
  17. LeetCode——Maximum Binary Tree
  18. Mac 下配置php环境
  19. epoll好文章
  20. java学习笔记—实现一个类MyInputStream(28)

热门文章

  1. Linux文件的所有权与权限
  2. 【bfs】BZOJ1102- [POI2007]山峰和山谷Grz
  3. HNOI 越狱
  4. USB组合设备 Interface Association Descriptor (IAD)
  5. layer.confirm 询问框 的层遮盖
  6. javascript循环性能比较
  7. chrome提示&quot;安装unity web player&quot;
  8. 在ASP.NET MVC4中实现同页面增删改查,无弹出框01,Repository的搭建
  9. 【Gitlab】从Gitlab拉取项目+往Gitlab发布项目 【GitLab自定义端口】
  10. [开源]Google code Android开源项目(一)