详细的钩子可以到SVN服务管理上找到管理hooks
同时我们创建了钩子脚本放入,SVN钩子管理就可以直接读取到我们的脚本。
通知脚本参数说明
1. %1:当前项目的SVN仓库地址。 2. %2:提交后的版本号。 3. CSCRIPT:CScript.exe的路径。 4. VBSCRIPT:同时jenkins的脚本路径。 5. SVNLOOK:svnlook.exe的路径。 6. JENKINS:jenkins服务地址。 7. AUTHORIZATIONN:用于授权token。svnlook是检验Subversion版本库不同方面的命令行工具。
创建一个vbs脚本用于执行通知。
repos = WScript.Arguments.Item(0) Wscript.Echo "repos="&repos rev = WScript.Arguments.Item(1) Wscript.Echo "rev="&rev svnlook = WScript.Arguments.Item(2) Wscript.Echo "svnlook="&svnlook jenkins = WScript.Arguments.Item(3) Wscript.Echo "jenkins="&jenkins authorization = WScript.Arguments.Item(4) Wscript.Echo "authorization="&authorization Set shell = WScript.CreateObject("WScript.Shell") Set uuidExec = shell.Exec(svnlook & " uuid " & repos) Do Until uuidExec.StdOut.AtEndOfStream uuid = uuidExec.StdOut.ReadLine() Loop Wscript.Echo "uuid=" & uuid Set changedExec = shell.Exec(svnlook & " changed --revision " & rev & " " & repos) Do Until changedExec.StdOut.AtEndOfStream changed = changed + changedExec.StdOut.ReadLine() + Chr(10) Loop Wscript.Echo "changed=" & changed url = jenkins + "crumbIssuer/api/xml?xpath=concat(//crumbRequestField,"":"",//crumb)" Wscript.Echo "url="&url Set http = CreateObject("MSXML2.ServerXMLHTTP") http.open "GET", url, False http.setRequestHeader "Content-Type", "text/plain;charset=UTF-8" if not authorization = "" then http.setRequestHeader "Authorization", "Basic " + authorization end if http.send crumb = null if http.status = 200 then crumb = split(http.responseText,":") end if Wscript.Echo crumb(0)&"="&crumb(1) url = jenkins + "subversion/" + uuid + "/notifyCommit?rev=" + rev Wscript.Echo url Set http = CreateObject("MSXML2.ServerXMLHTTP") http.open "POST", url, False http.setRequestHeader "Content-Type", "text/plain;charset=UTF-8" if not authorization = "" then http.setRequestHeader "Authorization", "Basic " + authorization end if if not isnull(crumb) then http.setRequestHeader crumb(0),crumb(1) end if http.send changed if http.status <> 200 then Wscript.Echo "Error. HTTP Status: " & http.status & ". Body: " & http.responseText end if示例使用的是Microsoft.XMLHTTP调用http请求,但是我本机发送会返回403错误,查到一篇msxml3.dll 错误 80070005 拒绝访问换为MSXML2.ServerXMLHTTP发送成功。
获取SVN版本库的UUID通过svnlook uuid REPOS-PATH获取版本库的唯一UUID
C:\Users\Dm_ca>"D:\Program Files\VisualSVN Server\bin\svnlook.exe" uuid "F:\Repositories\JenkinsTest" 3f64521c-9849-7c44-a469-468730bce0a2可以看到和SVN版本库的UUID一致
通过svnlook changed --revison REV REPOS-PATH获取版本库某个版本的改变项
C:\Users\Dm_ca>"D:\Program Files\VisualSVN Server\bin\svnlook.exe" changed --revision 50 "F:\Repositories\JenkinsTest" U trunk/JenkinsTest.Core/Jenkins.Core.Test/TestClass.cs 获取Jenkins-Crumb和方式一样。
提交build请求与客户端提交build请求不同,服务端是向${UUID}/notifyCommit?rev=$REV发送一个post请求。
服务端构建会显示SCM启动,和jenkins scm不同的是,不需要每分钟定时轮询,而是通过服务端钩子触发任务执行。
三种钩子比较 SCM轮询 客户端钩子 服务端钩子
脚本位置 无脚本 客户端post-commit钩子 服务端post-commit钩子
配置 需要在Build Triggers配置中勾选轮询 SCM,在Schedule配置输入计划规则 需要在Build Triggers配置中勾选Trigger builds remotely,设置Authentication Token 需要在Build Triggers配置中勾选轮询 SCM
防跨域攻击 无需考虑 支持,需要获取防跨域攻击的token 支持,需要获取防跨域攻击的token
通知方式 定时轮询 通过Remote access API调用主动构建 通过向Subversion Plugin发送请求主动构建
时效性 最快代码提交后1分钟触发 立即触发 立即触发
其他要求 无 无 需要安装Subversion Plugin插件,同时服务端执行脚本需要一些特殊权限
具体使用哪种方案根据上面表格选择即可。
结语最终我们的完整持续集成流程图如下图所示