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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Artikel, den Sie verlinkt sagt
und
Tut Sie server erfüllt diese Einschränkungen?
Habe ich versucht, die svn-plugin-Beispiele, um zu arbeiten, aber kein Glück. Stattdessen verwendete ich die build-token root-plugin und das funktioniert ohne Umfrage.
https://wiki.jenkins-ci.org/display/JENKINS/Build+Token+Root+Plugin
Bauen Trigger > Trigger baut Remote-option > geben Sie eine token -
Auf VisualSVN server fügen Sie diese zu den post-commit-hook:
Für post-commit-hook-jenkins.vbs: