web-dev-qa-db-fra.com

Jenkins considère toujours une construction réussie avec batch/bat

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)?

24
HSNN

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"
      (AAAA-MM-JJ_hh-mm-ss)

  • 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,
      cette variable contient le numéro de révision du module.
      Si vous avez plus d'un module spécifié, cela ne sera pas défini

J'espère que cela pourra aider

30
Gonen

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.

5
Stéphane Piette

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 ...

4
sdmythos_gr

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%
2
J. Beattie

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.

0
koga73

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.

0
Ravi Amlani