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
Et coché l'option "Poll SCM dans Jenkins Job":
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
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é).
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é.
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:
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.
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.
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.
il existe un moyen plus simple ... en définissant simplement le calendrier du déclencheur:
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).