Запуск jmeter-maven-plugin в среде Docker Maven всегда приводит к 403 ошибкам - PullRequest
0 голосов
/ 12 января 2019

Когда я запускаю в среде Docker с Дженкинсом тест JMeter с использованием jmeter-maven-plugin, то HttpRequests всегда будет завершаться с 403. Не имеет значения, работает ли принимающее SpringBootApplication в среде Docker или только на моем ПК (хосте). Среда Docker - это «Docker для Windows».

Запуск jmeter-maven-script в Maven в Windows (без Docker), тогда все работает гладко. Также работает в графическом интерфейсе JMeter работает нормально.

Обновления :

  • Когда я изменяю URL на недействительный, статус 403 http остается. Изменение пути к недействительному серверу продолжает давать статус http 403.
  • Когда я запускаю JMeter (1 поток, 2 раза) на http://example.com, это работает.
  • Запуск SpringBootApplication в той же сети Docker через порт 80 также не работает. Оба с использованием http://localhost и http://dockercontainername завершаются с ошибкой «Не HTTP-код ответа: java.net.ConnectException, Не HTTP-ответное сообщение: соединение отклонено (соединение отклонено)»

Я готовлю файл сценария JMeter в Windows. Я копирую файл в свой проект Spring Maven.

Я предпочитаю НЕ устанавливать JMeter во всех моих средах, поэтому работа с плагином jmeter-maven-является хорошим решением.

Можете ли вы помочь мне решить эту очень раздражающую проблему?

Описание плагина My 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.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Тест JMeter запускается из Maven. Maven выполняется в контейнере Jenkins Docker, поэтому работа с сетями Docker и именами контейнеров обязательна .

Решение проблемы требуется поэтому:

  • Определение сети контейнера Jenkins (используйте: docker network ls)
  • При запуске следующих сценариев контейнер Docker «в стадии тестирования» был добавлен в определенную сеть. Контейнер 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"

Это правильное решение. Я был рад, что упомянутый «обходной путь» теперь объявлен устаревшим.

0 голосов
/ 13 января 2019

Пожалуйста, не стесняйтесь дать лучший ответ, чем этот. По крайней мере, это хороший «обходной путь». Я перепробовал все комбинации, включая настройку сетей Docker и т. Д. Пожалуйста, дайте мне знать, если у вас есть лучшее решение.

Таким образом, при запуске Jenkins в контейнере Docker выглядело так, как будто Jmeter не может подключиться к другому (Docker) приложению Spring Boot на моем ПК.

Итак, я запустил приложение 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? В противном случае я получаю конфликт с другими (начатыми) средствами тестирования. И двигать банку? По той же причине. Любые улучшения приветствуются!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...