我不时会遇到最终让Jenkins失望的工作,因为他们在控制台上记录太多,有时是由于或多或少的无限循环或过多的冗长。
我正在寻找能够阻止/阻止/杀死垃圾邮件作业的解决方案。
我们正在使用Jenkins管道和所有这些偶然的垃圾邮件工作在sh()
内,这让我觉得我们应该添加某种智能包装。
请不要建议修改垃圾邮件来源。我问过这个问题,因为我想在潜在的垃圾邮件发送者脚本之外防止这类问题,因为我们有数百个工作,因为不可能避免因开发人员错误而导致的迟早发送垃圾邮件。< / p>
很快:我们无法控制shell脚本中运行的内容,但我们可以控制shell的运行方式。
答案 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/