使用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 ...
随机推荐
- SCTF2018-Event easiest web - phpmyadmin
6月19日的SCTF的web送分题. 打开链接是一个phpmyadmin的登陆界面,尝试用默认账号:root 密码:root登陆 于是直接进去了,首先看下数据库,除了些初始化的库以外,abc这个库比 ...
- 1,EasyNetQ-链接到RabbitMQ
一.链接到RabbitMQ 1,创建连接 注意不能有空格 var bus = RabbitHutch.CreateBus(“host=myServer;virtualHost=myVirtualHos ...
- Vakuum开发笔记01 开天辟地
1.缘起 先驱--COGS 早在2008年,我自学PHP后开发了COGS,并成功用于学校内部的OJ,ruvtex.也曾经对外开放过,但是由于学校网络不稳定,后来一直连不上了.我还把COGS推荐给了OO ...
- 在JavaScript中什么时候使用==是正确的?
在JavaScript中什么情况下使用==是正确的?简而言之:没有.这篇文章来看五种情况下总是使用===,并且解释为什么不用==. JavaScript有两种操作符用来比较两个值是否相等 [1]: 严 ...
- hdu 5753 Permutation Bo 水题
Permutation Bo 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...
- 外键的约束(Mysql、PostgreSQL)
关于外键是什么,具体不再详述,可以自行百度. 讲一下关于外键的 On Delete和On Update的使用 最近在项目的表中看到这些,不懂顺便查了查: ONSTRAINT "c_clust ...
- MikroTik RouterOS 5.x破解工具HunterTik
HunterTik目前网络上流传的版本大概就两个版本2.3.1和2.3.1.1,其实效果基本一致,都是不能破解高版本的RouterOS,比如6.6以后的版本就不行了. 一.安装: 一路回车! 二.可以 ...
- CentOS 7开机不执行/etc/rc.local的解决方法
该死的CentOS 7居然开机不执行/etc/rc.local!!!!! 解决: chmod +x /etc/rc.d/rc.local 问题分析: 其实在/etc/rc.lacal文件上已经说明了, ...
- C#网络编程技术FastSocket实战项目演练
一.FastSocket课程介绍 .NET框架虽然微软提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包.组包.粘包.维护连接列表等,UDP协议需要处理丢包.乱序,而 ...
- 未经处理的异常:System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试
报错:未经处理的异常:System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试 → 尝试以"管理员身份"运行程序, ...