运行 Docker Maven 环境中的 jmeter-maven-plugin 总是导致 403 错误
Running the jmeter-maven-plugin in a Docker Maven environment results always in 403 errors
当我在 Docker 环境中使用 Jenkins 开始使用 jmeter-maven-plugin 进行 JMeter 测试时,HttpRequests 将始终失败并显示 403。
在 Docker 环境中或仅在我的 PC(主机)上接收 SpringBootApplication 运行s 并不重要。
Docker 环境是 'Docker for Windows'。
运行 Windows(没有 Docker)上的 Maven 中的 jmeter-maven-script,然后一切 运行 都很顺利。此外,JMeter GUI 中的 运行ning 工作正常。
更新:
- 当我将 URL 更改为无效的时,403 http 状态仍然存在。将路径更改为无效服务器会一直显示 403 http 状态。
- 当我在 http://example.com 上启动 JMeter 运行(1 个线程,2 次)时它起作用了。
- 在同一 Docker 网络上的端口 80 上启动 SpringBootApplication 也无法正常工作。都使用 http://localhost and http://dockercontainername 失败 "Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused)"
我在 Windows 上准备了 JMeter 脚本文件。我将文件复制到我的 Spring Maven 项目。
我不想在我所有的环境中安装 JMeter 东西,所以使用 jmeter-maven-plugin 是一个很好的解决方案。
你能帮我解决这个非常烦人的问题吗?
我的 Maven 插件描述是:
<plugin>
<groupId>com.lazerycode.jmeter</groupId>
<artifactId>jmeter-maven-plugin</artifactId>
<version>2.7.0</version>
<executions>
<execution>
<id>jmeter-tests</id>
<goals>
<goal>jmeter</goal>
</goals>
<phase>verify</phase>
</execution>
</executions>
<configuration>
<skipTests>${skipPerformanceTests}</skipTests>
<testFilesDirectory>${project.basedir}/src/main/resources/jmeter</testFilesDirectory>
<resultsDirectory>${project.basedir}/target/jmeter/testFiles</resultsDirectory>
<resultsFileFormat>csv</resultsFileFormat>
</configuration>
</plugin>
我的 JMeter 脚本:
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value"></stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">http://127.0.0.1:8080/indexRoleA.html</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
</HTTPSamplerProxy>
我的 JMeter HttpRequets 就像转到 /indexRole.html 一样简单。
请随时提供比这个更好的答案。至少这是一个很好的'workaround'。我尝试了所有组合,包括配置 Docker 网络等。
如果您有更好的解决方案,请告诉我。
总而言之,当在 Docker 容器中启动 Jenkins 时,Jmeter 似乎无法连接到另一个 (Docker) Spring 我电脑上的启动应用程序。
因此,我从 Shell 启动了 Spring 启动应用程序。这有效:
try {
sh "mv target/jenkinstesting-0.1-SNAPSHOT.jar ./jenkingstest.jar"
sh "nohup java -jar -Dserver.port=8081 ./jenkingstest.jar &"
sh "mvn clean verify -Dmaven.test.skip=true -P performancetest"
} catch(e) {
...
}
sh "curl -X GET http://localhost:8081/exit" // which will exit my application
sh "rm -f ./jenkingstest.jar"
为什么使用端口 8081?否则我会与其他(已启动的)测试内容发生冲突。并移动 JAR?同样的道理。欢迎任何改进!
JMeter测试是从Maven启动的。 Maven 在 Jenkins Docker 容器 中执行,因此 Docker 网络和容器名称是 必需的。
因此需要解决问题:
- 确定Jenkins容器的网络(使用:docker网络ls)
- 当运行下一个脚本时,Docker容器'under test'被添加到确定的网络。 docker 容器收到了明确的容器名称。
- 测试是使用 URL 到 (运行) Docker 容器名称执行的。
因此,测试作为 Jenkinsjob(在 Docker 容器中)启动,其中:
sh "docker login -u ${env.DOCKER_USERNAME} -p ${env.DOCKER_PASSWORD}"
sh "docker build -t org/project1:latest ."
sh "docker run -d -p 8080:8080 --name jenkinsperformacetester --network=docker-compose_default org/project1:latest"
sh "mvn clean verify -Dmaven.test.skip=true -P performancetest"
这是正确的解决方案。我很高兴提到的 'workaround' 现在被宣布为过时了。
当我在 Docker 环境中使用 Jenkins 开始使用 jmeter-maven-plugin 进行 JMeter 测试时,HttpRequests 将始终失败并显示 403。 在 Docker 环境中或仅在我的 PC(主机)上接收 SpringBootApplication 运行s 并不重要。 Docker 环境是 'Docker for Windows'。
运行 Windows(没有 Docker)上的 Maven 中的 jmeter-maven-script,然后一切 运行 都很顺利。此外,JMeter GUI 中的 运行ning 工作正常。
更新:
- 当我将 URL 更改为无效的时,403 http 状态仍然存在。将路径更改为无效服务器会一直显示 403 http 状态。
- 当我在 http://example.com 上启动 JMeter 运行(1 个线程,2 次)时它起作用了。
- 在同一 Docker 网络上的端口 80 上启动 SpringBootApplication 也无法正常工作。都使用 http://localhost and http://dockercontainername 失败 "Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused)"
我在 Windows 上准备了 JMeter 脚本文件。我将文件复制到我的 Spring Maven 项目。
我不想在我所有的环境中安装 JMeter 东西,所以使用 jmeter-maven-plugin 是一个很好的解决方案。
你能帮我解决这个非常烦人的问题吗?
我的 Maven 插件描述是:
<plugin>
<groupId>com.lazerycode.jmeter</groupId>
<artifactId>jmeter-maven-plugin</artifactId>
<version>2.7.0</version>
<executions>
<execution>
<id>jmeter-tests</id>
<goals>
<goal>jmeter</goal>
</goals>
<phase>verify</phase>
</execution>
</executions>
<configuration>
<skipTests>${skipPerformanceTests}</skipTests>
<testFilesDirectory>${project.basedir}/src/main/resources/jmeter</testFilesDirectory>
<resultsDirectory>${project.basedir}/target/jmeter/testFiles</resultsDirectory>
<resultsFileFormat>csv</resultsFileFormat>
</configuration>
</plugin>
我的 JMeter 脚本:
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value"></stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">http://127.0.0.1:8080/indexRoleA.html</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
</HTTPSamplerProxy>
我的 JMeter HttpRequets 就像转到 /indexRole.html 一样简单。
请随时提供比这个更好的答案。至少这是一个很好的'workaround'。我尝试了所有组合,包括配置 Docker 网络等。 如果您有更好的解决方案,请告诉我。
总而言之,当在 Docker 容器中启动 Jenkins 时,Jmeter 似乎无法连接到另一个 (Docker) Spring 我电脑上的启动应用程序。
因此,我从 Shell 启动了 Spring 启动应用程序。这有效:
try {
sh "mv target/jenkinstesting-0.1-SNAPSHOT.jar ./jenkingstest.jar"
sh "nohup java -jar -Dserver.port=8081 ./jenkingstest.jar &"
sh "mvn clean verify -Dmaven.test.skip=true -P performancetest"
} catch(e) {
...
}
sh "curl -X GET http://localhost:8081/exit" // which will exit my application
sh "rm -f ./jenkingstest.jar"
为什么使用端口 8081?否则我会与其他(已启动的)测试内容发生冲突。并移动 JAR?同样的道理。欢迎任何改进!
JMeter测试是从Maven启动的。 Maven 在 Jenkins Docker 容器 中执行,因此 Docker 网络和容器名称是 必需的。
因此需要解决问题:
- 确定Jenkins容器的网络(使用:docker网络ls)
- 当运行下一个脚本时,Docker容器'under test'被添加到确定的网络。 docker 容器收到了明确的容器名称。
- 测试是使用 URL 到 (运行) Docker 容器名称执行的。
因此,测试作为 Jenkinsjob(在 Docker 容器中)启动,其中:
sh "docker login -u ${env.DOCKER_USERNAME} -p ${env.DOCKER_PASSWORD}" sh "docker build -t org/project1:latest ." sh "docker run -d -p 8080:8080 --name jenkinsperformacetester --network=docker-compose_default org/project1:latest" sh "mvn clean verify -Dmaven.test.skip=true -P performancetest"
这是正确的解决方案。我很高兴提到的 'workaround' 现在被宣布为过时了。