Post-Commit-Hook trigger-Automatik Jenkins Build

Ich weiß, dass es viele ähnliche Beiträge, aber ich habe keine Lösung gefunden, und die Beratung und Lösungen in anderen Beiträgen nicht ganz jive mit dem, was ich sehe.

Das Szenario ist ziemlich einfach: ich habe ein Projekt in Eclipse, und wenn ich check-in änderungen aus diesem Projekt auf unserem Subversion-server (D. H., VisualSVN Server 2.5.3), möchte ich unsere Jenkins continuous integration server (dh, Jenkins 1.546) zu Holen, diese zu verändern und kick-off-eine neue bauen. Ich will nicht zu Umfrage von Jenkins.

Habe ich meistens die folgenden Schritte in dieser Artikel. Hier ist mein post-commit-hook-Skript:

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

Das Problem ist, dass, obwohl die POST obige Befehl endet immer ein 200 Antwort zurück, die job nie startet. Nichts am Ende passiert. Okay, also prüfen wir den Jenkins-job-Konfiguration; vielleicht bin ich eine Einstellung fehlt oder so etwas. Gut, unter der Build-Triggers-Abschnitt, ich habe die option für "Trigger baut aus der Ferne (z.B. von Skripts)" und ich habe geliefert, ein Authentifizierungs-token als gut. Aber die Richtungen, die unter diesem Abschnitt sehen anders aus als das, was ich getan habe:

Verwenden Sie die folgende URL, um die trigger-build Remote: JENKINS_URL/job/<job-name>/build?token=TOKEN_NAME oder /buildWithParameters?token=TOKEN_NAME
Optional Anhängen &cause=Cause+Text bieten text, werden in den aufgezeichneten bauen verursachen.

So, wie es scheint, gibt es ein delta zwischen den Sätzen von Anweisungen, die ich bin zu sehen, und ich bin mir nicht sicher, wie man diese Lücke überbrücken. Es scheint ziemlich offensichtlich, Folgen Sie den Anweisungen auf der Jenkins-job-Konfiguration-Seite, außer, dass ich nicht weiß, wie ich den job bekommen Namen, anstatt die UUID.

Andere Sache zu beachten, ist mein repository einrichten. Da der CI-server wird von vielen Gruppen und Abteilungen, dachte ich, ich würde alle smart und erstellen Sie eine top-level-repository zu Haus, nur meine Abteilung Projekte. Also, ich habe ein setup sowas wie:

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

Frage ich mich, ob die repository-Struktur ist das hinzufügen, um meine Probleme hier, aber ich fühle mich wie ich sollte in der Lage sein, um herauszufinden, welche spezifischen repository-änderungen kam. Wenn das wahr wäre, dann könnte ich mich gewöhnen, mein Skript zu verwenden, den Namen des Auftrags, statt der UUID, und dann Folgen die expliziten Anweisungen gesehen auf meinem CI-server-Konfiguration Seite. Wenn ich das log der eingehenden repos variable in mein vbs-Skript verweist es auf die top-level-Abteilung repository, anstatt das Projekt Kind-repository (D. H., D:\<visual-svn-repos>\<my-department> eher als D:\<visual-svn-repos>\<my-department>\DepartmentProject_B).

Jede Hilfe wäre sehr geschätzt, danke Jungs.

InformationsquelleAutor liltitus27 | 2014-01-17
Schreibe einen Kommentar