run_jmeter_tests.yaml 12 KB

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