Jenkins性能插件:任务中止后如何成功生成性能报告?
解决Jenkins中止压力测试后Performance插件找不到JTL文件的问题
以下是几种实用的解决思路,按从根源修复到临时适配的顺序排列:
1. 让JMeter实时写入JTL文件(推荐)
默认情况下JMeter会缓冲测试结果,批量写入JTL文件,中止任务时缓冲数据还没刷到磁盘,导致文件延迟出现。可以通过开启自动刷新解决:
- 命令行参数方式:在Jenkins中执行JMeter的命令里添加
-Jjmeter.save.saveservice.autoflush=true,示例:jmeter -n -t testplan.jmx -l result.jtl -Jjmeter.save.saveservice.autoflush=true - 配置文件方式:修改JMeter安装目录下的
jmeter.properties,找到jmeter.save.saveservice.autoflush项,设置为true。
开启后每个测试样本都会立刻写入文件,任务中止后JTL文件会马上出现在工作区。
2. 在Performance插件前添加文件等待逻辑
如果不想修改JMeter配置,可以在Performance插件执行步骤前,加入一段脚本循环检查JTL文件是否存在,等待指定时间:
- Linux/macOS用Shell脚本:
# 替换为你的JTL文件实际路径 JTL_FILE="./result.jtl" # 最大等待时间(秒) MAX_WAIT=30 # 检查间隔(秒) CHECK_INTERVAL=2 elapsed=0 while [ ! -f "$JTL_FILE" ] && [ $elapsed -lt $MAX_WAIT ]; do sleep $CHECK_INTERVAL elapsed=$((elapsed + CHECK_INTERVAL)) echo "等待JTL文件生成,已等待${elapsed}秒..." done if [ $elapsed -ge $MAX_WAIT ]; then echo "超时:JTL文件未在${MAX_WAIT}秒内生成" exit 1 fi - Windows用PowerShell脚本:
$JtlFile = ".\result.jtl" $MaxWait = 30 $CheckInterval = 2 $Elapsed = 0 while (-not (Test-Path $JtlFile) -and $Elapsed -lt $MaxWait) { Start-Sleep -Seconds $CheckInterval $Elapsed += $CheckInterval Write-Host "等待JTL文件生成,已等待${Elapsed}秒..." } if ($Elapsed -ge $MaxWait) { Write-Error "超时:JTL文件未在${MaxWait}秒内生成" exit 1 }
将这段脚本作为Jenkins任务的一个步骤,放在Performance插件执行之前,确保插件运行时文件已经存在。
3. 优雅中止JMeter进程,而非直接终止Jenkins任务
不要直接点击Jenkins的「中止任务」按钮,而是添加一个手动触发的步骤,先让JMeter优雅停止:
- 在Jenkins任务中添加一个「字符串参数」,比如命名为
STOP_TEST,默认值为空。 - 在JMeter执行步骤后,添加一段循环检查该参数的脚本,当参数值为
true时,发送优雅停止信号给JMeter进程:JMETER_PID=$(ps aux | grep jmeter | grep -v grep | awk '{print $2}') while [ -z "${STOP_TEST}" ]; do sleep 5 done if [ "${STOP_TEST}" = "true" ] && [ ! -z "$JMETER_PID" ]; then # 发送SIGINT信号,让JMeter完成当前样本写入后退出 kill -SIGINT $JMETER_PID # 等待JMeter进程完全退出 wait $JMETER_PID fi
需要中止测试时,修改参数STOP_TEST为true并触发任务,JMeter会优雅停止并立刻生成完整的JTL文件,之后Performance插件就能正常读取。
内容的提问来源于stack exchange,提问作者Javier Rodriguez
相关产品推荐
相关产品推荐

