我们项目在开发过程中使用了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. 垂直居中Demo

    换行文字垂直居中1 换行文字垂直居中,兼容所有浏览器 换行文字垂直居中2 换行文字垂直居中,兼容所有浏览器 固定宽高图片垂直居中1 固定宽高图片垂直居中2 图片自适应容器宽高垂直居中 CSS3垂直居中 ...

  2. npm 升级自身

    用cue-cli 生成新项目 提示升级npm 解决方案: npm install -g npm 呵呵呵,简直太简单了   然而今天是2016.11.11

  3. CentOS 7 yum 安装subversion

    yum list installed | grep subversionyum install subversioncd /var/wwwsvn -hsvn co svn://121.196.226. ...

  4. [Java]jdbc[转]

    >>http://www.cnblogs.com/xiohao/p/3507483.html >>http://www.cnblogs.com/hongten/archive/ ...

  5. 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 ...

  6. 移动端web,tap与click事件

    一.tap与click的区别 两者都会在点击时系统自动触发,但是在手机WEB端,click会有 200~300 ms.延迟来自判断双击和长按,因为只有默认等待时间结束以确定没有后续动作发生时,才会触发 ...

  7. oracle linux dtrace

    http://docs.oracle.com/cd/E37670_01/E38608/html/pref.html

  8. 得到Revit子窗体

    start /// <summary> /// 得到主窗体句柄 /// </summary> /// <returns></returns> publi ...

  9. C#中如何选择使用T[]或List<T>

    当有一组数据需要存放,到底是使用T[]呢,还是选择List<T>呢? 先来看数组. 所有的数组类型都隐式地从System.Array这个抽象类派生,而System.Array又派生自Sys ...

  10. 用DELPHI 开发压缩、解压、自解压、加密

    引 言:在日常中,我们一定使用过WINZIP.WINRAR这样的出名的压缩软件,就是我们开发软件过程中不免要遇到数据加密.数据压缩的问题!本文中就这一技术问题展开探讨,同时感谢各位网友的技巧,在我每次 ...