run_jmeter_tests.yaml 10 KB

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