【问题标题】:Running the jmeter-maven-plugin in a Docker Maven environment results always in 403 errors在 Docker Maven 环境中运行 jmeter-maven-plugin 总是导致 403 错误
【发布时间】:2019-05-31 20:57:31
【问题描述】:

当我在 Docker 环境中使用 Jenkins 开始使用 jmeter-maven-plugin 进行 JMeter 测试时,HttpRequests 将始终失败并显示 403。 接收 SpringBootApplication 是在 Docker 环境中运行还是仅在我的 PC(主机)上运行都没有关系。 Docker 环境是“Docker for Windows”。

在 Windows 上的 Maven 中运行 jmeter-maven-script(无 Docker),然后一切运行顺利。在 JMeter GUI 中运行也可以正常工作。

更新

  • 当我将 URL 更改为无效 URL 时,403 http 状态仍然存在。更改到无效服务器的路径会一直提供 403 http 状态。
  • 当我在http://example.com 上启动 JMeter 运行(1 个线程,2 次)时,它可以工作。
  • 在端口 80 上的同一 Docker 网络上启动 SpringBootApplication 也无法正常工作。使用 http://localhosthttp://dockercontainername 均失败,并显示“非 HTTP 响应代码:java.net.ConnectException,非 HTTP 响应消息:连接被拒绝(连接被拒绝)”

我在 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 一样简单。

【问题讨论】:

  • 403 听起来可以访问网络服务器,但在您尝试访问的路径上没有网络应用程序。您确定从 JMeter 实例中看到的 URL 是正确的吗? 8080 可能是 Jenkins 实例,而不是您认为的网络服务器。
  • 德克萨斯州。该网站处于活动状态,我可以通过浏览器或其他测试访问它。我的 Jenkins 位于端口 8888。我可以配置一些东西以便我可以看到哪些请求被触发了吗?
  • 浏览器是否在 docker 中运行?如果没有,您看到的与 JMeter 不同。

标签: maven docker jmeter jenkins-plugins jmeter-maven-plugin


【解决方案1】:

请随时提供比这个更好的答案。至少这是一个很好的“解决方法”。我尝试了所有组合,包括配置 Docker 网络等。 如果您有更好的解决方案,请告诉我。

总之,当在 Docker 容器中启动 Jenkins 时,看起来 Jmeter 无法连接到我 PC 上的另一个 (Docker) Spring Boot 应用程序。

所以,我从 Shell 启动了 SpringBoot 应用程序。这有效:

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?同样的原因。欢迎任何改进!

【讨论】:

  • 你是如何告诉 docker 两个实例应该能够互相看到的?
  • 在上述解决方案中,我没有使用 Docker。注意:我在 Jenkins Docker 实例中启动 jenkinsjob。我把它们都放在同一个网络上。我通过容器 ID 名称访问了另一个。还有什么建议吗?
【解决方案2】:

JMeter 测试从 Maven 开始。 Maven Jenkins Docker 容器中执行,因此需要使用 Docker 网络和容器名称

因此需要解决问题:

  • 确定 Jenkins 容器的网络(使用:docker network ls)
  • 在运行下一个脚本时,将“测试中”的 Docker 容器添加到确定的网络中。 docker 容器收到一个明确的容器名称。
  • 使用指向(正在运行的)Docker 容器名称的 URL 执行了测试。

因此,测试作为 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"

这是正确的解决方案。我很高兴提到的“解决方法”现在被宣布过时了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2015-04-09
    相关资源
    最近更新 更多