Crochet Post-Commit pour déclencher la construction automatique de Jenkins
je sais qu'il y a beaucoup d'affectations similaires, mais je n'ai pas trouvé de solution, et les conseils et les solutions présentés dans les autres postes ne jettent pas tout à fait avec ce que je vois.
le scénario est assez simple: j'ai un projet dans Eclipse, et quand je passe de ce projet à notre serveur Subversion (C'est-à-dire VisualSVN Server 2.5.3), je veux que notre serveur D'intégration continue Jenkins (C'est-à-dire Jenkins 1.546) reprenne ce changement et déclenche une de nouveaux de construire. Je ne veux pas interroger Jenkins.
j'ai surtout suivi les étapes dans cet article . Voici mon script hook post-commit:
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 Serverlog.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
le problème est que, bien que la commande POST
ci-dessus finisse par recevoir une réponse 200
, le travail ne démarre jamais. Rien n'arrive. Très bien, donc vérifions la configuration du travail de Jenkins; peut-être que je manque un réglage ou quelque chose. Eh bien, dans la section construire les déclencheurs, j'ai coché l'option "Trigger builds Remote (e.g., from scripts)" et j'ai aussi fourni un token d'authentification. Mais les directions en dessous de cette section semblent différentes de ce que j'ai fait:
utilisez L'URL suivante pour lancer la construction à distance:
JENKINS_URL/job/<job-name>/build?token=TOKEN_NAME
ou/buildWithParameters?token=TOKEN_NAME
Ajouter éventuellement&cause=Cause+Text
pour fournir un texte qui sera inclus dans la cause de construction enregistrée.
donc, il semble qu'il y ait un delta entre les séries d'instructions que je vois, et je ne sais pas comment combler cet écart. Il semble assez évident de suivre les instructions sur la page de configuration du travail de Jenkins, sauf que je ne sais pas comment j'obtiendrais le nom du travail, plutôt que L'UUID.
une autre chose à noter est la configuration de mon dépôt. Puisque le serveur CI est utilisé par de nombreux groupes et départements, j'ai pensé que je serais tout intelligent et créer un niveau supérieur un dépôt pour les projets de mon département. Donc, j'ai quelque chose comme:
VisualSVN Server
-- Repositories
-- Project_A
-- Project_B
-- <my-department>
-- DepartmentProject_A
-- DepartmentProject_B
je me demande si la structure du dépôt ajoute à mes problèmes ici, mais je pense que je devrais être en mesure de trouver de quel dépôt spécifique toutes les modifications proviennent. Si c'était vrai, alors je pourrais ajuster mon script pour utiliser le nom du travail, plutôt que UUID, et puis suivre les instructions explicites vues sur la page de configuration de mon serveur CI. Quand j'ai enregistrer les La variable repos
dans mon script vbs, elle renvoie au référentiel ministériel de premier niveau plutôt qu'au référentiel enfant du projet (c.-à-d. D:<visual-svn-repos><my-department>
plutôt que D:<visual-svn-repos><my-department>DepartmentProject_B
).
Toute aide serait grandement appréciée, merci les gars.
2 réponses
l'article que vous avez lié dit
Les travauxsur Jenkins doivent être configurés avec L'option de sondage SCM pour bénéficient de ce comportement. Ceci est fait de sorte que vous pouvez avoir certains emplois qui ne sont jamais déclenchés par le crochet post-commit (dans le $REPOSITORY / hooks directory), comme les tâches liées à la publication, par omettre l'option de sondage SCM. Le polling configuré peut avoir n'importe quel horaire (probablement peu fréquent comme mensuel ou annuel). L'effet net est comme si le vote se produit hors de leurs cycles habituels.
et
pour que ça marche, votre Jenkins doit permettre l'accès anonyme en lecture (plus précisément, "emploi > Lire" accès) au système. Si le contrôle d'accès à votre Jenkins est plus restrictif, vous pouvez avoir besoin de spécifier nom d'utilisateur et mot de passe, selon la façon dont votre authentification est configurer.
votre serveur respecte-t-il ces restrictions?
j'ai essayé de faire fonctionner les exemples de plugin svn, mais sans succès. Au lieu de cela, j'ai utilisé le plugin root de build token et cela fonctionne sans avoir à Poller.
https://wiki.jenkins-ci.org/display/JENKINS/Build+Token+Root+Plugin
Construire des Déclencheurs > Déclencher construit à distance option > donner un jeton
sur VisualSVN server ajouter ceci au crochet post-commit:
SET CSCRIPT=%windir%\system32\cscript.exe
SET VBSCRIPT=C:\Repositories\post-commit-hook-jenkins.vbs
"%CSCRIPT%" "%VBSCRIPT%" "MyJobName" "MyTokenFromBuildTrigger"
pour post-commit-crochet-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