意图:我正在写一个Jenkins Declarative pipeline来集成JMeter测试套件和JenkinsCore。在某个时候,jmeter.sh脚本被调用,我生成了xml格式的jmeter. jtl文件。我想从生成的jmeter.jtl文件中grep一个字符串“failure:“,并将stdout计数复制到一个文件中。
问题:我的声明性脚本在有错误计数的情况下工作正常。输出文件会用错误计数更新,但在成功的情况下不会发生同样的更新。理想情况下,输出文件应该在成功的情况下用值0写入。PS:我在我的c2c中尝试了相同的命令,它工作正常。
我的代码在下面
**pipeline {
agent {
}
stages {
stage {
steps {
script {
sh """
./jmeter.sh <arguments> -n -t <*.jmxFile> -l jmeter.jtl
find . -name "result.jtl" | xargs grep -c "failed:" result.jtl > outputFile.txt
cat outputFile.txt
"""
}
}
}
}
}**
1条答案
按热度按时间dauxcl2d1#
线路有几个问题
首先,让我们清理代码,使其更具可读性。
您正在使用
find
命令将找到的result.jtl
文件的路径传递给grep
(使用xargs
),因此不应将文件result.jtl
作为参数手动传递给grep
命令,因为它实际上会将文件传递两次:grep "failed:" -c result.jtl result.jtl
为避免删除重复出现的result.jtl
文件,应将行您还可以使用传递给
find
的-exec
标志来实现相同的功能,避免生成不必要的xargs
进程现在,问题是
grep
命令在设计上会失败(返回非零退出代码)(当你的测试通过并且在result.jtl
中没有找到failed:
字符串时)。在Jenkins管道中,当sh
步骤执行的命令失败时(返回非零退出代码)流水线阶段将立即失败,并且sh
步骤将不会执行失败后的所有命令(如果没有发现错误,则不会执行cat outputFile.txt
)。这就是您看不到更新文件的原因。但是,您可以执行true
命令以防grep失败(未找到匹配项)以避免将错误传播到流水线。这样,sh
步骤将继续进行,并且阶段将成功执行: