Jenkins持续集成学习-Windows环境进行.Net开发3 (4)

详细的钩子可以到SVN服务管理上找到管理hooks

25.png


26.png


同时我们创建了钩子脚本放入,SVN钩子管理就可以直接读取到我们的脚本。

27.PNG

通知脚本参数说明

1. %1:当前项目的SVN仓库地址。 2. %2:提交后的版本号。 3. CSCRIPT:CScript.exe的路径。 4. VBSCRIPT:同时jenkins的脚本路径。 5. SVNLOOK:svnlook.exe的路径。 6. JENKINS:jenkins服务地址。 7. AUTHORIZATIONN:用于授权token。

svnlook是检验Subversion版本库不同方面的命令行工具。

22.png

创建一个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一致

16.png

获取SVN版本改变项

通过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请求。

17.PNG


18.png


服务端构建会显示SCM启动,和jenkins scm不同的是,不需要每分钟定时轮询,而是通过服务端钩子触发任务执行。

19.PNG

三种钩子比较 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插件,同时服务端执行脚本需要一些特殊权限  

具体使用哪种方案根据上面表格选择即可。

结语

最终我们的完整持续集成流程图如下图所示

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygypw.html