Svn Post Commit钩子触发自动Jenkins构建
我知道有很多类似的帖子,但我还没有找到解决方案,其他帖子中的建议和解决方案与我看到的不太一致 这个场景非常简单:我在Eclipse中有一个项目,当我将该项目的更改签入到Subversion服务器(即VisualSVN服务器2.5.3)时,我希望我们的Jenkins持续集成服务器(即Jenkins 1.546)接受此更改并启动新的构建。我不想从詹金斯那里投票 我一直在遵循中的步骤。以下是我的提交后钩子脚本:Svn Post Commit钩子触发自动Jenkins构建,svn,jenkins,continuous-integration,hudson,visualsvn-server,Svn,Jenkins,Continuous Integration,Hudson,Visualsvn Server,我知道有很多类似的帖子,但我还没有找到解决方案,其他帖子中的建议和解决方案与我看到的不太一致 这个场景非常简单:我在Eclipse中有一个项目,当我将该项目的更改签入到Subversion服务器(即VisualSVN服务器2.5.3)时,我希望我们的Jenkins持续集成服务器(即Jenkins 1.546)接受此更改并启动新的构建。我不想从詹金斯那里投票 我一直在遵循中的步骤。以下是我的提交后钩子脚本: repos = WScript.Arguments.Item(0) rev =
repos = WScript.Arguments.Item(0)
rev = WScript.Arguments.Item(1)
svnlook = WScript.Arguments.Item(2)
jenkins = WScript.Arguments.Item(3)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("C:\Program Files (x86)\VisualSVN Server\log.txt")
objFile.Writeline "repos=" & repos
objFile.Writeline "rev=" & rev
objFile.Writeline "svnlook=" & svnlook
objFile.Writeline "jenkins=" & jenkins
Set shell = WScript.CreateObject("WScript.Shell")
Set uuidExec = shell.Exec(svnlook & " uuid " & repos)
Do Until uuidExec.StdOut.AtEndOfStream
uuid = uuidExec.StdOut.ReadLine()
Loop
objFile.Writeline "uuid=" & uuid
Set changedExec = shell.Exec(svnlook & " changed --revision " & rev & " " & repos)
Do Until changedExec.StdOut.AtEndOfStream
changed = changed + changedExec.StdOut.ReadLine() + Chr(10)
Loop
objFile.Writeline "changed=" & changed
url = jenkins + "crumbIssuer/api/xml?xpath=concat(//crumbRequestField,"":"",//crumb)"
Set http = CreateObject("Microsoft.XMLHTTP")
http.open "GET", url, False
http.setRequestHeader "Content-Type", "text/plain;charset=UTF-8"
http.send
crumb = null
objFile.Writeline "rev url=" & url
objFile.Writeline "http.status=" & http.status
objFile.Writeline "http.responseText=" & http.responseText
if http.status = 200 then
crumb = split(http.responseText,":")
end if
url = jenkins + "subversion/" + uuid + "/notifyCommit?rev=" + rev + "&token=pinkfloyd65"
objFile.Writeline "url=" & url
if not isnull(crumb) then
objFile.Writeline "crumb(0)=" & crumb(0)
objFile.Writeline "crumb(1)=" & crumb(1)
end if
if isnull(crumb) then
objFile.Writeline "crumb=null"
end if
Set http = CreateObject("Microsoft.XMLHTTP")
http.open "POST", url, False
http.setRequestHeader "Content-Type", "text/plain;charset=UTF-8"
if not isnull(crumb) then
http.setRequestHeader crumb(0),crumb(1)
http.send changed
if http.status <> 200 then
objFile.Writeline "Error. HTTP Status: " & http.status & ". Body: " & http.responseText
end if
if http.status = 200 then
objFile.Writeline "HTTP Status: " & http.status & ".\n Body: " & http.responseText
end if
end if
我想知道存储库结构是否增加了我的问题,但我觉得我应该能够找出任何更改来自哪个特定的存储库。如果这是真的,那么我可以调整脚本以使用作业名称,而不是UUID,然后按照CI服务器配置页面上的明确说明进行操作。在vbs脚本中记录传入的repos
变量时,它指向顶级部门存储库,而不是项目的子存储库(即D:\\
而不是D:\\\DepartmentProject\u B
)
非常感谢你们的帮助。你们链接的文章说 Jenkins上的作业需要配置SCM轮询选项以 从这种行为中获益。这是为了让你有一些工作 后提交钩子(在 $REPOSITORY/hooks目录),例如与发布相关的任务 省略SCM轮询选项。配置的轮询可以有任何 时间表(可能不经常像每月或每年一样)。净效应 就好像投票是在他们通常的周期之外进行的 及 要使其工作,您的Jenkins必须允许匿名读取访问 (特别是“作业>读取”访问)访问系统。如果访问控制 如果Jenkins的限制性更强,您可能需要指定 用户名和密码,具体取决于您的身份验证方式 配置
您的服务器是否满足此限制?我试图让svn插件示例正常工作,但没有成功。取而代之的是,我使用了buildtokenroot插件,它不需要轮询就可以工作 生成触发器>远程触发生成选项>给它一个令牌 在VisualSVN服务器上,将以下内容添加到提交后挂钩:
SET CSCRIPT=%windir%\system32\cscript.exe
SET VBSCRIPT=C:\Repositories\post-commit-hook-jenkins.vbs
"%CSCRIPT%" "%VBSCRIPT%" "MyJobName" "MyTokenFromBuildTrigger"
对于post-commit-hook-jenkins.vbs:
Set args = WScript.Arguments
JobName = args.Item(0)
Token = args.Item(1)
'URL to open....
sUrl = "http://MyJenkinsServer.MyCompany.com/buildByToken/build?job=" + JobName + "&token=" + Token
'POST Request to send.
sRequest = ""
HTTPPost sUrl, sRequest
Function HTTPPost(sUrl, sRequest)
set oHTTP = CreateObject("Microsoft.XMLHTTP")
oHTTP.open "POST", sUrl,false
oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oHTTP.setRequestHeader "Content-Length", Len(sRequest)
oHTTP.send sRequest
HTTPPost = oHTTP.responseText
End Function
第一个是它:我还需要配置作业来轮询scm,而不提供时间表。我不确定我是怎么错过了那篇导语的,我想我没有想象的那么彻底。无论如何,谢谢你,斯盖特拉斯!
Set args = WScript.Arguments
JobName = args.Item(0)
Token = args.Item(1)
'URL to open....
sUrl = "http://MyJenkinsServer.MyCompany.com/buildByToken/build?job=" + JobName + "&token=" + Token
'POST Request to send.
sRequest = ""
HTTPPost sUrl, sRequest
Function HTTPPost(sUrl, sRequest)
set oHTTP = CreateObject("Microsoft.XMLHTTP")
oHTTP.open "POST", sUrl,false
oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oHTTP.setRequestHeader "Content-Length", Len(sRequest)
oHTTP.send sRequest
HTTPPost = oHTTP.responseText
End Function