【问题标题】:Jenkins with pylint gives build failure带有 pylint 的 Jenkins 导致构建失败
【发布时间】:2011-09-08 11:20:00
【问题描述】:

我添加了一个构建步骤来执行 Python 脚本。
在此脚本中,使用 lint.Run(..args) 调用 pylint 来检查代码。
该脚本有效,但最终,构建失败并显示唯一的错误消息:

Build step 'Execute Python script' marked build as failure

有人知道为什么会这样吗?

【问题讨论】:

    标签: python jenkins pylint


    【解决方案1】:

    你也可以简单地放一个

    皮林特 || 0号出口

    在 shell 命令行中。通过检查 pylint 的结果,Pylint 插件无论如何都会使构建失败。

    【讨论】:

    • 这样做的问题是,如果 pylint 无法运行,那么您将错过错误,因为它仍然是 0 退出代码。
    • 使用管道工程,但下面由 sherylpinto 和 floern stackoverflow.com/questions/7347233/… 给出了更清洁的解决方案
    【解决方案2】:

    在 Pylint 1.9.3 中,有一个 --exit-zero 标志。

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

    【讨论】:

      【解决方案3】:

      Pylint 具有令人不快的行为,即仅在发现一个小的警告问题时才返回非零退出代码。只有当一切正常时,才会返回 0(参见手册页)。

      由于通常非零代码表示错误,Jenkins 构建失败。

      我看到了两种方法来克服这个问题:

      • 在 pylint 周围使用一个总是返回 0 的小脚本。这样 jenkins 就不会因为 pylint 而失败。我使用一个小的 python 脚本调用 pylint 和 os.system() 和 sys.exit(0) 之后。您可以将其视为覆盖 pylint 的错误代码。
      • 补丁 pylint。例如,在我的 Linux 系统上,sys.exit() 调用位于 /usr/lib/pymodules/python2.6/pylint/lint.py 文件中

      【讨论】:

      • 我将输出通过管道传输到 cat,现在它似乎已成功构建。例如pylint -f html code.py | cat > report.html
      【解决方案4】:

      您的 pylint 执行似乎以非零状态退出(缺少脚本、错误选项...),也许您退出脚本时引发异常或 sys.exit(something_else_than_zero)

      【讨论】:

      • 该死的直。我调试了 lint.py 并发现了在上下文中找不到 msgstatus 的调用 sys.exit(self.linter.msgstatus) 。用 0 替换它,现在构建成功了。
      【解决方案5】:

      最近的 rylint 有不调用 sys exit 的选项

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

      【讨论】:

        【解决方案6】:

        今天遇到了这个问题(虽然没有使用 Jenkins)。

        在我的情况下,这是因为 Pylint 如何在其退出代码中编码 fatal-error-warning-refactor-convention-usage 信息: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

        【讨论】:

        • 注意:我不想使用--exit-zero,因为它不允许我在出现合法错误时使构建失败(例如,Pylint 中的undefined-variable 错误)。
        【解决方案7】:

        Pylint 期望被分析的代码是 100% 完美的。 甚至代码警告也可能导致退出状态代码为非零。 尝试按照 Pylint 的建议修复您的代码并评价 10/10。

        希望这会有所帮助。

        【讨论】:

          【解决方案8】:

          我同意@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
              }
          }
          

          向 groovy 纯粹主义者道歉 - groovy 不是我的菜,所以我确信这可以改进 - 请告诉我。有一个已知漏洞:如果 pylint 仅检测到“致命”类型的错误(第 0 位)并且没有检测到任何其他类型的问题(未设置第 1-4 位),则此代码将错误地抛出异常。但是我的代码标记了很多问题,所以这对我来说不是问题。修复(?parse error msg?)对于有时髦能力的人来说可能是微不足道的。

          【讨论】:

            【解决方案9】:

            pylint 不给出零退出,但没有明显的错误消息。您可能需要跟踪以查看哪个文件 pylint 失败。并查看文件。

            对我来说,我用 init.py 文件添加了一个空目录,而 pylint 给出了同样的错误

            【讨论】:

              猜你喜欢
              • 2018-04-29
              • 1970-01-01
              • 1970-01-01
              • 2015-08-23
              • 2019-09-21
              • 1970-01-01
              • 2015-09-05
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多