Comment configurer le hook de validation post Git

126

Comment déclencher une compilation à distance depuis Jenkins?
Comment configurer le hook de validation post Git?

Mon exigence est que chaque fois que des modifications sont apportées dans le référentiel Git pour un projet particulier, il démarre automatiquement la compilation Jenkins pour ce projet.

Dans la section de construction du déclencheur Jenkins, j'ai sélectionné la construction du déclencheur à distance.
Dans le .gitrépertoire, le répertoire hooks est là dans lequel nous devons configurer le fichier post-commit.
Je ne comprends pas comment déclencher une construction à partir de là (je connais une partie où nous devrions utiliser la commande curl).


curl cmbuild.aln.com/jenkins/view/project name/job/myproject/buildwithparameters?Branch=feat-con

J'ai placé cette commande dans mon répertoire de hooks de serveur git (hook post commit).
Chaque fois que les modifications se produisent dans le référentiel, il exécute la construction automatisée.

Je veux vérifier dans le changeset si au moins un fichier java est là, la construction doit démarrer.
Supposons que les développeurs aient modifié uniquement les fichiers xml ou les fichiers de propriétés que la construction ne doit pas démarrer.
Avec xml, supposons que les .javafichiers soient là, la construction devrait commencer.

phanikumar Raja
la source
J'ai modifié ma réponse pour répondre à la deuxième partie de votre question.
VonC

Réponses:

164

Comme mentionné dans "L' interrogation doit mourir: déclencher les builds Jenkins à partir d'un hook git ", vous pouvez notifier Jenkins d'un nouveau commit:

Avec le dernier plugin Git 1.1.14 (que je viens de publier maintenant), vous pouvez maintenant le faire plus> facilement en exécutant simplement la commande suivante:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>

