Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Svn Post Commit钩子触发自动Jenkins构建_Svn_Jenkins_Continuous Integration_Hudson_Visualsvn Server - Fatal编程技术网

Svn Post Commit钩子触发自动Jenkins构建

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 =

我知道有很多类似的帖子,但我还没有找到解决方案,其他帖子中的建议和解决方案与我看到的不太一致

这个场景非常简单:我在Eclipse中有一个项目,当我将该项目的更改签入到Subversion服务器(即VisualSVN服务器2.5.3)时,我希望我们的Jenkins持续集成服务器(即Jenkins 1.546)接受此更改并启动新的构建。我不想从詹金斯那里投票

我一直在遵循中的步骤。以下是我的提交后钩子脚本:

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