当前位置: 首页 > 面试题库 >

提交后挂钩触发自动Jenkins构建

薄涵衍
2023-03-14
问题内容

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

该场景非常简单:我在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的作业配置。也许我缺少设置或其他东西。好吧,在“构建触发器”部分下,我检查了“触发远程构建(例如,从脚本构建)”选项,并且还提供了身份验证令牌。但是,该部分下面的指示与我一直在做的事情不同:

使用以下URL远程触发构建: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

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

谢谢大家的任何帮助。


问题答案:

您链接的文章说

需要使用SCM轮询选项配置Jenkins上的作业,以便从此行为中受益。这样一来,通过省略SCM轮询选项,您可以拥有一些永不由提交后挂钩(在$
REPOSITORY /
hooks目录中)触发的作业,例如与发布相关的任务。配置的轮询可以具有任何计划(可能很少,例如每月或每年)。最终结果似乎是轮询发生在其通常的周期之外。

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

您的服务器是否符合此限制?



 类似资料:
  • 问题内容: 当它成功时,我正在尝试在Jenkins CI中进行构建后提交。 有没有办法做到这一点? 我的问题是,当我构建它时,我需要在工作区中生成一些dll提交给svn。 问题答案: 这取决于您用来构建源代码的构建技术(例如Ant,Maven,MSBuild或FianlBuilder)。要将生成结果检入到svn中,应在生成脚本的末尾添加一些新步骤。这一步只会将您的构建结果添加到svn中。例如,您的

  • 问题内容: 在将代码提交到SVN项目时,我需要设置哪些插件和插件功能才能使Jenkins作业触发构建? 我已经安装了标准的SVN插件以及SVN标记插件,但是我看不到任何允许触发器配置的新功能。 问题答案: 有两种解决方法: 由于它易于实施,因此我最初建议使用第一种方法。在构建过程中成熟之后,请切换到第二个。 轮询存储库以查看是否发生了更改。如果在同一轮询间隔内有两次提交,则可能“跳过”提交。 在此

  • 问题内容: 我已经在测试服务器上使用Github插件设置了Jenkins。我只允许通过身份验证的用户(匿名用户没有任何权利)和安全连接来保护Jenkins。 不幸的是,在我看来,Github提供的提交后挂钩似乎不起作用。我尝试手动访问https://jenkins.on.my.server/github- webhook/上 的URL,它给了我一个“ net.sf.json.JSONExcepti

  • 问题内容: 我正在尝试使用Jenkins,docker和Ansible实现CI / CD管道。我 正在为版本控制系统使用SVN代码存储库。对于部署和 SVN代码存储库,我使用的是AWS EC2。部署和代码存储库位于单独的VM中。 我的要求 将代码提交到SVN存储库中时,需要触发一个 Jenkins Job。该工作将被称为ansible playbook,稍后将构建 项目,构建Docker映像并部署

  • 问题内容: 我们有一个带有外部子模块的git存储库。子模块更改时,我们必须触发构建。您能否建议我们如何使用xtrigger插件轮询子模块上的更改。使用shell脚本或监视文件还是其他更好? 有关我们的构建流程的更多信息。第1步。使用子模块步骤2克隆根存储库。为每个子模块步骤#2.1(在子模块中)执行作业。切换到正确的分支(例如,主)步骤#2.1(在子模块中)。拉取子模块的最新资源 现在,如果有人提

  • 问题内容: 我在Jenkins中配置了项目,该项目轮询SCM并在发布更改时开始构建。有一个后构建动作来构建另一个项目。我的问题是,之后要构建的项目具有其自己的参数。如何知道生成后操作触发时指定了哪个参数?现在,如果我使用“选择”,是否只是选择第一个?我如何挑选其他人? 问题答案: 好吧,让我们一个接一个:) 如果要查看使用了哪个参数,可以安装此插件:显示构建参数插件 如果要使用特定参数触发构建,请