Cela analysera tous les travaux configurés pour extraire l'URL spécifiée, et s'ils sont également configurés avec l'interrogation, cela déclenchera immédiatement l'interrogation (et si cela trouve un changement qui vaut la peine d'être construit, une compilation sera déclenchée à son tour. )

Cela permet à un script de rester le même lorsque les tâches vont et viennent dans Jenkins.
Ou si vous avez plusieurs référentiels sous une seule application hôte de référentiel (telle que Gitosis), vous pouvez partager un seul script hook post-réception avec tous les référentiels. Enfin, cette URL ne nécessite pas d'authentification, même pour Jenkins sécurisé, car le serveur n'utilise directement rien que le client envoie. Il exécute une interrogation pour vérifier qu'il y a un changement, avant de démarrer réellement une compilation.

Comme mentionné ici , assurez-vous d'utiliser la bonne adresse pour votre serveur Jenkins:

puisque nous exécutons Jenkins en tant que serveur Web autonome sur le port 8080, l'URL aurait dû être sans /jenkins, comme ceci:

http://jenkins:8080/git/notifyCommit?url=git@gitserver:tools/common.git

Pour renforcer ce dernier point, ptha ajoute dans les commentaires :

Cela peut être évident, mais j'ai eu des problèmes avec:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. 

Le paramètre url doit correspondre exactement à ce que vous avez dans l' URL du référentiel de votre travail Jenkins.
Lors de la copie d'exemples, j'ai omis le protocole, dans notre casssh:// , et cela n'a pas fonctionné.


Vous pouvez également utiliser un simple hook post-reception comme dans " Push based builds using Jenkins and GIT "

#!/bin/bash
/usr/bin/curl --user USERNAME:PASS -s \

http://jenkinsci/job/PROJECTNAME/build?token=1qaz2wsx

Configurez votre travail Jenkins pour pouvoir «déclencher des builds à distance» et utiliser un jeton d'authentification (1qaz2wsx dans cet exemple).

Cependant, il s'agit d'un script spécifique au projet, et l'auteur mentionne un moyen de le généraliser.
La première solution est plus simple car elle ne dépend pas de l'authentification ou d'un projet spécifique.


Je veux vérifier dans l'ensemble de modifications si au moins un fichier java est là, la construction doit démarrer.
Supposons que les développeurs aient modifié uniquement les fichiers XML ou les fichiers de propriétés, la construction ne devrait pas démarrer.

Fondamentalement, votre script de construction peut:

  • mettre des notes de 'construction' (voir git notes ) sur le premier appel
  • lors des appels suivants, récupérez la liste des commits entre HEADle candidat de votre branche pour la construction et le commit référencé par le git notes'build' (git show refs/notes/build ): git diff --name-only SHA_build HEAD.
  • votre script peut analyser cette liste et décider s'il doit continuer avec la construction.
  • dans tous les cas, créez / déplacez votre git notes' build' vers HEAD.

Mai 2016: cwhsu indique dans les commentaires l'url possible suivante:

vous pouvez simplement utiliser curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKENsi vous définissez la configuration du déclencheur dans votre élément

http://i.imgur.com/IolrOOj.png


Juin 2016, souligne polaretto dans les commentaires :

Je voulais ajouter qu'avec juste un peu de script shell, vous pouvez éviter la configuration manuelle des URL, surtout si vous avez de nombreux référentiels dans un répertoire commun.
Par exemple, j'ai utilisé ces extensions de paramètres pour obtenir le nom du dépôt

repository=${PWD%/hooks}; 
repository=${repository##*/} 

puis utilisez-le comme:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository
VonC
la source
salut von comme vous l'avez dit lors du premier appel, je dois mettre un build notes.my premier appel est de lire le fichier .java chaque fois que le développeur envoie les modifications dans git repo. Je suis nouveau dans toutes ces choses, c'est pourquoi je demande à chaque étape. s'il vous plaît ne vous dérange pas et je dois terminer cette tâche.
phanikumar Raja
C'est tellement utile pour moi. J'ai écrit Git hook avec l'aide de ce sujet. Les gars de Tnx!
Kirill Bazarov
J'ai dû ajouter l'appel curl au fichier de post-réception, ce qui n'est pas totalement clair dans cette réponse. Très utile de toute façon!
Magnilex
1
@IgorGanapolsky dans le dossier hooks de votre repo nu qui reçoit des commits et qui doit appeler jenkins:yourRepo.git/hooks/post-receive
VonC
2
Il peut être évident, mais j'eu des problèmes avec: curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. Le paramètre url doit correspondre exactement à ce que vous avez dans l' URL du référentiel de votre travail Jenkins. Lors de la copie d'exemples, j'ai omis le protocole, dans notre cas ssh: // et cela n'a pas fonctionné.
ptha
17

J'espère que cela vous aidera: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

C'est juste une question d'utiliser curlpour déclencher un travail Jenkins en utilisant les hooks git fournis par git.
La commande

curl http://localhost:8080/job/someJob/build?delay=0sec

peut exécuter un travail Jenkins, où someJobest le nom du travail Jenkins.

Recherchez le hooksdossier dans votre dossier .git caché. Renommez le post-commit.samplefichier en post-commit. Ouvrez-le avec le Bloc-notes, supprimez la : Nothingligne et collez-y la commande ci-dessus.

C'est tout. Chaque fois que vous effectuez un commit, Git déclenchera les commandes post-commit définies dans le fichier.

Nav
la source
Après avoir fait la validation depuis la machine de développement, post-receive est appelé, pas post-commit. Vérifié en mettant des instructions de journal dans les deux crochets. Est-ce que je lis mal la documentation, ne devrait-il pas être post-commit qui est appelé?
Shirish Hirekodi
@Shirish: C'est étrange. Peut-être que vous faites quelque chose différemment
Nav
c'est construit avec succès quand j'ai poussé le dernier commit de changement mais pas construit quand je commet des changements ... ???
3

Comme la réponse précédente a montré un exemple de la façon dont le hook complet pourrait ressembler, voici le code de mon hook de travail post-réception:

#!/usr/bin/python

import sys
from subprocess import call

if __name__ == '__main__':
    for line in sys.stdin.xreadlines():
        old, new, ref = line.strip().split(' ')
        if ref == 'refs/heads/master':
            print "=============================================="
            print "Pushing to master. Triggering jenkins.        "
            print "=============================================="
            sys.stdout.flush()
            call(["curl", "-sS", "http://jenkinsserver/git/notifyCommit?url=ssh://user@gitserver/var/git/repo.git"])

Dans ce cas, je déclenche des jobs jenkins uniquement lorsque je pousse vers master et non vers d'autres branches.

Zitrax
la source
1
Comment liez-vous ce script Python à Jenkins? Ou le lancez-vous juste une fois?
IgorGanapolsky
Jenkins ne connaît pas ce hook, la partie principale est de charger l'url notifyCommit sur le serveur jenkins qui déclenchera un sondage. Je pense que le sondage est activé mais sans calendrier du côté jenkins.
Zitrax
Alors, où réside ce script python? Je suppose que vous l'
associez
1
Réponse tardive - mais l'emplacement du script serait sur le serveur git dans hooks / post-receive. Renseignez-vous sur les hooks git pour en savoir plus.
Zitrax
3

Je veux ajouter aux réponses ci-dessus que cela devient un peu plus difficile si l'autorisation Jenkins est activée.

Après l'avoir activé, j'ai reçu un message d'erreur indiquant que l'utilisateur anonyme a besoin d'une autorisation de lecture.

J'ai vu deux solutions possibles:

1: Changer mon crochet en:

curl --user name:passwd -s http://domain?token=whatevertokenuhave

2: définition de l'autorisation basée sur le projet.

Les anciennes solutions ont l'inconvénient que je devais exposer mon mot de passe dans le fichier hook. Inacceptable dans mon cas.

Le second fonctionne pour moi. Dans les paramètres d'authentification globaux, j'ai dû activer Global> Read for Anonymous user. Dans le projet que je voulais déclencher, je devais activer Job> Build et Job> Read for Anonymous.

Ce n'est toujours pas une solution parfaite car vous pouvez maintenant voir le projet dans Jenkins sans connexion. Il pourrait y avoir une solution encore meilleure en utilisant l'ancienne approche avec connexion http mais je ne l'ai pas compris.

anhoppe
la source