shell Jenkins Declarative Pipeline正在退出,错误:脚本返回退出代码123

cgh8pdjw  于 2023-03-30  发布在  Shell
关注(0)|答案(1)|浏览(153)

意图:我正在写一个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
                    """
                }
            }
        }
    }
}**
dauxcl2d

dauxcl2d1#

线路有几个问题

find . -name "result.jtl" | xargs grep -c "failed:" result.jtl > outputFile.txt

首先,让我们清理代码,使其更具可读性。
您正在使用find命令将找到的result.jtl文件的路径传递给grep(使用xargs),因此不应将文件result.jtl作为参数手动传递给grep命令,因为它实际上会将文件传递两次:grep "failed:" -c result.jtl result.jtl为避免删除重复出现的result.jtl文件,应将行

find . -name "result.jtl" | xargs grep -c "failed:" > outputFile.txt

您还可以使用传递给find-exec标志来实现相同的功能,避免生成不必要的xargs进程

find . -name "result.jtl" -exec grep -c "failed:" {} + > outputFile.txt

现在,问题是grep命令在设计上会失败(返回非零退出代码)(当你的测试通过并且在result.jtl中没有找到failed:字符串时)。在Jenkins管道中,当sh步骤执行的命令失败时(返回非零退出代码)流水线阶段将立即失败,并且sh步骤将不会执行失败后的所有命令(如果没有发现错误,则不会执行cat outputFile.txt)。这就是您看不到更新文件的原因。但是,您可以执行true命令以防grep失败(未找到匹配项)以避免将错误传播到流水线。这样,sh步骤将继续进行,并且阶段将成功执行:

find . -name "result.jtl" -exec grep -c "failed:" {} + || true > outputFile.txt

相关问题