我有一个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”选项不起作用。
1条答案
按热度按时间oxosxuxt1#
试试看:
或:
或:
或者如果你想显式调用bash,你可以做一个漂亮的前缀:
我喜欢最后一个,可以存储在变量中: