创建一个vbs脚本用于执行通知。
jenkins = WScript.Arguments.Item(0) Wscript.Echo "jenkins="&jenkins jobName = WScript.Arguments.Item(1) Wscript.Echo "token="&token token = WScript.Arguments.Item(2) Wscript.Echo "token="&token authorization = WScript.Arguments.Item(3) Wscript.Echo "authorization="&authorization 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 + "job/unittest/build?token=" + token Wscript.Echo 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 if not isnull(crumb) then http.setRequestHeader crumb(0),crumb(1) end if http.send Wscript.Echo "Status: " & http.status &"Body: " & http.responseText不同项目使用不同的post-commit.bat的脚本,脚本中设置JOB_NAME和JOB_TOKEN,不同项目最终都是调用上面的这个脚本进行远程构建。
获取Jenkins-Crumb我们先获取到Jenkins-Crumb获取到防跨域攻击token。通过向JENKINS_URL/crumbIssuer/api/xml发送一个post请求,获取到crumb。
发送的时候我们需要将Authorization加入到http头部。
提交build请求将获取到的Jenkins-Crumb:XXXXX加入到http头部,通过发送Get请求调用远程构建,触发成功会响应201的状态码。
关于远程调用更详细的文档说明可以查看Remote access API
通过上面的设置SVN客户端钩子远程构建就完成了,在项目中可以看到远程构建的标志。
相比SCM轮询,客户端远程构建实时性更高,由于是主动通知,因此代码提交完立刻可以触发远程构建。
SVN服务器钩子触发服务端钩子与客户端钩子类似,具体区别如下。
服务端与客户端钩子比较 客户端钩子 服务端钩子脚本位置 客户端post-commit钩子 服务端post-commit钩子
配置 需要在Build Triggers配置中勾选Trigger builds remotely,设置Authentication Token 需要在Build Triggers配置中勾选轮询 SCM
防跨域攻击 支持,需要获取防跨域攻击的token 支持,需要获取防跨域攻击的token
通知方式 通过Remote access API调用主动构建 通过向Subversion Plugin发送请求主动构建
其他要求 无 需要安装Subversion Plugin插件,同时服务端执行脚本需要一些特殊权限
创建服务端钩子脚本
每个版本库创建后都会自动生成一些文件夹和文件,hooks文件夹内就是存放了服务器端的钩子。我们将我们需要的钩子脚本根据命名规则放入hooks文件夹即可。
windows环境钩子命名规则为钩子名.bat或钩子名.exe,如post-commit.bat或post-commit.exe。
详情可以查看官方文档
创建服务端钩子脚本post-commit.bat。
SET REPOS=%1 SET REV=%2 SET CSCRIPT=%windir%\system32\cscript.exe SET VBSCRIPT=F:\Repositories\JenkinsTest\hooks\post-commit-svn-server.vbs SET SVNLOOK=D:\Program Files\VisualSVN Server\bin\svnlook.exe SET JENKINS=http://127.0.0.1:8080/ REM AUTHORIZATION: Set to "" for anonymous acceess REM AUTHORIZATION: Set to encoded Base64 string, generated from "user_id:api_token" REM found on Jenkins under "user/configure/API token" REM User needs "Job/Read" permission on Jenkins REM AUTHORIZATION=base64(test:1184023ac835f44484f52316235a033db8) SET AUTHORIZATION="dGVzdDoxMTg0MDIzYWM4MzVmNDQ0ODRmNTIzMTYyMzVhMDMzZGI4" "%CSCRIPT%" "%VBSCRIPT%" "%REPOS%" "%2" "%SVNLOOK%" %JENKINS% %AUTHORIZATION%