【问题标题】:How do I limit the amount of job console log on Jenkins?如何限制 Jenkins 上的作业控制台日志量?
【发布时间】:2017-06-05 10:10:57
【问题描述】:

有时我会遇到一些最终导致 Jenkins 失败的工作,因为他们在控制台上记录了太多日志,有时是由于或多或少的无限循环或过于冗长。

我正在寻找一种可以防止/停止/终止垃圾邮件作业的解决方案。

我们正在使用 Jenkins 管道,所有这些偶尔的垃圾邮件工作都在 sh() 内,这让我觉得也许我们应该添加某种智能包装器。

请不要建议修复垃圾邮件来源。我问这个问题是因为我想防止这种问题出现在潜在的垃圾邮件脚本之外,那是因为我们有数百个工作,并且因为无法避免迟早由开发人员错误引起的垃圾邮件错误。

简而言之:我们无法控制 shell 脚本中运行的内容,但我们可以控制 shell 的运行方式。

【问题讨论】:

标签: bash jenkins jenkins-pipeline


【解决方案1】:

如果他们的控制台日志超过了定义的大小限制,有一个插件会停止作业。

叫做“Build log file size checker

如果您通常成功的作业日志大小一致,并且变化不大,那么这可以帮助您区分循环或垃圾邮件。

【讨论】:

    【解决方案2】:

    在浪费了很多时间尝试解决这个问题后,我想出了一个可行的解决方案,如下所示:

    def sh2(script) {
        sh '''( ''' + script + ''' ) 2>&1 | tee output.log | awk -v offset=${MAX_LINES:-200} '{ if (NR <= offset) print; else { a[NR] = $0; delete a[NR-offset] } } END { for (i=NR-offset+1; i<=NR; i++) { if (!match(a[i],"^[[:space:]]*$")) print a[i]} }
    }
    

    您可以在https://github.com/ssbarnea/rhos-ci/blob/master/vars/sh2.groovy 找到最新版本,以防我发现其他错误或改进。

    如您所见,如果未定义 MAX_LINES,它将将头部和尾部限制为 200 行。如果定义了它将被使用。

    此方案是唯一在总行数

    注意:链接版本具有额外功能,例如将完整输出记录到自动排序的日志文件的能力。

    【讨论】:

      【解决方案3】:

      您可以将 returnStdout 变量添加到您的 sh 调用中,如下所示:

      node(){
          // Eliminates returned output (you can also redirect this to a variable!)
          sh returnStdout: true, script: 'echo hi; echo hi; echo hi; echo hi;'
          // Has the normal output
          sh script: 'echo hi; echo hi; echo hi; echo hi;'
      }
      

      输出的变化如下:

      [Pipeline] node
      Running on ***
      [Pipeline] {
      [Pipeline] sh
      [***] Running shell script
      + echo hi
      + echo hi
      + echo hi
      + echo hi
      [Pipeline] sh
      [***] Running shell script
      + echo hi
      hi
      + echo hi
      hi
      + echo hi
      hi
      + echo hi
      hi
      [Pipeline] }
      [Pipeline] // node
      

      如果您需要自动执行此操作,以便每个人都默认执行此操作,您应该考虑构建一个自动加载到您的 Jenkins 实例中的 Groovy 共享库(无论如何,我建议更多的大用户这样做!)。设置完成后,创建一个新脚本来执行 shell 步骤并要求用户使用它而不是普通的 sh 步骤

      这是一个很好的起始文档:https://jenkins.io/doc/book/pipeline/shared-libraries/

      【讨论】:

      • 我已经在做共享库部分,最大的问题是如何修改或重写sh() 以使其限制标准输出。请记住,我不想希望失去直播功能。从理论上讲,这可以仅使用 bash 包装器来实现,但我仍然无法在 bash 中找到一个完全有效的解决方案,只有很多不完整的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多