Jenkins根据多个项目中的提交触发构建

时间:2017-04-07 07:10:31

标签: asp.net-mvc git svn jenkins jenkins-plugins

最近我开始研究CI项目,它必须在SCM提交(Git / SVN)上构建项目。我尝试远程使用Build触发器,当我提交代码并成功构建应用程序时它会触发Job。

现在我在一个存储库中有多个项目,因此根据我的提交,它必须在存储库中找到相应的项目并开始执行特定的工作。

詹金斯有没有办法做到这一点?

post-commit-hook-jenkins.vbs文件的代码

Set args = WScript.Arguments
JobName = args.Item(0)
Token = args.Item(1)

' URL to open
sUrl =  "http://builduser:a844e9e505bfc5e6e9ce6e953ba5443a@localhost:8080/buildByToken/build?job=" + JobName + "&token=" + Token

' POST Request to send.
WScript.Echo "sUrl: " + sUrl
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 

Post-commit.bat文件的代码

SET CSCRIPT=%windir%\system32\cscript.exe
SET VBSCRIPT=E:\Repositories\CICD\hooks\post-commit-hook-jenkins.vbs

"%CSCRIPT%" "%VBSCRIPT%" "JobName" "AuthenticationToken"

1 个答案:

答案 0 :(得分:3)

如果你

  • 在作业配置的“源代码管理”部分下设置项目的SVN / git位置
  • 然后在“构建触发器”部分中选择“轮询SCM”

那么它应该可以随心所欲地工作。

您提出此问题的事实可能意味着您正在从构建脚本中执行源代码检查,对吧?避免这种情况,而是让Jenkins处理svn checkout / git clone。

或许你只是想避免轮询,这个问题是关于如何从SVN post-commit钩子中触发不同的项目,具体取决于你提交的SVN存储库中的位置?在这种情况下,您需要编写一个更复杂的钩子脚本,该脚本分析受提交影响的路径,并根据该脚本触发正确的Jenkins作业。

修改

在post-commit.bat文件中,您应该传递提交的存储库和修订号而不是作业名,因为您还不知道要触发哪个作业。 Subversion将存储库和修订版作为第一个和第二个参数传递。

SET CSCRIPT=%windir%\system32\cscript.exe
SET VBSCRIPT=E:\Repositories\CICD\hooks\post-commit-hook-jenkins.vbs
SET REPOS=%1
SET REVISION=%2

"%CSCRIPT%" "%VBSCRIPT%" %REPOS% %REVISION% "AuthenticationToken"

在.vbs脚本中,您应该通过

替换从参数中获取jobName的语句
repos = args.Item(0)
revision = args.Item(1)
token = args.Item(2)

现在您需要使用此修订号来检查svnlook.exe的更改。将svnlook.exe的绝对路径放在svnlook变量中并执行如下操作:

Set changedExec = shell.Exec(svnlook & " changed --revision " & revision & " " & repos)
Do Until changedExec.StdOut.AtEndOfStream
    changed = changed + changedExec.StdOut.ReadLine() + Chr(10)
Loop

现在,您在changed变量中输出svnlook.exe changed。它告诉您SVN存储库中的哪些文件受提交影响。

接下来,由您来解析changed变量的内容以决定要触发的作业名称。例如,您可以执行一些简单的操作,例如检查它是否包含“foo / trunk /”,然后触发foo-trunk作业。