Je viens de rejoindre une entreprise qui utilise des fichiers de commandes pour construire un projet C++. Le lot fait toutes sortes de choses (update svn, qui est maintenant effectué par jenkins), crée des dossiers de construction, supprime les fichiers inutiles après la construction, copie les fichiers de bibliothèque dans le dossier de construction, etc.
Mon problème est que Jenkins considère toujours la construction réussie, même si ce n’est pas le cas. Le fichier .bat crée un fichier appelé errormake.txt en cas de problème. Comment faire en sorte que Jenkins lise cela et marque le build comme un échec?
De plus, y a-t-il moyen de trouver le dossier de compilation que Jenkins a créé à partir du fichier .bat (peut-être envoyer une variable lorsque j'appelle le fichier de traitement par lots)?
C’est la seule ligne que j’utilise actuellement pour appeler le fichier .bat:
call "C:\Source\BuildVersion\AppName\build_version.bat"
Edit: Ce projet est également divisé en plusieurs référentiels SVN. %SVN_REVISION%
est vide. Comment puis-je obtenir le %SVN_REVISION%
correct à partir du premier référentiel (le principal)?
Pour répondre à chacune de vos questions -
Jenkins renvoie toujours "SUCCESS", même lorsque le travail a échoué:
Jenkins définit le statut du Job en fonction du code retour de la dernière commande
qui a été exécuté dans chaque bloc "Exécuter la commande batch windows} _".
Si votre dernière commande est copy some.log D:
,
Jenkins pense que tout va bien
(Si la commande 'copy
' s'est bien passée ...)
Utilisez EXIT xx
ou EXIT /B xx
, selon votre système d'exploitation,
où 'xx' est un nombre entier supérieur à zéro.
Comment faire que Jenkins marque la construction comme un échec, basé sur un fichier journal:
Utilisez le plug-in Text-Finder, comme indiqué par sdmythos_gr.
Est-il possible de trouver le dossier de compilation que Jenkins a créé:
Quelques paramètres sont disponibles en tant que variables d'environnement
pour chaque script exécuté sous Jenkins - voir ici la liste de ces paramètres:
Variables d'environnement Jenkins .
A votre question:
%WORKSPACE%
- Le chemin absolu de l'espace de travail%BUILD_NUMBER%
- Le numéro de build actuel, tel que "153"%BUILD_ID%
- L'identifiant de construction actuel, tel que "2005-08-22_23-59-59"Comment puis-je obtenir le% SVN_REVISION% correct du premier référentiel:
Cette réponse provient du même lien:
%SVN_REVISION%
- Pour les projets basés sur Subversion,J'espère que cela pourra aider
Jenkins utilise le code d'erreur de Windows pour savoir si une génération a échoué ou non . Vous devriez renvoyer une valeur différente de 0 lorsque votre génération a échoué, avec "exit/B 1" par exemple.
Je vais aussi répondre à une partie de votre question.
Vous pouvez utiliser un plug-in de recherche de texte pour Jenkins . https://wiki.jenkins-ci.org/display/JENKINS/Text-Finder+Plugin
Vous pouvez marquer la construction comme instable ou échouer à la fin de la construction en fonction du contenu d'un fichier ou de la sortie de la console.
Peut-être que cela pourrait aider ...
Sur les versions "plus récentes" de Windows (que j'ai testées sur Server 2012 R2), indiquez ce qui suit à la fin de chaque commande de lot Windows:
@EXIT /b %ERRORLEVEL%
Cela transmettra le code d'erreur que le cmd.exe a reçu à l'appelant (c'est-à-dire Jenkins). Le "@" désactive l'écho pour ne pas encombrer votre journal.
Si vous avez plusieurs lignes dans la commande et souhaitez vous arrêter après le premier échec, indiquez ce qui suit après chaque ligne à vérifier (oui, ce n'est pas joli):
@IF NOT %ERRORLEVEL% == 0 EXIT /b %ERRORLEVEL%
Par exemple:
step1.exe
@IF NOT %ERRORLEVEL% == 0 EXIT /b %ERRORLEVEL%
step2.exe
@IF NOT %ERRORLEVEL% == 0 EXIT /b %ERRORLEVEL%
call "C:\Source\BuildVersion\AppName\build_version.bat"
@EXIT /b %ERRORLEVEL%
Comme d'autres utilisateurs l'ont indiqué, vos fichiers de commandes doivent utiliser "exit/B 1". Voici une astuce pour enchaîner vos appels, ce qui permettra à Jenkins de renvoyer un échec si l’un échoue:
call a.bat &&^
echo "a success" &&^
call b.bat &&^
echo "b success"
"&&" indique que l'action suivante ne doit être exécutée qu'en cas de succès (code de sortie 0). "^" nous permet de scinder la commande en plusieurs lignes. L'inconvénient de cette approche est que la barre de progression de la construction ne s'affiche pas correctement.
Je sais que la question est assez ancienne mais peut être utile à certaines personnes. Pour exécuter votre fichier bat, au lieu d'utiliser la ligne suivante,
call "C:\Source\BuildVersion\AppName\build_version.bat"
Vous pouvez utiliser le format ci-dessous,
<someRelativeOrAbsolutePath>\<.batFileName> <param1> <param2> <and so on>
L'exécution de la commande de cette manière à l'intérieur de Execute Windows Batch Command of Build section de Jenkins utilisera votre dernier code retour de la commande. ${BUILD_STATUS}
en dépendra. Et vous n'aurez pas à modifier votre script pour renvoyer des codes d'erreur basés sur des conditions.