我们项目在开发过程中使用了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中是否触发了构建。如果成功触发了构建,控制台输出应该如下:

参考

使用TortoiseSVN的客户端钩子脚本触发Jenkins构建的更多相关文章

  1. Gitlab自动触发Jenkins构建打包

    一.目的 在部门的测试环境中,开发人员一旦向gitlab仓库提交成功代码,gitlab就会自动触发jenkins构建项目.当然在构建后还可以添加项目部署或者自动化测试的脚本.这里只针对测试环境. 二. ...

  2. 持续集成之④:GitLab触发jenkins构建项目

    持续集成之④:GitLab触发jenkins构建项目 一:目的为在公司的测试环境当中一旦开发向gitlab仓库提交成功代码,gitlab通知jenkins进行构建项目.代码质量测试然后部署至测试环境, ...

  3. Jenkins 实现Gitlab事件自动触发Jenkins构建及钉钉消息推送

    实现Gitlab事件自动触发Jenkins构建及钉钉消息推送 实践环境 GitLab Community Edition 12.6.4 Jenkins 2.284 Post build task 1. ...

  4. 通过URL触发Jenkins构建

    用Jenkins做持续集成时,一般会使用webhooks触发构建,或者定时构建,这里记录用URL的方式触发Jenkins构建. Note: This assumes you're using Jenk ...

  5. 配置GitLab Push 自动触发Jenkins构建

    配置GitLab Push 自动触发Jenkins构建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客是对之前的笔记:https://www.cnblogs.com/yin ...

  6. Git提交代码自动触发JenKins构建项目

    1.需求场景 用户提交代码后自动触发jenkins构建项目 流程图如下: 2.JenKins安装Gitlab Hook Plugin插件 3.JenKins配置 4.Gitlab Hook Plugi ...

  7. GitLab 自动触发 Jenkins 构建

    GitLab 是当前应用非常广泛的 Git Hosting 工具,Jenkins 是非常牛逼的持续集成工具.尽管 GitLab 有内建的 GitLab CI,但它远没有 Jenkins 那么强大好用. ...

  8. Gitlab自动触发Jenkins构建项目

    Gitlab自动触发Jenkins构建项目 一.前提 Gitlab已安装配置好. Jenkins已安装Gitlab plugin. 二.配置jenkins中Job 1.勾选触发器下的gitlab触发器 ...

  9. jira 改变issue状态触发jenkins构建/发布

    目录 jira中issue状态的改变触发Jenkins构建 jira中定制新的workflow,作为jenkins发布使用流程 大家可以参考我的这个workflow 设置workflow 使用Tran ...

随机推荐

  1. Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】

    No cross,no crown . 不经历风雨,怎么见彩虹. Redis哨兵模式,用现在流行的话可以说就是一个"哨兵机器人",给"哨兵机器人"进行相应的配置 ...

  2. BeanUtils工具

    什么是BeanUtils工具 BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品. BeanUtils工具一般可以方便javaBean的哪些操作? 1)b ...

  3. UOJ.41.[清华集训2014]矩阵变换(稳定婚姻)

    题目链接 稳定婚姻问题:有n个男生n个女生,每个男/女生对每个女/男生有一个不同的喜爱程度.给每个人选择配偶. 若不存在 x,y未匹配,且x喜欢y胜过喜欢x当前的配偶,y喜欢x也胜过y当前的配偶 的完 ...

  4. SLAM(一)----学习资料整理

    转自:http://www.cnblogs.com/wenhust/ 书籍: 1.必读经典 Thrun S, Burgard W, Fox D. <Probabilistic robotics& ...

  5. nginx File not found 错误(转)

    当我没初始配在lnmp的时候,用浏览器打开查看php能否解析网页的时出现File not found 不用惊奇让我我们分析一下 使用php-fpm解析PHP,"No input file s ...

  6. .NET开源了,Visual Studio开始支持 Android 和 iOS 编程并自带Android模拟器

    北京时间今天凌晨的大会上,多少程序员的假想成为现实..NET 开源,集成 Clang 和 LLVM 并且自带 Android 模拟器,这意味着 Visual Studio 这个当下最好没有之一的 ID ...

  7. 关于bootstrap的treeview不显示多选(复选框)的问题,以及联动选择的问题,外加多选后取值

    最近做项目用到了treeview.因为涉及到多选的问题,很是棘手,于是乎,我决定查看原生JS,探个究竟.需要引用官方的bootstrap-treeview.js都知道吧,对于所需要引用的,我就不多说了 ...

  8. SOC 与 ARM

    SOC是指片上系统,意思是一个芯片就构成一个包括了存储.CPU.甚至还有AD.UART等等其他资源的系统!而ARM只是CPU的一种,有的片上系统是51.nios.PIC.等等不一而是!特别是nios, ...

  9. java中Keytool的使用总结

    以前用过几次这个东东,但每次都重新查询一次.本文原始出处是这里 . ----------------------------------------------------------- Keytoo ...

  10. NSArray进行汉字排序

    由于NSArray并不直接支持对汉字的排序,这就要通过将汉字转换成拼音完毕按A~Z的排序,这看起来是个头疼的问题.由于牵扯到汉字转为拼音,kmyhy给出一个较易实现的方法,获取汉字的首字的首字母,如将 ...