Дженкинс с pylint дает сбой сборки

Я добавил шаг сборки для выполнения скрипта Python.
В этом скрипте pylint вызывается с lint.Run(..args) для проверки кода.
Скрипт работает, но в итоге сборка завершается с ошибкой единственное сообщение об ошибке:

Build step 'Execute Python script' marked build as failure

У кого-то есть идея, почему это происходит?


person Gobliins    schedule 08.09.2011    source источник


Ответы (8)


кажется, что ваш выход из выполнения pylint с ненулевым статусом (отсутствует скрипт, неверные параметры...), возможно, вы выходите из скрипта с поднятым исключением или sys.exit(something_else_than_zero)

person Cédric Julien    schedule 08.09.2011
comment
Чертовски. Я отладил lint.py и обнаружил вызов sys.exit(self.linter.msgstatus), где msgstatus не может быть найден в контексте. Замена этого на 0 сработала, и теперь сборки выполняются успешно. - person Gobliins; 08.09.2011

Вы также можете просто поставить

пилин || выход 0

в командной строке оболочки. Плагин Pylint в любом случае не сможет выполнить сборку, проверив результат pyllint.

person fabrizioM    schedule 28.01.2012
comment
Проблема в том, что если pylint не запустится, вы пропустите ошибку, так как это все еще код выхода 0. - person Adam Parkin; 24.09.2018

Pylint имеет неприятное поведение, возвращая ненулевой код выхода, даже если была обнаружена небольшая проблема с предупреждением. Только когда все в порядке, возвращается 0 (см. справочную страницу).

Поскольку обычно ненулевой код означает ошибку, Jenkins не удается выполнить сборку.

Я вижу два пути преодоления этого:

  • Используйте небольшой скрипт вокруг pylint, который всегда возвращает 0. Тогда jenkins не выйдет из строя из-за pylint. Я использую небольшой скрипт Python, вызывающий pylint с os.system() и sys.exit(0) после этого. Вы можете видеть, что это переопределяет код ошибки pylint.
  • Патч пилинт. Например, в моей системе Linux вызов sys.exit() находится в файле /usr/lib/pymodules/python2.6/pylint/lint.py.
person dmeister    schedule 08.09.2011
comment
Я передал вывод в cat, и теперь он успешно строится. например pylint -f html code.py | cat > report.html - person zyxue; 13.04.2016

В Pylint 1.9.3 есть флаг --exit-zero.

https://github.com/PyCQA/pylint/blob/1.9/ChangeLog#L47

person sheryl pinto    schedule 28.02.2019

В последнем rylint есть возможность не вызывать sys exit

lint.Run(args, exit=False, **kwargs)
person kmmbvnr    schedule 03.04.2012

Столкнулся с этим сегодня (хотя не использовал Дженкинса).

В моем случае это произошло из-за того, как Pylint кодирует информацию о фатальной ошибке-предупреждении-рефакторинга-конвенции-использования в своем коде выхода: https://docs.pylint.org/en/1.6.0/run.html#exit-codes

Мое исправление:

#!/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))

(Суть: https://gist.github.com/nkashy1/ae59d06d4bf81fb72047fcd390d08903)

person Neeraj Kashyap    schedule 26.08.2019
comment
Примечание. Я не хотел использовать --exit-zero, так как это не позволяет мне завершить сборку при наличии законных ошибок (например, при ошибках undefined-variable в Pylint). - person Neeraj Kashyap; 26.08.2019

Pylint ожидает, что анализируемый код будет на 100% идеальным. Даже предупреждение о коде может привести к выходу с ненулевым кодом состояния. Попробуйте исправить свой код, как предлагает Pylint, и оцените 10/10.

Надеюсь это поможет.

person Safiqur Rhaman    schedule 23.03.2020

Я согласен с @dmeister, но с конвейерным кодом (Jenkinsfile) я предлагаю попробовать/поймать, а затем проанализировать ошибку. Таким образом, вы можете определить, получаете ли вы только биты состояния от pylint (см. документы Pylint), сообщает ли pylint об ошибке использования или произошел катастрофический сбой:

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

Приношу свои извинения строгим пуристам — заводной стиль не для меня, поэтому я уверен, что это можно улучшить — дайте мне знать. Есть одна известная дыра: если pylint обнаруживает только "фатальные" ошибки (бит 0) и никакие другие проблемы (биты 1-4 не установлены), то этот код будет некорректно генерировать исключение. Но мой код помечает массу проблем, так что для меня это не проблема. Исправление (?Сообщение об ошибке синтаксического анализа?) может быть тривиальным для тех, у кого отличные навыки.

person Generic Ratzlaugh    schedule 28.07.2017