run_jmeter_tests.yaml 10 KB

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