【问题标题】:Post-Commit Hook to trigger automatic Jenkins BuildPost-Commit Hook 触发自动 Jenkins 构建
【发布时间】:2014-01-17 19:50:35
【问题描述】:

我知道有很多类似的帖子,但我没有找到解决方案,其他帖子中提供的建议和解决方案与我所看到的不太相符。

场景非常简单:我在 Eclipse 中有一个项目,当我将该项目的更改签入到我们的 Subversion 服务器(即 VisualSVN Server 2.5.3)时,我想要我们的 Jenkins 持续集成服务器(即, Jenkins 1.546) 来接受这个变化并开始一个新的构建。我不想从 Jenkins 那里投票。

我一直在遵循this article 中的步骤。这是我的提交后挂钩脚本:

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 部分下,我已经检查了“Trigger builds remote (e.g., from scripts)”选项,并且我还提供了一个身份验证令牌。但是,该部分下方的方向看起来与我一直在做的不同:

使用以下 URL 远程触发构建:JENKINS_URL/job/&lt;job-name&gt;/build?token=TOKEN_NAME/buildWithParameters?token=TOKEN_NAME 可以选择附加 &amp;cause=Cause+Text 以提供将包含在记录的构建原因中的文本。

所以,我看到的指令集之间似乎存在差异,我不确定如何弥合这一差距。遵循 Jenkins 作业配置页面上的说明似乎很明显,除了我不知道如何获取作业名称,而不是 UUID。

要注意的另一件事是我的存储库设置。由于 CI 服务器被许多组和部门使用,我想我会很聪明,并创建一个顶级存储库来存放我部门的项目。所以,我有一个类似的设置:

VisualSVN Server  
  -- Repositories  
     -- Project_A  
     -- Project_B  
     -- <my-department>  
        -- DepartmentProject_A  
        -- DepartmentProject_B  

我想知道存储库结构是否在这里增加了我的问题,但我觉得我应该能够找出任何更改来自哪个特定存储库。如果这是真的,那么我可以调整我的脚本以使用作业名称,而不是 UUID,然后按照我的 CI 服务器配置页面上的明确说明进行操作。当我在我的 vbs 脚本中记录传入的repos 变量时,它指向顶级部门存储库,而不是项目的子存储库(即D:\&lt;visual-svn-repos&gt;\&lt;my-department&gt; 而不是D:\&lt;visual-svn-repos&gt;\&lt;my-department&gt;\DepartmentProject_B)。

任何帮助将不胜感激,谢谢大家。

【问题讨论】:

    标签: svn jenkins continuous-integration hudson visualsvn-server


    【解决方案1】:

    你链接的文章说

    Jenkins 上的作业需要配置 SCM 轮询选项以 受益于这种行为。这样你就可以有一些工作 不会被 post-commit 钩子触发的(在 $REPOSITORY/hooks 目录),如发布相关任务,由 省略 SCM 轮询选项。配置的轮询可以有任何 时间表(可能不频繁,如每月或每年)。净效应 就好像轮询发生在它们通常的周期之外。

    为此,您的 Jenkins 必须允许匿名读取访问 (特别是“作业 > 读取”访问)系统。如果访问控制 对您的 Jenkins 的限制更大,您可能需要指定 用户名和密码,取决于您的身份验证方式 配置好了。

    您的服务器是否满足此限制?

    【讨论】:

    • 第一个是它:我还需要配置作业以轮询 scm,不提供任何时间表。我不知道我是怎么错过那个宣传语的,我想我没有我想象的那么彻底。无论如何,谢谢你,斯凯特拉斯!
    【解决方案2】:

    我试图让 svn 插件示例工作,但没有运气。相反,我使用了构建令牌根插件,无需轮询即可使用。

    https://wiki.jenkins-ci.org/display/JENKINS/Build+Token+Root+Plugin

    构建触发器 > 远程触发构建选项 > 给它一个令牌

    在 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 2013-12-02
      • 2020-01-23
      • 1970-01-01
      相关资源
      最近更新 更多