Jenkins参数化构建选多jmx文件并行执行JMeter脚本问题求助
Jenkins流水线代码疏漏排查
以下是代码中可导致运行异常的问题及对应修正方案:
- 函数调用顺序错误
你在调用generateStage函数生成并行任务后才定义该函数,Jenkins流水线执行时会抛出方法未找到类异常,需要把generateStage函数的定义移动到所有调用它的代码之前。 - Groovy闭包延迟绑定问题(并行场景通用坑)
Groovy循环中创建闭包时如果直接引用循环变量,会出现延迟绑定问题,最终所有并行任务都会执行最后一条JMeter命令。需要在循环中即时捕获变量值,修正collectEntries逻辑:
def parallelStagesMap = result.collectEntries { cmd -> def currentCmd = cmd def jmxName = currentCmd.split('-t ')[1].split(' ')[0] ["压测任务:${jmxName}" : generateStage(currentCmd)] }
- JMeter输出文件冲突
所有并行JMeter任务都指定了同一个输出文件out23.jtl,多进程同时写入会触发文件锁异常、结果数据混乱。需要给每个任务分配独立的输出文件名,比如用对应jmx文件名作为前缀:
def str = "jmeter -n -t ${fileNamesList[i]} -Jthreads=${val[0]} -Jdelay=${val[1]} -Jstart=${val[2]} -Jhold=${val[3]} -Jshutdown=${val[4]} -l ${fileNamesList[i]}_result.jtl"
- 并行Stage名称重复
所有Stage都使用同一个名称stage:jmeterjob,Jenkins无法正确区分并行任务,会导致执行日志混乱甚至任务中断,上文修正collectEntries时已同步处理命名唯一的问题。 - 缺少参数合法性校验
代码默认Select_JMX_Files的数量*5等于JmxParams的元素数量,如果参数传递不匹配(比如少传了某个JMX的参数、参数分隔错误),会直接抛出索引越界异常,建议增加参数校验逻辑:
if(fileValuesList.size() != fileNamesList.size() *5) { error "参数不匹配:选中${fileNamesList.size()}个JMX文件,需要传入${fileNamesList.size()*5}个参数,实际传入${fileValuesList.size()}个" }
- 全局变量隐式定义
原代码中str = "jmeter..."没有加def关键字,属于隐式全局变量,循环过程中会被覆盖,导致最终生成的命令异常,修正时需补充def关键字声明局部变量。
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

