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

Bash 如何限制Jenkins上作业控制台的登录量?,bash,jenkins,jenkins-pipeline,Bash,Jenkins,Jenkins Pipeline,有时我会遇到一些作业,这些作业最终导致Jenkins停机,因为它们在控制台上记录了太多日志,有时是由于或多或少的无休止的循环或太多的冗长 我正在寻找一种可以防止/阻止/杀死垃圾邮件工作的解决方案 我们正在使用Jenkins管道,所有这些偶尔的垃圾邮件作业都在sh()中,这让我觉得也许我们应该添加一些智能包装器 请不要建议改为修复垃圾邮件源。我问这个问题是因为我想从潜在的垃圾邮件脚本之外防止此类问题,因为我们有数百个工作,而且不可能避免由开发人员错误导致的早晚的垃圾邮件错误 简而言之:我们无法控制

有时我会遇到一些作业,这些作业最终导致Jenkins停机,因为它们在控制台上记录了太多日志,有时是由于或多或少的无休止的循环或太多的冗长

我正在寻找一种可以防止/阻止/杀死垃圾邮件工作的解决方案

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

请不要建议改为修复垃圾邮件源。我问这个问题是因为我想从潜在的垃圾邮件脚本之外防止此类问题,因为我们有数百个工作,而且不可能避免由开发人员错误导致的早晚的垃圾邮件错误


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

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


这是一个很好的开始文档:

在浪费了很多时间试图解决这个问题后,我终于想出了一个可行的解决方案,看起来像:

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]} }
}
def sh2(脚本){
sh''('''+script+''')2>&1 | tee output.log | awk-v offset=${MAX_LINES:-200}{如果(NR有一个插件,如果作业的控制台日志超过了定义的大小限制,它将停止作业

它被称为“”


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

我假设您熟悉to
/dev/null
?Aka
sh“oh-my-good.sh>/dev/null”
。如何限制日志?我已经在做共享库部分了,最大的问题是如何修改或重写
sh()
限制stdout输出。请记住,我不想失去直播功能。理论上,这可以只用bash包装器实现,但我仍然无法在bash中找到一个完全有效的解决方案,只是有很多不完整的解决方案。