12
votes

Jenkins avec Pylint donne une défaillance de construction

J'ai ajouté une étape de construction pour exécuter un script Python.
Dans ce script, Pylint est appelé avec le Lint.Run (.. args) pour vérifier le code.
Le script fonctionne mais à la fin, la construction échoue avec le seul message d'erreur:

Build Step 'Exécuter le script Python' marqué Build comme panne

Quelqu'un a une idée pourquoi cela se produit?


0 commentaires

8 Réponses :


3
votes

Il semble que votre exécution de pylint sortie avec un statut non zéro (script manquant, options mauvaises ...), vous quittez peut-être le script avec une exception soulevée ou un sys.exit (quelque chose_else_than_zzero)


1 commentaires

Putain droit. J'ai débogué le lint.py et j'ai découvert un appel sys.exit (self.linter.msgstatus) où le msgstatus n'a pas pu être trouvé dans le contexte. Remplacer cela avec un 0 travaillé et maintenant les constructions successives.



14
votes

PYLINT a le comportement désagréable de renvoyer un code de sortie non nul uniquement si un petit problème d'avertissement a été trouvé. Seulement quand tout allait bien, 0 est retourné (voir la page man).

Comme généralement un code non zéro dénote une erreur, Jenkins échoue la construction.

Je vois deux façons de surmonter ceci:

  • Utilisez un petit script autour de Pylint qui retourne toujours 0. Alors Jenkins n'échouera pas à cause de Pylint. J'utilise un petit script Python appelant pylint avec OS.System () et Sys.exit (0) après. Vous pouvez le voir comme alléger le code d'erreur de Pylint.
  • Patch Pylint. Par exemple, sur mon système Linux, l'appel SYS.EXIT () est dans le fichier /usr/lib/pymodules/python2.6/pylint/lint.py

1 commentaires

J'ai eu la sortie de la sortie au chat et il semble de construire avec succès maintenant. par exemple. pylint -f code html.py | Cat> Report.html



22
votes

Vous pouvez également simplement mettre un

pylint || Quitter 0

dans la coquille cmdline. Le plug-in Pylint échouera de toute façon la construction en vérifiant le résultat de Pyllint.


1 commentaires

Le problème avec ceci est que si Pylint ne parvient pas à exécuter, alors vous allez manquer l'erreur car il est toujours un code de sortie 0.



2
votes

Rylint récente a la possibilité de ne pas appeler SYS Quitter

lint.Run(args, exit=False, **kwargs)


0 commentaires

0
votes

Je suis d'accord avec @dmeister, mais avec le code de pipeline (Jenkinsfile), je suggère un try / prise puis sur l'erreur. De cette façon, vous pouvez déterminer si vous obtenez des bits de statut de Pylint (voir la Pylint Docs), si Pylint signale une erreur d'utilisation, ou s'il y avait une faute catastrophique: xxx

excuses à Groovy Purist - Groovy n'est pas ma chose, alors je suis sûr que cela peut être amélioré - laissez-moi savoir. Il y a un trou connu: si Pylint détecte uniquement des erreurs "mortaux" -Type (bit 0) et aucun autre type de type (bits 1-4 n'est pas défini), ce code jette une exception incorrecte. Mais mon code marque des tonnes de problèmes, ce n'est donc pas un problème pour moi. Le correctif (? Erreur d'analyse MSG?) Peut-être être trivial pour une personne avec des côtelettes groovy.


0 commentaires

11
votes

dans pylint 1.9.3, il y a un - sortie-zéro drapeau.

https://github.com/pycqa/pylint/blob/1.9/ Changelog # L47


0 commentaires

1
votes

a couru dans cette situation aujourd'hui (bien qu'utilisant Jenkins).

Dans mon cas, c'est à cause de la façon dont Pylint code pour la fatale-erreur-Erreur-avertissement - refactor-info d'utilisation dans son code de sortie: https://docs.pylint.org/en/1.6.0/Run.html# Codes de sortie P>

My Correction: P>

#!/usr/bin/env sh

# Wraps Pylint invocation to produce shell-friendly exit codes
# Because Pylint exit codes are weird:
# https://docs.pylint.org/en/1.6.0/run.html#exit-codes

PYTHON_EXECUTABLE=python
if [ ! -z $PYTHON_ENV ]; then
    PYTHON_EXECUTABLE="$PYTHON_ENV/bin/python"
fi

${PYTHON_EXECUTABLE} -m pylint $@

PYLINT_EXIT_CODE=$?

exit $(($PYLINT_EXIT_CODE % 4))


1 commentaires

Remarque: je ne voulais pas utiliser - sortie-zero car il ne me permet pas d'échouer construit lorsqu'il y a des erreurs légitimes (par exemple, sur d'une variable non définie-variable non définie erreurs dans Pylint).



1
votes

Pylint s'attend à ce que le code analysé soit 100% parfait. Même l'avertissement de code peut provoquer la sortie avec le code d'état non nul. Essayez de résoudre votre code comme Pylint suggérer et évaluez 10/10.

J'espère que cela aide.


0 commentaires