run_jmeter_tests.yaml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. name: JMeter integration tests
  2. on:
  3. workflow_call:
  4. permissions:
  5. contents: read
  6. jobs:
  7. jmeter_artifact:
  8. runs-on: ${{ endsWith(github.repository, '/emqx') && 'ubuntu-22.04' || fromJSON('["self-hosted","ephemeral","linux","x64"]') }}
  9. steps:
  10. - name: Cache Jmeter
  11. id: cache-jmeter
  12. uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
  13. with:
  14. path: /tmp/apache-jmeter.tgz
  15. key: apache-jmeter-5.4.3.tgz
  16. - name: download jmeter
  17. if: steps.cache-jmeter.outputs.cache-hit != 'true'
  18. timeout-minutes: 15
  19. env:
  20. JMETER_VERSION: 5.4.3
  21. run: |
  22. # versions below 5.5 had been moved to the archive area
  23. # latest version is 5.6, the script below should handle both scenarios
  24. URL=https://downloads.apache.org/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
  25. ARCHIVE_URL=https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
  26. if wget -q --method HEAD $URL; then
  27. wget --no-verbose --no-check-certificate -O /tmp/apache-jmeter.tgz $URL
  28. else
  29. wget --no-verbose --no-check-certificate -O /tmp/apache-jmeter.tgz $ARCHIVE_URL
  30. fi
  31. - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
  32. with:
  33. name: apache-jmeter.tgz
  34. path: /tmp/apache-jmeter.tgz
  35. retention-days: 3
  36. advanced_feat:
  37. runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
  38. strategy:
  39. fail-fast: false
  40. matrix:
  41. scripts_type:
  42. - mqtt_subscription_topic_metrics
  43. - mqtt_delayed_publish
  44. - mqtt_topic_rewrite
  45. # - mqtt_retainer
  46. needs: jmeter_artifact
  47. steps:
  48. - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
  49. - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
  50. with:
  51. name: emqx-docker
  52. - name: load docker image
  53. shell: bash
  54. run: |
  55. EMQX_DOCKER_IMAGE_TAG=$(docker load < emqx-docker-*.tar.gz | sed 's/Loaded image: //g')
  56. echo "_EMQX_DOCKER_IMAGE_TAG=$EMQX_DOCKER_IMAGE_TAG" >> $GITHUB_ENV
  57. - uses: ./.github/actions/prepare-jmeter
  58. - name: docker compose up
  59. timeout-minutes: 5
  60. run: |
  61. docker compose \
  62. -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
  63. up --wait --build
  64. echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
  65. - name: show logs
  66. if: failure()
  67. run: |
  68. docker compose \
  69. -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
  70. logs
  71. - name: run jmeter
  72. run: |
  73. jmeter/bin/jmeter.sh \
  74. -Jjmeter.save.saveservice.output_format=xml -n \
  75. -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
  76. -Demqx_ip=$HAPROXY_IP \
  77. -l jmeter_logs/${{ matrix.scripts_type }}.jtl \
  78. -j jmeter_logs/logs/${{ matrix.scripts_type }}.log
  79. - name: check logs
  80. run: |
  81. if cat jmeter_logs/${{ matrix.scripts_type }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
  82. echo "check logs failed"
  83. exit 1
  84. fi
  85. - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
  86. if: always()
  87. with:
  88. name: jmeter_logs-advanced_feat-${{ matrix.scripts_type }}
  89. path: ./jmeter_logs
  90. retention-days: 3
  91. pgsql_authn_authz:
  92. runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
  93. strategy:
  94. fail-fast: false
  95. matrix:
  96. pgsql_tag:
  97. - 9
  98. - 10
  99. - 11
  100. - 12
  101. - 13
  102. scripts_type:
  103. - pgsql_authn
  104. - pgsql_authz
  105. needs: jmeter_artifact
  106. steps:
  107. - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
  108. - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
  109. with:
  110. name: emqx-docker
  111. - name: load docker image
  112. shell: bash
  113. run: |
  114. EMQX_DOCKER_IMAGE_TAG=$(docker load < emqx-docker-*.tar.gz | sed 's/Loaded image: //g')
  115. echo "_EMQX_DOCKER_IMAGE_TAG=$EMQX_DOCKER_IMAGE_TAG" >> $GITHUB_ENV
  116. - uses: ./.github/actions/prepare-jmeter
  117. - name: docker compose up
  118. timeout-minutes: 5
  119. env:
  120. PGSQL_TAG: ${{ matrix.pgsql_tag }}
  121. run: |
  122. docker compose \
  123. -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
  124. -f .ci/docker-compose-file/docker-compose-pgsql-tls.yaml \
  125. up --wait --build
  126. echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
  127. echo PGSQL_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' pgsql-tls) >> $GITHUB_ENV
  128. - name: run jmeter
  129. run: |
  130. jmeter/bin/jmeter.sh \
  131. -Jjmeter.save.saveservice.output_format=xml -n \
  132. -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
  133. -Demqx_ip=$HAPROXY_IP \
  134. -Ddb_ip=$PGSQL_IP \
  135. -Dport="5432" \
  136. -Dpgsql_user="root" \
  137. -Dpgsql_pwd="public" \
  138. -Ddbname="mqtt" \
  139. -Droute="apps/emqx_auth/test/data/certs" \
  140. -Dca_name="ca.crt" \
  141. -Dkey_name="client.key" \
  142. -Dcert_name="client.crt" \
  143. -l jmeter_logs/${{ matrix.scripts_type }}_${{ matrix.pgsql_tag }}.jtl \
  144. -j jmeter_logs/logs/${{ matrix.scripts_type }}_${{ matrix.pgsql_tag }}.log
  145. - name: check logs
  146. run: |
  147. if cat jmeter_logs/${{ matrix.scripts_type }}_${{ matrix.pgsql_tag }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
  148. echo "check logs failed"
  149. exit 1
  150. fi
  151. - name: dump docker compose logs
  152. if: failure()
  153. run: |
  154. docker compose -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml logs --no-color > ./jmeter_logs/emqx.log
  155. - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
  156. if: always()
  157. with:
  158. name: jmeter_logs-pgsql_authn_authz-${{ matrix.scripts_type }}_${{ matrix.pgsql_tag }}
  159. path: ./jmeter_logs
  160. retention-days: 3
  161. mysql_authn_authz:
  162. runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
  163. strategy:
  164. fail-fast: false
  165. matrix:
  166. mysql_tag:
  167. - 5.7
  168. - 8
  169. scripts_type:
  170. - mysql_authn
  171. - mysql_authz
  172. needs: jmeter_artifact
  173. steps:
  174. - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
  175. - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
  176. with:
  177. name: emqx-docker
  178. - name: load docker image
  179. shell: bash
  180. run: |
  181. EMQX_DOCKER_IMAGE_TAG=$(docker load < emqx-docker-*.tar.gz | sed 's/Loaded image: //g')
  182. echo "_EMQX_DOCKER_IMAGE_TAG=$EMQX_DOCKER_IMAGE_TAG" >> $GITHUB_ENV
  183. - uses: ./.github/actions/prepare-jmeter
  184. - name: docker compose up
  185. timeout-minutes: 5
  186. env:
  187. PGSQL_TAG: ${{ matrix.mysql_tag }}
  188. run: |
  189. docker compose \
  190. -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
  191. -f .ci/docker-compose-file/docker-compose-mysql-tls.yaml \
  192. up --wait --build
  193. echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
  194. echo MYSQL_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-tls) >> $GITHUB_ENV
  195. - name: run jmeter
  196. run: |
  197. jmeter/bin/jmeter.sh \
  198. -Jjmeter.save.saveservice.output_format=xml -n \
  199. -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
  200. -Demqx_ip=$HAPROXY_IP \
  201. -Dmysql_ip=$MYSQL_IP \
  202. -Dport="3306" \
  203. -Dmysql_user="root" \
  204. -Dmysql_pwd="public" \
  205. -Ddbname="mqtt" \
  206. -Droute="apps/emqx_auth/test/data/certs" \
  207. -Dca_name="ca.crt" \
  208. -Dkey_name="client.key" \
  209. -Dcert_name="client.crt" \
  210. -l jmeter_logs/${{ matrix.scripts_type }}_${{ matrix.mysql_tag }}.jtl \
  211. -j jmeter_logs/logs/${{ matrix.scripts_type }}_${{ matrix.mysql_tag }}.log
  212. - name: check logs
  213. run: |
  214. if cat jmeter_logs/${{ matrix.scripts_type }}_${{ matrix.mysql_tag }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
  215. echo "check logs failed"
  216. exit 1
  217. fi
  218. - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
  219. if: always()
  220. with:
  221. name: jmeter_logs-mysql_authn_authz-${{ matrix.scripts_type }}_${{ matrix.mysql_tag }}
  222. path: ./jmeter_logs
  223. retention-days: 3
  224. JWT_authn:
  225. runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
  226. strategy:
  227. fail-fast: false
  228. matrix:
  229. scripts_type:
  230. - jwt_authn
  231. needs: jmeter_artifact
  232. steps:
  233. - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
  234. - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
  235. with:
  236. name: emqx-docker
  237. - name: load docker image
  238. shell: bash
  239. run: |
  240. EMQX_DOCKER_IMAGE_TAG=$(docker load < emqx-docker-*.tar.gz | sed 's/Loaded image: //g')
  241. echo "_EMQX_DOCKER_IMAGE_TAG=$EMQX_DOCKER_IMAGE_TAG" >> $GITHUB_ENV
  242. - uses: ./.github/actions/prepare-jmeter
  243. - name: docker compose up
  244. timeout-minutes: 5
  245. run: |
  246. docker compose \
  247. -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
  248. up --wait --build
  249. echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
  250. - name: run jwks_server
  251. timeout-minutes: 10
  252. run: |
  253. cd scripts/jwks-server
  254. mvn package
  255. cd target
  256. docker run --name jwks_server --network emqx_bridge --ip 172.100.239.88 -d -v $(pwd)/jwkserver-0.0.1.jar:/jwks_server/jwkserver-0.0.1.jar --workdir /jwks_server public.ecr.aws/amazoncorretto/amazoncorretto:8 bash \
  257. -c "java -jar jwkserver-0.0.1.jar"
  258. - name: run jmeter
  259. run: |
  260. jmeter/bin/jmeter.sh \
  261. -Jjmeter.save.saveservice.output_format=xml -n \
  262. -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
  263. -Demqx_ip=$HAPROXY_IP \
  264. -Djwks_ip="172.100.239.88" \
  265. -l jmeter_logs/${{ matrix.scripts_type }}.jtl \
  266. -j jmeter_logs/logs/${{ matrix.scripts_type }}.log
  267. - name: check logs
  268. run: |
  269. if cat jmeter_logs/${{ matrix.scripts_type }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
  270. echo "check logs failed"
  271. exit 1
  272. fi
  273. - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
  274. if: always()
  275. with:
  276. name: jmeter_logs-JWT_authn-${{ matrix.scripts_type }}
  277. path: ./jmeter_logs
  278. retention-days: 3
  279. built_in_database_authn_authz:
  280. runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
  281. strategy:
  282. fail-fast: false
  283. matrix:
  284. scripts_type:
  285. - built_in_database_authn
  286. - built_in_database_authz
  287. needs: jmeter_artifact
  288. steps:
  289. - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
  290. - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
  291. with:
  292. name: emqx-docker
  293. - name: load docker image
  294. shell: bash
  295. run: |
  296. EMQX_DOCKER_IMAGE_TAG=$(docker load < emqx-docker-*.tar.gz | sed 's/Loaded image: //g')
  297. echo "_EMQX_DOCKER_IMAGE_TAG=$EMQX_DOCKER_IMAGE_TAG" >> $GITHUB_ENV
  298. - uses: ./.github/actions/prepare-jmeter
  299. - name: docker compose up
  300. timeout-minutes: 5
  301. run: |
  302. docker compose \
  303. -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
  304. up --wait --build
  305. echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
  306. - name: run jmeter
  307. run: |
  308. jmeter/bin/jmeter.sh \
  309. -Jjmeter.save.saveservice.output_format=xml -n \
  310. -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
  311. -Demqx_ip=$HAPROXY_IP \
  312. -l jmeter_logs/${{ matrix.scripts_type }}.jtl \
  313. -j jmeter_logs/logs/${{ matrix.scripts_type }}.log
  314. - name: check logs
  315. run: |
  316. if cat jmeter_logs/${{ matrix.scripts_type }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
  317. echo "check logs failed"
  318. exit 1
  319. fi
  320. - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
  321. if: always()
  322. with:
  323. name: jmeter_logs-built_in_database_authn_authz-${{ matrix.scripts_type }}
  324. path: ./jmeter_logs
  325. retention-days: 3