2011-09-08 12 views
7

He añadido un paso de compilación para ejecutar un script de Python.
En este script, se llama a pylint con lint.Run (.. args) para verificar el código.
El script funciona pero al final, la generación falla con el único mensaje de error:Jenkins with pylint gives build failure

Build step 'Execute Python script' marked build as failure

Alguien tiene una idea de por qué sucede esto?

Respuesta

1

parece que su salida de la ejecución pylint con un estado distinto de cero (secuencia de comandos que faltan, malas opciones ...), tal vez salir del guión con una excepción elevada o sys.exit(something_else_than_zero)

+0

Maldita sea. Depuré lint.py y descubrí una llamada a sys.exit (self.linter.msgstatus) donde no se podía encontrar el msgstatus en contexto. Reemplazar esto con un 0 funcionó y ahora las compilaciones están teniendo éxito. – Gobliins

11

Pylint tiene el comportamiento desagradable devuelve un código de salida distinto de cero incluso si se encontró un pequeño problema de advertencia. Solo cuando todo estaba bien, se devuelve 0 (consulte la página de manual).

Como normalmente un código distinto de cero denota un error, Jenkins falla la compilación.

Veo dos maneras de superar este:

  • utilizar un pequeño script en torno pylint que siempre devuelve 0. Entonces Jenkins no va a fallar debido a pylint. Utilizo una pequeña secuencia de comandos python llamando a pylint con os.system() y sys.exit (0) después de. Puede verlo anulando el código de error de pylint.
  • Patch pylint. Por ejemplo, en mi sistema Linux la sys.exit() llamada está en el archivo de /usr/lib/pymodules/python2.6/pylint/lint.py
+0

Sí, muy buena idea. Probaré eso. – Gobliins

+0

¡Funcionó como esperaba! – Gobliins

+0

Conecté la salida a cat, y parece que se compila correctamente ahora. p.ej. 'pylint -f html code.py | cat> report.html' – zyxue

15

También puede simplemente poner un

pylint || salida 0

en la línea del intérprete de comandos. El plugin Pylint fallará la construcción de todos modos al verificar el resultado de pyllint.

3

rylint recientes tienen la opción de no llamar a la salida sys

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

0

estoy de acuerdo con @dmeister, pero con código de canalización (Jenkinsfile) Sugiero una prueba/captura y luego analizar el error. De esta manera se puede determinar si es sólo el bit de estado de pylint (véase los documentos pylint), ya sea pylint informa de un error de uso, o si hubo una falla catastrófica:

try {  
    sh 'pylint --output-format=parseable my_module' 
} catch (pylint_rc) { 
    // pylint_rc will be of the form 
    // "hudson.AbortException: script returned exit code NN" 
    // where NN is 1-63 and represents bit field; 
    // bits 0-4 indicate lint-ish issues in analyzed code, 
    // bit 5 indicates pylint usage error 
    echo "pylint_rc= \'$pylint_rc\'" 
    String rc = "$pylint_rc" 
    String code = rc.split()[5] 
    echo "Isolated return code string value $code" 
    int value = code.toInteger() 

    // catastrophic/crash error returns a 1; else there is a pylint return code 
    int error_bits_code = value & 0x20 
    int lint_bits_code = value & 0x1f 
    echo "pylint error_bits_code=$error_bits_code ; lint_bits_code=$lint_bits_code" 
    if ((value == 1) || (error_bits_code != 0)) { 
     currentBuild.result = "FAILURE" 
     throw pylint_rc 
    } 
} 

Disculpas a Groovy puristas - maravilloso no es lo mío, así que estoy seguro de que esto se puede mejorar, házmelo saber. Hay un agujero conocido: si pilylint detecta solo errores de tipo "fatal" (bit 0) y no hay otros problemas de ningún tipo (los bits 1-4 no están configurados), entonces este código arrojará una excepción de forma incorrecta. Pero mi código señala toneladas de problemas, así que eso no es un problema para mí. La solución (? Parse error msg?) Podría ser trivial para alguien con groovy chops.