使用TortoiseSVN的客户端钩子脚本触发Jenkins构建
我们项目在开发过程中使用了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&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中是否触发了构建。如果成功触发了构建,控制台输出应该如下:

参考
使用TortoiseSVN的客户端钩子脚本触发Jenkins构建的更多相关文章
- Gitlab自动触发Jenkins构建打包
一.目的 在部门的测试环境中,开发人员一旦向gitlab仓库提交成功代码,gitlab就会自动触发jenkins构建项目.当然在构建后还可以添加项目部署或者自动化测试的脚本.这里只针对测试环境. 二. ...
- 持续集成之④:GitLab触发jenkins构建项目
持续集成之④:GitLab触发jenkins构建项目 一:目的为在公司的测试环境当中一旦开发向gitlab仓库提交成功代码,gitlab通知jenkins进行构建项目.代码质量测试然后部署至测试环境, ...
- Jenkins 实现Gitlab事件自动触发Jenkins构建及钉钉消息推送
实现Gitlab事件自动触发Jenkins构建及钉钉消息推送 实践环境 GitLab Community Edition 12.6.4 Jenkins 2.284 Post build task 1. ...
- 通过URL触发Jenkins构建
用Jenkins做持续集成时,一般会使用webhooks触发构建,或者定时构建,这里记录用URL的方式触发Jenkins构建. Note: This assumes you're using Jenk ...
- 配置GitLab Push 自动触发Jenkins构建
配置GitLab Push 自动触发Jenkins构建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客是对之前的笔记:https://www.cnblogs.com/yin ...
- Git提交代码自动触发JenKins构建项目
1.需求场景 用户提交代码后自动触发jenkins构建项目 流程图如下: 2.JenKins安装Gitlab Hook Plugin插件 3.JenKins配置 4.Gitlab Hook Plugi ...
- GitLab 自动触发 Jenkins 构建
GitLab 是当前应用非常广泛的 Git Hosting 工具,Jenkins 是非常牛逼的持续集成工具.尽管 GitLab 有内建的 GitLab CI,但它远没有 Jenkins 那么强大好用. ...
- Gitlab自动触发Jenkins构建项目
Gitlab自动触发Jenkins构建项目 一.前提 Gitlab已安装配置好. Jenkins已安装Gitlab plugin. 二.配置jenkins中Job 1.勾选触发器下的gitlab触发器 ...
- jira 改变issue状态触发jenkins构建/发布
目录 jira中issue状态的改变触发Jenkins构建 jira中定制新的workflow,作为jenkins发布使用流程 大家可以参考我的这个workflow 设置workflow 使用Tran ...
随机推荐
- 垂直居中Demo
换行文字垂直居中1 换行文字垂直居中,兼容所有浏览器 换行文字垂直居中2 换行文字垂直居中,兼容所有浏览器 固定宽高图片垂直居中1 固定宽高图片垂直居中2 图片自适应容器宽高垂直居中 CSS3垂直居中 ...
- npm 升级自身
用cue-cli 生成新项目 提示升级npm 解决方案: npm install -g npm 呵呵呵,简直太简单了 然而今天是2016.11.11
- CentOS 7 yum 安装subversion
yum list installed | grep subversionyum install subversioncd /var/wwwsvn -hsvn co svn://121.196.226. ...
- [Java]jdbc[转]
>>http://www.cnblogs.com/xiohao/p/3507483.html >>http://www.cnblogs.com/hongten/archive/ ...
- Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem G. k-palindrome dp
Problem G. k-palindrome 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c7022 ...
- 移动端web,tap与click事件
一.tap与click的区别 两者都会在点击时系统自动触发,但是在手机WEB端,click会有 200~300 ms.延迟来自判断双击和长按,因为只有默认等待时间结束以确定没有后续动作发生时,才会触发 ...
- oracle linux dtrace
http://docs.oracle.com/cd/E37670_01/E38608/html/pref.html
- 得到Revit子窗体
start /// <summary> /// 得到主窗体句柄 /// </summary> /// <returns></returns> publi ...
- C#中如何选择使用T[]或List<T>
当有一组数据需要存放,到底是使用T[]呢,还是选择List<T>呢? 先来看数组. 所有的数组类型都隐式地从System.Array这个抽象类派生,而System.Array又派生自Sys ...
- 用DELPHI 开发压缩、解压、自解压、加密
引 言:在日常中,我们一定使用过WINZIP.WINRAR这样的出名的压缩软件,就是我们开发软件过程中不免要遇到数据加密.数据压缩的问题!本文中就这一技术问题展开探讨,同时感谢各位网友的技巧,在我每次 ...