web-dev-qa-db-fra.com

Le travail Jenkins se déclenche automatiquement lorsque le code est validé sur le référentiel SVN à l'aide de POST Crochet COMMIT

J'essaye de mettre en application le pipeline de CI/CD en utilisant Jenkins, docker et Ansible. J'utilise le référentiel de code SVN pour mon système de contrôle de version. Pour le déploiement et le repo de code SVN, j'utilise AWS EC2. Le déploiement et le référentiel de code sont dans une VM distincte.

Mon besoin

Lorsque je commets mon code dans le référentiel SVN, je dois déclencher un travail Jenkins. Ce travail appellera un playbook ansible. Plus tard, il créera un projet, une image Docker et se déploiera dans EC2. Donc, pour toute modification de mon référentiel de code SVN, je dois créer un travail Jenkins.

Ma tentative actuelle

J'ai ajouté le script suivant dans le fichier post-commit.tmpl sous le dossier $ repo/hooks.

REPOS="$1"
REV="$2"
UUID=`svnlook uuid $REPOS`
/usr/bin/wget \
  --header "Content-Type:text/plain;charset=UTF-8" \
  --post-data "`svnlook changed --revision $REV $REPOS`" \
  --output-document "-" \
  --timeout=2 \
  http://server/Subversion/${UUID}/notifyCommit?rev=$REV

Ce qui suit est la capture d'écran

 enter image description here

Et coché l'option "Poll SCM dans Jenkins Job":

 enter image description here

NB: Je ne cherche pas d’horaire minute/heure/semaine à sortir du repo. Au lieu de cela, je cherche quand il y a un changement de code, alors je dois construire le projet Jenkins. Donc, je n'ai ajouté aucun horaire.

Mais je ne reçois toujours pas le dernier code dans Jenkins. Comment puis-je connaître le problème lié à ma configuration?

Fichier post-commit.tmpl mis à jour

 enter image description here

8
Jacob

Comme @bahrep a déclaré qu'il était difficile de résoudre des problèmes de ce type, mais je suppose que votre point de connexion post-commit ne fonctionne pas à cause de l'option de sécurité Jenkins "Empêchez les tentatives de contrefaçon de sites croisés" (vous avez confirmé qu'il est activé). 

De Jenkins Wiki :

Si votre Jenkins utilise les "Exploits pour empêcher la falsification de requêtes sur plusieurs sites" option de sécurité, la demande ci-dessus sera rejetée avec 403 erreurs ("Aucune miette valide n'a été incluse"). La miette nécessaire dans cette demande peut être obtenu à partir de l'URL http: // serveur/crumbIssuer/api/xml (ou /api/json). Ceci peut être inclus dans l'appel wget ci-dessus avec quelque chose comme ça:

--header `wget -q --output-document - \
  'http://server/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'`

Le moyen le plus simple de confirmer si cette option de sécurité est à l'origine du problème est de la désactiver et d'essayer si le hook post-commit fonctionnera. Si oui, activez à nouveau et essayez de configurer le hook avec crumb (En fin de compte, vous voulez sécuriser les choses :))

Et assurez-vous également que Jenkins a activé l'accès en lecture anonyme:

Pour que cela fonctionne, votre Jenkins doit autoriser un accès en lecture anonyme (en particulier, accès "Job> Read") au système. Si contrôle d'accès Jenkins est plus restrictif, vous devrez peut-être spécifier le nom d'utilisateur et mot de passe, en fonction de votre authentification configuré.

 enter image description here

Modifier

Je pense que les problèmes se produisent parce que vous n'avez pas fourni l'adresse de l'instance Jenkins. Dans votre exemple Webhook, vous avez:

http://server/Subversion/${UUID}/notifyCommit?rev=$REV

Vous devez remplacer server par votre adresse d'instance Jenkins (IP, domaine ou ip et port. Cela dépend de votre configuration.).

http://yourjenkins.com/Subversion/${UUID}/notifyCommit?rev=$REV

http://<IP>:<Port>/Subversion/${UUID}/notifyCommit?rev=$REV

http://<IP>/Subversion/${UUID}/notifyCommit?rev=$REV

Ou si vous exécutez tout localement (y compris svn repo):

http://localhost:8080/Subversion/${UUID}/notifyCommit?rev=$REV

Mais rappelez-vous d'avoir:

  • Option de sécurité "Empêcher les exploits de contrefaçon de site croisés" désactivée (vous allez créer Webhook pour utiliser cette option ultérieurement, nous voulons maintenant trouver la cause fondamentale)
  • Option de sécurité "autoriser l'accès en lecture anonyme" activée

Je pense que le script hook fonctionne très bien, mais il est envoyé nulle part. Cela peut être facilement vérifié en enregistrant votre script de hook. Il suffit d'ajouter à la fin du crochet:

echo "`$REPOS` change to revision `$REV` triggered @ `date`" >> ${REPOS}/post-commit-hook.log

et regardez si le fichier de journal de validation a été créé. Si oui, cela signifie que la demande wget est envoyée de manière incorrecte.

2
Raoslaw Szamszur

J'ai beaucoup essayé de résoudre ce problème en utilisant les conseils des réponses. Enfin, j'ai eu le problème auquel je faisais face. J'ai ajouté le script post-commit dans le fichier "post-commit.tmpl". Ce fichier par défaut que j'ai obtenu lors de la création de mon référentiel SVN. Au lieu d’ajouter le "post-commit.tmpl", il est nécessaire de créer un fichier uniquement "post-commit". Cela a résolu mon problème.

1
Jacob

Il est difficile de résoudre ce problème sans voir les erreurs et le journal. Cependant, une des raisons possibles est que votre serveur SVN nécessite une authentification. Vous devez spécifier un nom d'utilisateur et un mot de passe corrects et vous assurer que ce compte d'utilisateur dispose des autorisations de lecture sur le référentiel SVN.

0
bahrep

il existe un moyen plus simple ... en définissant simplement le calendrier du déclencheur:

 jenkins screenshot

ou utilisez trigger builds remotely, si vous voulez une solution Push au lieu d'une solution d'extraction, qui nécessite la publication dans https://username:api-token@JENKINS_URL/job/Example/build, avec un jeton d'API prédéfini; authentification des clients scriptés explique-le. s'appuyer uniquement sur les modifications suggérées, car tout le reste coûterait inutilement à la puissance de traitement (ce qui équivaut à de l'argent).

0
Martin Zeitler