一尘不染

Jenkins控制台输出不是实时的

jenkins

对詹金斯来说还很新,我有一个简单而烦人的问题。当我在Jenkins上运行作业(构建)时,我触发ruby命令执行我的测试脚本。

问题是Jenkins没有从控制台实时显示输出。这是触发日志。

Building in workspace /var/lib/jenkins/workspace/foo_bar
No emails were triggered.
[foo_bar] $ /bin/sh -xe /tmp/hudson4042436272524123595.sh
+ ruby /var/lib/jenkins/test-script.rb

基本上,它会挂在此输出上,直到构建完成为止,而不是仅仅显示完整的输出。有趣的是,这不是一致的行为,有时它可以正常工作。但是大多数时候没有实时控制台输出。

詹金斯版本:1.461


阅读 970

收藏
2020-07-25

共1个答案

一尘不染

为了澄清一些答案。

  • rubypython任何明智的脚本语言将缓冲输出;这是为了最大程度地减少IO;写入磁盘速度很慢,写入控制台速度很慢…
  • 通常flush(),在缓冲区中有足够的数据并且对换行符进行特殊处理之后,数据会自动被编辑。例如,编写不带换行符的字符串,则sleep()sleep()完成之后才写任何东西(我仅sleep作为示例,可以用任何其他昂贵的系统调用代替)。

例如,这将等待8秒,打印一行,再等待5秒钟,打印第二行。

from time import sleep

def test():
    print "ok",
    time.sleep(3)
    print "now",
    time.sleep(5)
    print "done"
    time.sleep(5)
    print "again"

test()
  • rubySTDOUT.sync =true打开autoflush;所有写入STDOUT后跟flush()。这样可以解决您的问题,但会导致更多的IO。

    STDOUT.sync = true
    
  • 对于python,您可以使用python -u或环境变量PYTHONUNBUFFERED来使它stdin/stdout/stout不被缓冲,但是还有其他解决方案不会改变stdinstderr

    export PYTHONUNBUFFERED=1
    
  • 对于perl,你有autoflush

    autoflush STDOUT 1;
    
2020-07-25