在Jenkins管道sh脚本中,更改一个命令以将输出改为tee到文件,并处理所有其他问题

omvjsjqw  于 2023-03-22  发布在  Jenkins
关注(0)|答案(1)|浏览(128)

我有一个Jenkins共享库,其中包含一堆“sh”管道步骤,这些步骤使用各种目标和参数执行“mvn”。
我从一个简单的要求开始:修改所有的参数,使所有的输出和stdout(包括stderr)沿着被“tee”到一个文件中,这本身很容易做到,但是结果会导致一连串的问题。
所以,首先,如果我们从这个开始:

sh('mvn compile')

我们这样做:

sh('mvn compile 2>&1 | tee mvn.out')

这样做的问题在于未说明的要求,即其他一切仍然像以前一样工作,例如如果mvn命令因编译错误而失败,则管道步骤失败,构建失败。
接下来,我尝试这样的东西:

sh('set -o pipefail; mvn compile 2>&1 | tee mvn.out')

这将失败:

set: Illegal option -o pipefail

这提醒了我,“sh”管道步骤运行的是Bourne shell,而不是Bash。
我现在正在尝试这样的东西:

sh '''
    bash -c set -o pipefail && \
    mvn ... 2>&1 | tee mvn.out
'''

它运行了mvn命令并将输出tee到文件和stdout,但是当我强制一个字符到一个源文件中,以强制编译错误时,它在这个命令之后继续运行,而没有导致构建失败,这意味着“pipefail”选项不起作用。

oxosxuxt

oxosxuxt1#

试试看:

sh '''#!/bin/bash
exec > >(tee mvn.out) 2>&1 
mvn ...
'''

或:

sh '''#!/bin/bash
set -o pipefail && mvn ... 2>&1 | tee mvn.out
'''

或:

sh '''#!/bin/bash
mvn ... > >(tee mvn.out) 2>&1
'''

或者如果你想显式调用bash,你可以做一个漂亮的前缀:

sh '''
bash -o pipefail -c '"$@" 2>&1 | tee mvn.out' -- mvn ...
'''

我喜欢最后一个,可以存储在变量中:

redir = "bash -o pipefail -c '\"\$@\" 2>&1 | tee mvn.out' --"
sh "${redir} mvn ..."

相关问题