如何限制Jenkins的作业控制台登录量?

时间:2017-06-05 10:10:58

标签: bash jenkins jenkins-pipeline

我不时会遇到最终让Jenkins失望的工作,因为他们在控制台上记录太多,有时是由于或多或少的无限循环或过多的冗长。

我正在寻找能够阻止/阻止/杀死垃圾邮件作业的解决方案。

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

请不要建议修改垃圾邮件来源。我问过这个问题,因为我想在潜在的垃圾邮件发送者脚本之外防止这类问题,因为我们有数百个工作,因为不可能避免因开发人员错误而导致的迟早发送垃圾邮件。< / p>

很快:我们无法控制shell脚本中运行的内容,但我们可以控制shell的运行方式。

3 个答案:

答案 0 :(得分:2)

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

它被称为&#34; Build log file size checker&#34;

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

答案 1 :(得分:1)

经过多次浪费,经过各种尝试来解决这个问题,我能够找到一个看起来像这样的工作解决方案:

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行。如果已定义,将使用它。

当总行数<200时,此解决方案是唯一不重复输出的解决方案。它也可以在流模式下工作,所以你可以实时看到输出。

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

答案 2 :(得分:0)

您可以将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/