在“控制台输出”中包含工作区.log文件

时间:2015-05-14 15:53:59

标签: jenkins jenkins-plugins

我有一个执行“foo.sh”和“bar.sh”的Jenkins作业,这些脚本分别生成“foo.log”,“bar.log”。 foo.sh和bar.sh是长时间运行的作业,我不想在jenkins的“Console Output”视图中查看统一的日志文件。

我知道我可以将这些日志存档为构建工件,但我想从一个视图 - 控制台输出监视所有3个日志(“控制台输出”/ stdout,foo.log和bar.log)。

是否有插件或配置选项可以让我这样做?

注意:foo.shbar.sh显然是占位符,但我担心它们来自供应商,我无法修改它们来调整日志记录行为。

1 个答案:

答案 0 :(得分:2)

假设您的文件位于$WORKSPACE下:
tail -F *.log

修改
或者您可以考虑重新编写foo.shbar.sh,而不是重定向到日志文件,tee来控制日志文件。

echo "doing stuff" 2>&1|tee -a foo.log
上面将打印到控制台(显示在Jenkins控制台输出中),并重定向到foo.log

编辑2:
如果您无法控制foo.shbar.sh,则需要一个包装脚本来启动它们。

基本上,在您将foo.sh发送到后台(以便我们可以继续)之后,在您tail日志之前,您需要确保tail被杀死。我们通过启动另一个后台进程来监视foo.sh进程并终止tail(尚未在脚本中启动)来执行此操作。由于我们尚未启动tail,我们实际上并不知道它的PID是什么,因此我们通过命令行引用它

# Send foo.sh to background and record the PID
echo "Launching foo.sh to background"
nohup ./foo.sh &
foo_pid=$!
echo "Foo PID to monitor=$foo_pid"

# Launch a statement that will run ever 3 seconds to monitor status 
# of foo.sh, and if foo.sh finished, then kill a 'future' tail command
echo "Launching tail-killer to background"
nohup $(sleep 3; while kill -0 $foo_pid; do sleep 3; done; kill $(ps --no-heading -C "tail -F foo.log" | awk '{print $1}') ) &

# Tail foo.sh's log
echo "Launching tail to monitor foo.sh"
echo
tail -F foo.log
echo

# Get the return code of foo.sh
wait $foo_pid
echo "Foo.sh returned with $?

<强>考虑/改进:

  • “杀手”进程每3秒运行一次。出于性能原因,您可能希望增加
  • Foo.sh在调用tail之前可以在开始后打印超过10行。使用tail -n增加起始行数。
  • 如果检测到多个tail -F foo.log,“杀手”将会中断。您应该将其修改为更强大