我知道有很多类似的帖子,但我没有找到解决方案,其他帖子中提出的建议和解决方案与我所看到的并不相符。
场景非常简单:我在Eclipse中有一个项目,当我从该项目签到更改到我们的Subversion服务器(即VisualSVN Server 2.5.3)时,我想要我们的Jenkins持续集成服务器(即,Jenkins 1.546)接受这个改变并开始一个新的构建。我不想从詹金斯民意调查。
我一直在遵循this article中的步骤。这是我的post-commit钩子脚本:
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
问题在于,尽管上面的POST
命令最终得到了200
回复,但这项工作从未启动。什么都没有结束。好的,让我们检查一下Jenkins的工作配置;也许我错过了一个设置或什么。好吧,在Build Triggers部分下,我检查了“远程触发构建(例如,从脚本)”选项,我也提供了一个身份验证令牌。但是,该部分下面的指示看起来与我一直在做的不同:
使用以下网址远程触发构建:
JENKINS_URL/job/<job-name>/build?token=TOKEN_NAME
或/buildWithParameters?token=TOKEN_NAME
(可选)附加&cause=Cause+Text
以提供将包含在记录的构建原因中的文本。
所以,看起来我看到的指令集之间存在差异,而且我不确定如何弥合这一差距。按照Jenkins作业配置页面上的说明似乎很明显,除了我不知道如何获得作业名称,而不是UUID。
需要注意的另一件事是我的存储库设置。由于CI服务器被许多团体和部门使用,我认为我会聪明并创建一个顶级存储库来容纳我的部门的项目。所以,我有一个类似的设置:
VisualSVN Server
-- Repositories
-- Project_A
-- Project_B
-- <my-department>
-- DepartmentProject_A
-- DepartmentProject_B
我想知道存储库结构是否在这里添加了我的问题,但我觉得我应该能够找出任何更改来自哪个特定存储库。如果这是真的,那么我可以调整我的脚本以使用作业名称而不是UUID,然后按照CI服务器配置页面上显示的显式指令进行操作。当我在我的vbs脚本中记录传入的repos
变量时,它指向顶级部门存储库,而不是项目的子存储库(即D:\<visual-svn-repos>\<my-department>
而不是D:\<visual-svn-repos>\<my-department>\DepartmentProject_B
)。 / p>
非常感谢任何帮助,谢谢你们。
答案 0 :(得分:10)
您链接的文章说
Jenkins上的作业需要配置SCM轮询选项 从这种行为中受益。这样你就可以找到一些工作 永远不会被post-commit钩子触发(在 $ REPOSITORY / hooks目录),例如发布相关任务,由 省略SCM轮询选项。配置的轮询可以有任何 时间表(可能不常见,如每月或每年)。净效应 好像轮询是在他们通常的周期之外发生的。
和
为此,Jenkins必须允许匿名读取访问 (具体来说,“Job&gt; Read”访问)系统。如果访问控制 你的Jenkins更具限制性,你可能需要指定 用户名和密码,具体取决于您的身份验证方式 构造
您的服务器是否符合此限制?
答案 1 :(得分:1)
我试图让svn插件示例起作用,但没有运气。相反,我使用了构建令牌根插件,无需轮询即可正常工作。
https://wiki.jenkins-ci.org/display/JENKINS/Build+Token+Root+Plugin
构建触发器&gt;触发器构建远程选项&gt;给它一个代币
在VisualSVN服务器上将此添加到post-commit hook:
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