如何在詹金斯构建期间在批处理命令中传递特定参数
how to pass specific arguments in batch commands during jenkins builds
我正在尝试使用 Jenkins 通过 JMeter 自动执行性能测试,
每个构建都是一个 JMeter 测试,如果前一个构建成功,我想增加每个 Jenkins 构建的用户(线程)数量。
我已经配置了大部分构建,使用 SSH 插件我可以重新启动 Tomcat,复制 catalina.out,使用发布性能我可以打开 .jtl 文件并确定构建是否成功。
我想要的是为下一次构建执行不同的批处理命令(以增加用户(线程)和用户 ID 的数量)
例如:
jmeter -Jthreads=10 -n -t C:\TestScripts\script.jmx -l C:\TestScripts\Jenkins.jtl
jmeter -Jthreads=20 -n -t C:\TestScripts\script.jmx -l C:\TestScripts\Jenkins.jtl
jmeter -Jthreads=30 -n -t C:\TestScripts\script.jmx -l C:\TestScripts\Jenkins.jtl...
是否有一些好的 jmeter 插件,一些计数器,我可以用它来每次将一些变量增加 10:
jmeter -Jthreads=%variable1%...
我尝试通过设置环境变量然后将该变量递增:
"SET /A thread+=10"
但它不会更改该变量,因为 jenkins 打开了它自己的 CMD,一个新进程:
("cmd /c call C:\WINDOWS\TEMP\jenkins556482303577128680.bat")
使用以下 SET 命令将 threads
变量增加 10:
SET /A threads=threads+10
或双引号内:
SET /A "threads+=10"
不知道你的 Jenkins 配置,你安装了哪个 plugins 以及你如何 运行 测试很难想出最好的解决方案。
我能想到的唯一 "universal" 解决方法是将当前线程数写入 Jenkins workspace 中的文件,并在下次执行时从文件中读取线程值。
- 将 setUp Thread Group 添加到您的测试计划
- 将 JSR223 Sampler 添加到您的线程组
将以下Groovy code放入"Script"区:
import org.apache.jmeter.threads.ThreadGroup
import org.apache.jorphan.collections.SearchByClass
import org.apache.commons.io.FileUtils
SampleResult.setIgnore()
def file = new File(System.getenv('WORKSPACE') + System.getProperty('file.separator') + 'threads.number')
if (file.exists()) {
def newThreadNum = (FileUtils.readFileToString(file, 'UTF-8') as int) + 10
FileUtils.writeStringToFile(file, newThreadNum as String)
def engine = ctx.getEngine()
def test = org.apache.commons.lang.reflect.FieldUtils.getField(engine.getClass(), 'test', true)
def testPlanTree = test.get(engine)
SearchByClass<ThreadGroup> threadGroupSearch = new SearchByClass<>(ThreadGroup.class)
testPlanTree.traverse(threadGroupSearch)
def threadGroups = threadGroupSearch.getSearchResults()
threadGroups.each {
it.setNumThreads(newThreadNum)
}
} else {
FileUtils.writeStringToFile(file, props.get('threads'))
}
该代码会将所有 Thread Groups 中的当前线程数写入 Jenkins 工作区中名为 threads.number
的文件中,并在随后的 运行 中从中读取值,加 10 并将其写回。
现在我正在创建 20 个 .jmx 文件(1.jmx、2.jmx、3.jmx ...),每个文件都有不同数量的用户。并使用此命令调用它们:
jmeter -n -t C:\TestScripts\%BUILD_NUMBER%.jmx -l C:\TestScripts\%BUILD_NUMBER%.jtl
第一个 billd 将调用 1.jmx 第二个 2.jmx ...
这不是最好的方法,但目前有效。当我有更多时间时,我会在周末尝试你的建议。
我找到了适合我的解决方案,它非常漂亮。我创建了一个 python 脚本,它更改了一个 .CVS 文件,JMeter 从中读取线程数和起始用户 ID。此 python 脚本将起始用户 ID 增加前一个 bild 中的线程数,并将线程数增加 10
file = open('C:\Users\mp\AppData\Local\Programs\Python\Python37-32\eggs.csv', 'r')
a,b=file.readlines()[0].split(",")
print(a,b)
b=int(b)
a=int(a)
b=a+b
a=a+10
print(a,b)
f = open("C:\Users\mp\AppData\Local\Programs\Python\Python37-32\eggs2.csv", "a")
f.write(str(a)+","+str(b))
f.close()
我的电脑上有 python,我在 Jenkins 中调用脚本作为 windows Bach 命令
C:\Users\mp\AppData\Local\Programs\Python\Python37-32\python.exe C:\Users\mp\AppData\Local\Programs\Python\Python37-32\rename_write_file.py
我 python 比 Java 好得多,所以我在 Python 中实现了这个。
因此对于每个新测试,jmeter 从中读取值的 CSV 文件都会更改。
我正在尝试使用 Jenkins 通过 JMeter 自动执行性能测试, 每个构建都是一个 JMeter 测试,如果前一个构建成功,我想增加每个 Jenkins 构建的用户(线程)数量。
我已经配置了大部分构建,使用 SSH 插件我可以重新启动 Tomcat,复制 catalina.out,使用发布性能我可以打开 .jtl 文件并确定构建是否成功。
我想要的是为下一次构建执行不同的批处理命令(以增加用户(线程)和用户 ID 的数量) 例如:
jmeter -Jthreads=10 -n -t C:\TestScripts\script.jmx -l C:\TestScripts\Jenkins.jtl
jmeter -Jthreads=20 -n -t C:\TestScripts\script.jmx -l C:\TestScripts\Jenkins.jtl
jmeter -Jthreads=30 -n -t C:\TestScripts\script.jmx -l C:\TestScripts\Jenkins.jtl...
是否有一些好的 jmeter 插件,一些计数器,我可以用它来每次将一些变量增加 10:
jmeter -Jthreads=%variable1%...
我尝试通过设置环境变量然后将该变量递增:
"SET /A thread+=10"
但它不会更改该变量,因为 jenkins 打开了它自己的 CMD,一个新进程:
("cmd /c call C:\WINDOWS\TEMP\jenkins556482303577128680.bat")
使用以下 SET 命令将 threads
变量增加 10:
SET /A threads=threads+10
或双引号内:
SET /A "threads+=10"
不知道你的 Jenkins 配置,你安装了哪个 plugins 以及你如何 运行 测试很难想出最好的解决方案。
我能想到的唯一 "universal" 解决方法是将当前线程数写入 Jenkins workspace 中的文件,并在下次执行时从文件中读取线程值。
- 将 setUp Thread Group 添加到您的测试计划
- 将 JSR223 Sampler 添加到您的线程组
将以下Groovy code放入"Script"区:
import org.apache.jmeter.threads.ThreadGroup import org.apache.jorphan.collections.SearchByClass import org.apache.commons.io.FileUtils SampleResult.setIgnore() def file = new File(System.getenv('WORKSPACE') + System.getProperty('file.separator') + 'threads.number') if (file.exists()) { def newThreadNum = (FileUtils.readFileToString(file, 'UTF-8') as int) + 10 FileUtils.writeStringToFile(file, newThreadNum as String) def engine = ctx.getEngine() def test = org.apache.commons.lang.reflect.FieldUtils.getField(engine.getClass(), 'test', true) def testPlanTree = test.get(engine) SearchByClass<ThreadGroup> threadGroupSearch = new SearchByClass<>(ThreadGroup.class) testPlanTree.traverse(threadGroupSearch) def threadGroups = threadGroupSearch.getSearchResults() threadGroups.each { it.setNumThreads(newThreadNum) } } else { FileUtils.writeStringToFile(file, props.get('threads')) }
该代码会将所有 Thread Groups 中的当前线程数写入 Jenkins 工作区中名为
threads.number
的文件中,并在随后的 运行 中从中读取值,加 10 并将其写回。
现在我正在创建 20 个 .jmx 文件(1.jmx、2.jmx、3.jmx ...),每个文件都有不同数量的用户。并使用此命令调用它们:
jmeter -n -t C:\TestScripts\%BUILD_NUMBER%.jmx -l C:\TestScripts\%BUILD_NUMBER%.jtl
第一个 billd 将调用 1.jmx 第二个 2.jmx ... 这不是最好的方法,但目前有效。当我有更多时间时,我会在周末尝试你的建议。
我找到了适合我的解决方案,它非常漂亮。我创建了一个 python 脚本,它更改了一个 .CVS 文件,JMeter 从中读取线程数和起始用户 ID。此 python 脚本将起始用户 ID 增加前一个 bild 中的线程数,并将线程数增加 10
file = open('C:\Users\mp\AppData\Local\Programs\Python\Python37-32\eggs.csv', 'r')
a,b=file.readlines()[0].split(",")
print(a,b)
b=int(b)
a=int(a)
b=a+b
a=a+10
print(a,b)
f = open("C:\Users\mp\AppData\Local\Programs\Python\Python37-32\eggs2.csv", "a")
f.write(str(a)+","+str(b))
f.close()
我的电脑上有 python,我在 Jenkins 中调用脚本作为 windows Bach 命令
C:\Users\mp\AppData\Local\Programs\Python\Python37-32\python.exe C:\Users\mp\AppData\Local\Programs\Python\Python37-32\rename_write_file.py
我 python 比 Java 好得多,所以我在 Python 中实现了这个。 因此对于每个新测试,jmeter 从中读取值的 CSV 文件都会更改。