| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- name: JMeter integration tests
- on:
- workflow_call:
- inputs:
- version-emqx:
- required: true
- type: string
- permissions:
- contents: read
- jobs:
- jmeter_artifact:
- runs-on: ${{ endsWith(github.repository, '/emqx') && 'ubuntu-22.04' || fromJSON('["self-hosted","ephemeral","linux","x64"]') }}
- steps:
- - name: Cache Jmeter
- id: cache-jmeter
- uses: actions/cache@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4.0.0
- with:
- path: /tmp/apache-jmeter.tgz
- key: apache-jmeter-5.4.3.tgz
- - name: download jmeter
- if: steps.cache-jmeter.outputs.cache-hit != 'true'
- timeout-minutes: 15
- env:
- JMETER_VERSION: 5.4.3
- run: |
- # versions below 5.5 had been moved to the archive area
- # latest version is 5.6, the script below should handle both scenarios
- URL=https://downloads.apache.org/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
- ARCHIVE_URL=https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
- if wget -q --method HEAD $URL; then
- wget --no-verbose --no-check-certificate -O /tmp/apache-jmeter.tgz $URL
- else
- wget --no-verbose --no-check-certificate -O /tmp/apache-jmeter.tgz $ARCHIVE_URL
- fi
- - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
- with:
- name: apache-jmeter.tgz
- path: /tmp/apache-jmeter.tgz
- retention-days: 3
- advanced_feat:
- runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
- strategy:
- fail-fast: false
- matrix:
- scripts_type:
- - mqtt_subscription_topic_metrics
- - mqtt_delayed_publish
- - mqtt_topic_rewrite
- # - mqtt_retainer
- needs: jmeter_artifact
- steps:
- - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- - uses: ./.github/actions/prepare-jmeter
- with:
- version-emqx: ${{ inputs.version-emqx }}
- - name: docker compose up
- timeout-minutes: 5
- run: |
- docker compose \
- -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
- up --wait --build
- echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
- - name: show logs
- if: failure()
- run: |
- docker compose \
- -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
- logs
- - name: run jmeter
- run: |
- jmeter/bin/jmeter.sh \
- -Jjmeter.save.saveservice.output_format=xml -n \
- -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
- -Demqx_ip=$HAPROXY_IP \
- -l jmeter_logs/${{ matrix.scripts_type }}.jtl \
- -j jmeter_logs/logs/${{ matrix.scripts_type }}.log
- - name: check logs
- run: |
- if cat jmeter_logs/${{ matrix.scripts_type }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
- echo "check logs failed"
- exit 1
- fi
- - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
- if: always()
- with:
- name: jmeter_logs-advanced_feat-${{ matrix.scripts_type }}
- path: ./jmeter_logs
- retention-days: 3
- pgsql_authn_authz:
- runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
- strategy:
- fail-fast: false
- matrix:
- pgsql_tag:
- - 9
- - 10
- - 11
- - 12
- - 13
- scripts_type:
- - pgsql_authn
- - pgsql_authz
- needs: jmeter_artifact
- steps:
- - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- - uses: ./.github/actions/prepare-jmeter
- with:
- version-emqx: ${{ inputs.version-emqx }}
- - name: docker compose up
- timeout-minutes: 5
- env:
- PGSQL_TAG: ${{ matrix.pgsql_tag }}
- run: |
- docker compose \
- -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
- -f .ci/docker-compose-file/docker-compose-pgsql-tls.yaml \
- up --wait --build
- echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
- echo PGSQL_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' pgsql-tls) >> $GITHUB_ENV
- - name: run jmeter
- run: |
- jmeter/bin/jmeter.sh \
- -Jjmeter.save.saveservice.output_format=xml -n \
- -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
- -Demqx_ip=$HAPROXY_IP \
- -Ddb_ip=$PGSQL_IP \
- -Dport="5432" \
- -Dpgsql_user="root" \
- -Dpgsql_pwd="public" \
- -Ddbname="mqtt" \
- -Droute="apps/emqx_auth/test/data/certs" \
- -Dca_name="ca.crt" \
- -Dkey_name="client.key" \
- -Dcert_name="client.crt" \
- -l jmeter_logs/${{ matrix.scripts_type }}_${{ matrix.pgsql_tag }}.jtl \
- -j jmeter_logs/logs/${{ matrix.scripts_type }}_${{ matrix.pgsql_tag }}.log
- - name: check logs
- run: |
- if cat jmeter_logs/${{ matrix.scripts_type }}_${{ matrix.pgsql_tag }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
- echo "check logs failed"
- exit 1
- fi
- - name: dump docker compose logs
- if: failure()
- run: |
- docker compose -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml logs --no-color > ./jmeter_logs/emqx.log
- - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
- if: always()
- with:
- name: jmeter_logs-pgsql_authn_authz-${{ matrix.scripts_type }}_${{ matrix.pgsql_tag }}
- path: ./jmeter_logs
- retention-days: 3
- mysql_authn_authz:
- runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
- strategy:
- fail-fast: false
- matrix:
- mysql_tag:
- - 5.7
- - 8
- scripts_type:
- - mysql_authn
- - mysql_authz
- needs: jmeter_artifact
- steps:
- - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- - uses: ./.github/actions/prepare-jmeter
- with:
- version-emqx: ${{ inputs.version-emqx }}
- - name: docker compose up
- timeout-minutes: 5
- env:
- PGSQL_TAG: ${{ matrix.mysql_tag }}
- run: |
- docker compose \
- -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
- -f .ci/docker-compose-file/docker-compose-mysql-tls.yaml \
- up --wait --build
- echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
- echo MYSQL_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-tls) >> $GITHUB_ENV
- - name: run jmeter
- run: |
- jmeter/bin/jmeter.sh \
- -Jjmeter.save.saveservice.output_format=xml -n \
- -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
- -Demqx_ip=$HAPROXY_IP \
- -Dmysql_ip=$MYSQL_IP \
- -Dport="3306" \
- -Dmysql_user="root" \
- -Dmysql_pwd="public" \
- -Ddbname="mqtt" \
- -Droute="apps/emqx_auth/test/data/certs" \
- -Dca_name="ca.crt" \
- -Dkey_name="client.key" \
- -Dcert_name="client.crt" \
- -l jmeter_logs/${{ matrix.scripts_type }}_${{ matrix.mysql_tag }}.jtl \
- -j jmeter_logs/logs/${{ matrix.scripts_type }}_${{ matrix.mysql_tag }}.log
- - name: check logs
- run: |
- if cat jmeter_logs/${{ matrix.scripts_type }}_${{ matrix.mysql_tag }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
- echo "check logs failed"
- exit 1
- fi
- - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
- if: always()
- with:
- name: jmeter_logs-mysql_authn_authz-${{ matrix.scripts_type }}_${{ matrix.mysql_tag }}
- path: ./jmeter_logs
- retention-days: 3
- JWT_authn:
- runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
- strategy:
- fail-fast: false
- matrix:
- scripts_type:
- - jwt_authn
- needs: jmeter_artifact
- steps:
- - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- - uses: ./.github/actions/prepare-jmeter
- with:
- version-emqx: ${{ inputs.version-emqx }}
- - name: docker compose up
- timeout-minutes: 5
- run: |
- docker compose \
- -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
- up --wait --build
- echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
- - name: run jwks_server
- timeout-minutes: 10
- run: |
- cd scripts/jwks-server
- mvn package
- cd target
- 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 \
- -c "java -jar jwkserver-0.0.1.jar"
- - name: run jmeter
- run: |
- jmeter/bin/jmeter.sh \
- -Jjmeter.save.saveservice.output_format=xml -n \
- -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
- -Demqx_ip=$HAPROXY_IP \
- -Djwks_ip="172.100.239.88" \
- -l jmeter_logs/${{ matrix.scripts_type }}.jtl \
- -j jmeter_logs/logs/${{ matrix.scripts_type }}.log
- - name: check logs
- run: |
- if cat jmeter_logs/${{ matrix.scripts_type }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
- echo "check logs failed"
- exit 1
- fi
- - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
- if: always()
- with:
- name: jmeter_logs-JWT_authn-${{ matrix.scripts_type }}
- path: ./jmeter_logs
- retention-days: 3
- built_in_database_authn_authz:
- runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
- strategy:
- fail-fast: false
- matrix:
- scripts_type:
- - built_in_database_authn
- - built_in_database_authz
- needs: jmeter_artifact
- steps:
- - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- - uses: ./.github/actions/prepare-jmeter
- with:
- version-emqx: ${{ inputs.version-emqx }}
- - name: docker compose up
- timeout-minutes: 5
- run: |
- docker compose \
- -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
- up --wait --build
- echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
- - name: run jmeter
- run: |
- jmeter/bin/jmeter.sh \
- -Jjmeter.save.saveservice.output_format=xml -n \
- -t scripts/broker-autotest-suite/${{ matrix.scripts_type }}.jmx \
- -Demqx_ip=$HAPROXY_IP \
- -l jmeter_logs/${{ matrix.scripts_type }}.jtl \
- -j jmeter_logs/logs/${{ matrix.scripts_type }}.log
- - name: check logs
- run: |
- if cat jmeter_logs/${{ matrix.scripts_type }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
- echo "check logs failed"
- exit 1
- fi
- - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
- if: always()
- with:
- name: jmeter_logs-built_in_database_authn_authz-${{ matrix.scripts_type }}
- path: ./jmeter_logs
- retention-days: 3
|