run_jmeter_tests.yaml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  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@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
  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@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
  49. - name: Set up environment
  50. id: env
  51. run: |
  52. source env.sh
  53. PKG_VSN=$(docker run --rm -v $(pwd):$(pwd) -w $(pwd) -u $(id -u) "$EMQX_BUILDER" ./pkg-vsn.sh emqx)
  54. echo "PKG_VSN=$PKG_VSN" >> "$GITHUB_ENV"
  55. - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
  56. with:
  57. name: emqx-docker
  58. path: /tmp
  59. - name: load docker image
  60. shell: bash
  61. run: |
  62. EMQX_DOCKER_IMAGE_TAG=$(docker load < /tmp/emqx-docker-${PKG_VSN}.tar.gz | sed 's/Loaded image: //g')
  63. echo "_EMQX_DOCKER_IMAGE_TAG=$EMQX_DOCKER_IMAGE_TAG" >> $GITHUB_ENV
  64. - uses: ./.github/actions/prepare-jmeter
  65. - name: docker compose up
  66. timeout-minutes: 5
  67. run: |
  68. docker compose \
  69. -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
  70. up --wait --build
  71. echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
  72. - name: show logs
  73. if: failure()
  74. run: |
  75. docker compose \
  76. -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
  77. logs
  78. - name: run jmeter
  79. run: |
  80. jmeter/bin/jmeter.sh \
  81. -Jjmeter.save.saveservice.output_format=xml -n \
  82. -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
  83. -Demqx_ip=$HAPROXY_IP \
  84. -l jmeter_logs/${{ matrix.scripts_type }}.jtl \
  85. -j jmeter_logs/logs/${{ matrix.scripts_type }}.log
  86. - name: check logs
  87. run: |
  88. if cat jmeter_logs/${{ matrix.scripts_type }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
  89. echo "check logs failed"
  90. exit 1
  91. fi
  92. - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
  93. if: always()
  94. with:
  95. name: jmeter_logs-advanced_feat-${{ matrix.scripts_type }}
  96. path: ./jmeter_logs
  97. retention-days: 3
  98. pgsql_authn_authz:
  99. runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
  100. strategy:
  101. fail-fast: false
  102. matrix:
  103. pgsql_tag:
  104. - 9
  105. - 10
  106. - 11
  107. - 12
  108. - 13
  109. scripts_type:
  110. - pgsql_authn
  111. - pgsql_authz
  112. needs: jmeter_artifact
  113. steps:
  114. - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
  115. - name: Set up environment
  116. id: env
  117. run: |
  118. source env.sh
  119. PKG_VSN=$(docker run --rm -v $(pwd):$(pwd) -w $(pwd) -u $(id -u) "$EMQX_BUILDER" ./pkg-vsn.sh emqx)
  120. echo "PKG_VSN=$PKG_VSN" >> "$GITHUB_ENV"
  121. - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
  122. with:
  123. name: emqx-docker
  124. path: /tmp
  125. - name: load docker image
  126. shell: bash
  127. run: |
  128. EMQX_DOCKER_IMAGE_TAG=$(docker load < /tmp/emqx-docker-${PKG_VSN}.tar.gz | sed 's/Loaded image: //g')
  129. echo "_EMQX_DOCKER_IMAGE_TAG=$EMQX_DOCKER_IMAGE_TAG" >> $GITHUB_ENV
  130. - uses: ./.github/actions/prepare-jmeter
  131. - name: docker compose up
  132. timeout-minutes: 5
  133. env:
  134. PGSQL_TAG: ${{ matrix.pgsql_tag }}
  135. run: |
  136. docker compose \
  137. -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
  138. -f .ci/docker-compose-file/docker-compose-pgsql-tls.yaml \
  139. up --wait --build
  140. echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
  141. echo PGSQL_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' pgsql-tls) >> $GITHUB_ENV
  142. - name: run jmeter
  143. run: |
  144. jmeter/bin/jmeter.sh \
  145. -Jjmeter.save.saveservice.output_format=xml -n \
  146. -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
  147. -Demqx_ip=$HAPROXY_IP \
  148. -Ddb_ip=$PGSQL_IP \
  149. -Dport="5432" \
  150. -Dpgsql_user="root" \
  151. -Dpgsql_pwd="public" \
  152. -Ddbname="mqtt" \
  153. -Droute="apps/emqx_auth/test/data/certs" \
  154. -Dca_name="ca.crt" \
  155. -Dkey_name="client.key" \
  156. -Dcert_name="client.crt" \
  157. -l jmeter_logs/${{ matrix.scripts_type }}_${{ matrix.pgsql_tag }}.jtl \
  158. -j jmeter_logs/logs/${{ matrix.scripts_type }}_${{ matrix.pgsql_tag }}.log
  159. - name: check logs
  160. run: |
  161. if cat jmeter_logs/${{ matrix.scripts_type }}_${{ matrix.pgsql_tag }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
  162. echo "check logs failed"
  163. exit 1
  164. fi
  165. - name: dump docker compose logs
  166. if: failure()
  167. run: |
  168. docker compose -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml logs --no-color > ./jmeter_logs/emqx.log
  169. - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
  170. if: always()
  171. with:
  172. name: jmeter_logs-pgsql_authn_authz-${{ matrix.scripts_type }}_${{ matrix.pgsql_tag }}
  173. path: ./jmeter_logs
  174. retention-days: 3
  175. mysql_authn_authz:
  176. runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
  177. strategy:
  178. fail-fast: false
  179. matrix:
  180. mysql_tag:
  181. - 5.7
  182. - 8
  183. scripts_type:
  184. - mysql_authn
  185. - mysql_authz
  186. needs: jmeter_artifact
  187. steps:
  188. - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
  189. - name: Set up environment
  190. id: env
  191. run: |
  192. source env.sh
  193. PKG_VSN=$(docker run --rm -v $(pwd):$(pwd) -w $(pwd) -u $(id -u) "$EMQX_BUILDER" ./pkg-vsn.sh emqx)
  194. echo "PKG_VSN=$PKG_VSN" >> "$GITHUB_ENV"
  195. - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
  196. with:
  197. name: emqx-docker
  198. path: /tmp
  199. - name: load docker image
  200. shell: bash
  201. run: |
  202. EMQX_DOCKER_IMAGE_TAG=$(docker load < /tmp/emqx-docker-${PKG_VSN}.tar.gz | sed 's/Loaded image: //g')
  203. echo "_EMQX_DOCKER_IMAGE_TAG=$EMQX_DOCKER_IMAGE_TAG" >> $GITHUB_ENV
  204. - uses: ./.github/actions/prepare-jmeter
  205. - name: docker compose up
  206. timeout-minutes: 5
  207. env:
  208. PGSQL_TAG: ${{ matrix.mysql_tag }}
  209. run: |
  210. docker compose \
  211. -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
  212. -f .ci/docker-compose-file/docker-compose-mysql-tls.yaml \
  213. up --wait --build
  214. echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
  215. echo MYSQL_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-tls) >> $GITHUB_ENV
  216. - name: run jmeter
  217. run: |
  218. jmeter/bin/jmeter.sh \
  219. -Jjmeter.save.saveservice.output_format=xml -n \
  220. -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
  221. -Demqx_ip=$HAPROXY_IP \
  222. -Dmysql_ip=$MYSQL_IP \
  223. -Dport="3306" \
  224. -Dmysql_user="root" \
  225. -Dmysql_pwd="public" \
  226. -Ddbname="mqtt" \
  227. -Droute="apps/emqx_auth/test/data/certs" \
  228. -Dca_name="ca.crt" \
  229. -Dkey_name="client.key" \
  230. -Dcert_name="client.crt" \
  231. -l jmeter_logs/${{ matrix.scripts_type }}_${{ matrix.mysql_tag }}.jtl \
  232. -j jmeter_logs/logs/${{ matrix.scripts_type }}_${{ matrix.mysql_tag }}.log
  233. - name: check logs
  234. run: |
  235. if cat jmeter_logs/${{ matrix.scripts_type }}_${{ matrix.mysql_tag }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
  236. echo "check logs failed"
  237. exit 1
  238. fi
  239. - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
  240. if: always()
  241. with:
  242. name: jmeter_logs-mysql_authn_authz-${{ matrix.scripts_type }}_${{ matrix.mysql_tag }}
  243. path: ./jmeter_logs
  244. retention-days: 3
  245. JWT_authn:
  246. runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
  247. strategy:
  248. fail-fast: false
  249. matrix:
  250. scripts_type:
  251. - jwt_authn
  252. needs: jmeter_artifact
  253. steps:
  254. - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
  255. - name: Set up environment
  256. id: env
  257. run: |
  258. source env.sh
  259. PKG_VSN=$(docker run --rm -v $(pwd):$(pwd) -w $(pwd) -u $(id -u) "$EMQX_BUILDER" ./pkg-vsn.sh emqx)
  260. echo "PKG_VSN=$PKG_VSN" >> "$GITHUB_ENV"
  261. - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
  262. with:
  263. name: emqx-docker
  264. path: /tmp
  265. - name: load docker image
  266. shell: bash
  267. run: |
  268. EMQX_DOCKER_IMAGE_TAG=$(docker load < /tmp/emqx-docker-${PKG_VSN}.tar.gz | sed 's/Loaded image: //g')
  269. echo "_EMQX_DOCKER_IMAGE_TAG=$EMQX_DOCKER_IMAGE_TAG" >> $GITHUB_ENV
  270. - uses: ./.github/actions/prepare-jmeter
  271. - name: docker compose up
  272. timeout-minutes: 5
  273. run: |
  274. docker compose \
  275. -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
  276. up --wait --build
  277. echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
  278. - name: run jwks_server
  279. timeout-minutes: 10
  280. run: |
  281. cd scripts/jwks-server
  282. mvn package
  283. cd target
  284. 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 \
  285. -c "java -jar jwkserver-0.0.1.jar"
  286. - name: run jmeter
  287. run: |
  288. jmeter/bin/jmeter.sh \
  289. -Jjmeter.save.saveservice.output_format=xml -n \
  290. -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
  291. -Demqx_ip=$HAPROXY_IP \
  292. -Djwks_ip="172.100.239.88" \
  293. -l jmeter_logs/${{ matrix.scripts_type }}.jtl \
  294. -j jmeter_logs/logs/${{ matrix.scripts_type }}.log
  295. - name: check logs
  296. run: |
  297. if cat jmeter_logs/${{ matrix.scripts_type }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
  298. echo "check logs failed"
  299. exit 1
  300. fi
  301. - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
  302. if: always()
  303. with:
  304. name: jmeter_logs-JWT_authn-${{ matrix.scripts_type }}
  305. path: ./jmeter_logs
  306. retention-days: 3
  307. built_in_database_authn_authz:
  308. runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
  309. strategy:
  310. fail-fast: false
  311. matrix:
  312. scripts_type:
  313. - built_in_database_authn
  314. - built_in_database_authz
  315. needs: jmeter_artifact
  316. steps:
  317. - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
  318. - name: Set up environment
  319. id: env
  320. run: |
  321. source env.sh
  322. PKG_VSN=$(docker run --rm -v $(pwd):$(pwd) -w $(pwd) -u $(id -u) "$EMQX_BUILDER" ./pkg-vsn.sh emqx)
  323. echo "PKG_VSN=$PKG_VSN" >> "$GITHUB_ENV"
  324. - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
  325. with:
  326. name: emqx-docker
  327. path: /tmp
  328. - name: load docker image
  329. shell: bash
  330. run: |
  331. EMQX_DOCKER_IMAGE_TAG=$(docker load < /tmp/emqx-docker-${PKG_VSN}.tar.gz | sed 's/Loaded image: //g')
  332. echo "_EMQX_DOCKER_IMAGE_TAG=$EMQX_DOCKER_IMAGE_TAG" >> $GITHUB_ENV
  333. - uses: ./.github/actions/prepare-jmeter
  334. - name: docker compose up
  335. timeout-minutes: 5
  336. run: |
  337. docker compose \
  338. -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
  339. up --wait --build
  340. echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
  341. - name: run jmeter
  342. run: |
  343. jmeter/bin/jmeter.sh \
  344. -Jjmeter.save.saveservice.output_format=xml -n \
  345. -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
  346. -Demqx_ip=$HAPROXY_IP \
  347. -l jmeter_logs/${{ matrix.scripts_type }}.jtl \
  348. -j jmeter_logs/logs/${{ matrix.scripts_type }}.log
  349. - name: check logs
  350. run: |
  351. if cat jmeter_logs/${{ matrix.scripts_type }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
  352. echo "check logs failed"
  353. exit 1
  354. fi
  355. - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
  356. if: always()
  357. with:
  358. name: jmeter_logs-built_in_database_authn_authz-${{ matrix.scripts_type }}
  359. path: ./jmeter_logs
  360. retention-days: 3