web-dev-qa-db-fra.com

Comment configurer le hook post-commit de Git

Comment déclencher une construction à distance depuis Jenkins?
Comment configurer Git post commit hook?

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

Dans Jenkins, la section de génération de déclencheur que j’ai sélectionnée a été créée à distance.
Dans le répertoire .git, le répertoire des raccordements existe: vous devez configurer le fichier de post-validation.
Je ne comprends pas comment déclencher une construction à partir de là (je sais que 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 le répertoire des hooks de mon serveur git (post commit).
Chaque fois que les modifications se produisent dans le référentiel, il exécute la génération automatisée.

Je souhaite vérifier dans l'ensemble de modifications si au moins un fichier Java se trouve la construction doit commencer.
Supposons que les développeurs ne modifient que les fichiers xml ou les fichiers de propriétés que la construction ne doit pas démarrer.
Avec xml, supposons que les fichiers .Java se trouvent là où la construction devrait commencer.

119
phanikumar Raja

Comme indiqué dans " Le sondage doit mourir: le déclenchement de la construction de Jenkins à partir d'un hook git ", vous pouvez notifier Jenkins d'un nouveau commit:

Avec le dernier Git plugin 1.1.14 (que je viens de publier maintenant), vous pouvez le faire plus facilement> simplement en exécutant 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 une interrogation, cela déclenchera immédiatement l'interrogation (et si cela trouve une modification qui mérite une construction, une construction sera déclenchée à son tour. )

Cela permet à un script de rester le même lorsque les emplois vont et viennent dans Jenkins.
Ou si vous avez plusieurs référentiels sous une même application hôte de référentiel (telle que Gitosis), vous pouvez partager un seul script de raccordement 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 aucun élément envoyé par le client. Il exécute une interrogation pour vérifier qu'il y a un changement avant de commencer une génération.

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

depuis que nous utilisons Jenkins en tant que serveur Web autonome sur le port 8080, l'URL aurait dû être sans le _/jenkins_, comme ceci:

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

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

C'est peut-être évident, mais j'avais 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 URL du référentiel de votre Jenkins travail.
Lors de la copie d’exemples, j’ai oublié le protocole, dans notre cas _ssh://_, et cela n’a pas fonctionné.


Vous pouvez également utiliser un simple crochet post-réception comme dans " versions basées sur Push utilisant Jenkins et GIT "

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

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

Configurez votre travail Jenkins pour qu'il puisse "Déclencher la génération à distance" et utilisez 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 facile car elle ne dépend pas de l’authentification ou d’un projet spécifique.


Je veux archiver les modifications si au moins un fichier Java se trouve là, la construction doit commencer.
Supposons que les développeurs ne modifient que les fichiers XML ou les fichiers de propriétés. La génération ne doit donc pas commencer.

Fondamentalement, votre script de construction peut:

  • mettre une note de construction (voir git notes ) lors du premier appel
  • lors des appels suivants, récupérez la liste des commits entre HEAD de votre branche candidate à la compilation et le commet 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: cwhs 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_TOKEN_ si vous définissez la configuration du déclencheur dans votre élément

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


Juin 2016, polaretto souligne dans les commentaires :

Je voulais ajouter qu'avec un peu de script Shell, vous pouvez éviter la configuration manuelle des URL, en particulier si vous avez plusieurs référentiels dans un répertoire commun.
Par exemple, j'ai utilisé ces extensions de paramètres pour obtenir le nom du référentiel

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

et ensuite l'utiliser comme:

_curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository
_
154
VonC

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

Il suffit d'utiliser curl pour déclencher un travail Jenkins à l'aide des hooks git fournis par git.
La commande

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

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

Recherchez le dossier hooks dans votre dossier .git caché. Renommez le fichier post-commit.sample en post-commit. Ouvrez-le avec le Bloc-notes, supprimez la ligne : Nothing et collez-y la commande ci-dessus.

C'est ça. Chaque fois que vous effectuez une validation, Git déclenchera les commandes de post-validation définies dans le fichier.

16
Nav

Comme la réponse précédente montrait un exemple de ce à quoi le crochet complet pourrait ressembler, voici le code de mon crochet de travail post-réception:

#!/usr/bin/python

import sys
from subprocess import call

if __== '__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 ne déclenche les travaux jenkins que lorsque vous passez à maîtriser et non à d’autres branches.

3
Zitrax

Je veux ajouter aux réponses ci-dessus qu'il 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 qu'un utilisateur anonyme avait besoin d'une autorisation de lecture.

J'ai vu deux solutions possibles:

1: Changer mon crochet pour:

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

2: paramétrage de l'autorisation par projet.

L'ancienne solution présente l'inconvénient de devoir exposer mon mot de passe dans le fichier hook. Inacceptable dans mon cas.

La seconde fonctionne pour moi. Dans les paramètres d'authentification globaux, je devais activer Overall> Read for Anonymous user. Dans le projet que je voulais déclencher, je devais activer Job> Build and Job> Read for Anonymous.

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

3
anhoppe