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.
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:
git notes
) lors du premier appelHEAD
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
_.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
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
_
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.
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.
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.