我知道有很多类似的帖子,但是我还没有找到解决方案,其他帖子中提供的建议和解决方案也不太符合我所看到的。
该场景非常简单:我在Eclipse中有一个项目,并且当我将该项目中的更改签到Subversion服务器(即VisualSVN Server 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
问题是,尽管POST上面的命令最终得到了200响应,但该工作从未开始。什么都没有结束。好了,让我们检查一下Jenkins的作业配置。也许我缺少设置或其他东西。好吧,在“构建触发器”部分下,我检查了“触发远程构建(例如,从脚本构建)”选项,并且还提供了身份验证令牌。但是,该部分下面的指示与我一直在做的事情不同:
POST
200
使用以下URL远程触发构建:JENKINS_URL/job/<job- name>/build?token=TOKEN_NAME或(/buildWithParameters?token=TOKEN_NAME 可选)附加&cause=Cause+Text以提供将包含在记录的构建原因中的文本。
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服务器的配置页面上显示的明确说明进行操作。当我repos在vbs脚本中记录输入变量时,它指向顶级部门存储库,而不是项目的子存储库(即D:\<visual- svn-repos>\<my-department>而不是D:\<visual-svn-repos>\<my- department>\DepartmentProject_B)。
repos
D:\<visual- svn-repos>\<my-department>
D:\<visual-svn-repos>\<my- department>\DepartmentProject_B
谢谢大家的任何帮助。
您链接的文章说
需要使用SCM轮询选项配置Jenkins上的作业,以便从此行为中受益。这样一来,通过省略SCM轮询选项,您可以拥有一些永不由提交后挂钩(在$ REPOSITORY / hooks目录中)触发的作业,例如与发布相关的任务。配置的轮询可以具有任何计划(可能很少,例如每月或每年)。最终结果似乎是轮询发生在其通常的周期之外。
和
为此,您的Jenkins必须允许对系统进行匿名读取访问(特别是“作业>读取”访问)。如果对Jenkins的访问控制更加严格,则可能需要指定用户名和密码,具体取决于身份验证的配置方式。
您的服务器是否符合此限制?