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.

9
demandé sur liltitus27 2014-01-17 23:50:35

2 réponses

l'article que vous avez lié dit

Les travaux

sur 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?

9
répondu ScayTrase 2014-01-28 05:39:30

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 
1
répondu Sean 2015-11-16 20:13:23