| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- name: Functional Verification Tests
- concurrency:
- group: fvt-${{ github.event_name }}-${{ github.ref }}
- cancel-in-progress: true
- on:
- push:
- branches:
- - '**'
- tags:
- - v*
- pull_request:
- jobs:
- prepare:
- runs-on: ubuntu-20.04
- # prepare source with any OTP version, no need for a matrix
- container: ghcr.io/emqx/emqx-builder/5.0-26:1.13.4-24.3.4.2-1-alpine3.15.1
- steps:
- - uses: actions/checkout@v3
- with:
- path: source
- fetch-depth: 0
- - name: get deps
- run: |
- make -C source deps-all
- zip -ryq source.zip source/* source/.[^.]*
- - uses: actions/upload-artifact@v3
- with:
- name: source
- path: source.zip
- docker_test:
- runs-on: ubuntu-20.04
- needs: prepare
- strategy:
- fail-fast: false
- matrix:
- profile:
- - emqx
- - emqx-enterprise
- - emqx-elixir
- cluster_db_backend:
- - mnesia
- - rlog
- os:
- - ["alpine3.15.1", "alpine:3.15.1"]
- builder:
- - 5.0-26
- otp:
- - 24.3.4.2-1
- elixir:
- - 1.13.4
- arch:
- - amd64
- steps:
- - uses: emqx/setup-beam@v1.16.1-emqx
- with:
- otp-version: 24.3.4.6
- - uses: actions/download-artifact@v3
- with:
- name: source
- path: .
- - name: unzip source code
- run: unzip -q source.zip
- - name: make docker image
- working-directory: source
- env:
- EMQX_BUILDER: ghcr.io/emqx/emqx-builder/${{ matrix.builder }}:${{ matrix.elixir }}-${{ matrix.otp }}-${{ matrix.os[0] }}
- EMQX_RUNNER: ${{ matrix.os[1] }}
- run: |
- make ${{ matrix.profile }}-docker
- - name: run emqx
- timeout-minutes: 5
- working-directory: source
- run: |
- set -x
- if [[ "${{ matrix.profile }}" = *-elixir ]]
- then
- export IS_ELIXIR=yes
- PROFILE=$(echo ${{ matrix.profile }} | sed -e "s/-elixir//g")
- IMAGE=emqx/$PROFILE:$(./pkg-vsn.sh ${{ matrix.profile }})-elixir
- else
- IMAGE=emqx/${{ matrix.profile }}:$(./pkg-vsn.sh ${{ matrix.profile }})
- fi
- ./.ci/docker-compose-file/scripts/run-emqx.sh $IMAGE ${{ matrix.cluster_db_backend }}
- - name: make paho tests
- run: |
- if ! docker exec -i python /scripts/pytest.sh "${{ matrix.cluster_db_backend }}"; then
- echo "DUMP_CONTAINER_LOGS_BGN"
- echo "============== haproxy =============="
- docker logs haproxy
- echo "============== node1 =============="
- docker logs node1.emqx.io
- echo "============== node2 =============="
- docker logs node2.emqx.io
- echo "DUMP_CONTAINER_LOGS_END"
- exit 1
- fi
- # simple smoke test for node_dump
- - name: test node_dump
- run: |
- docker exec node1.emqx.io node_dump
- helm_test:
- runs-on: ubuntu-20.04
- needs: prepare
- strategy:
- fail-fast: false
- matrix:
- discovery:
- - k8s
- - dns
- profile:
- - emqx
- - emqx-enterprise
- os:
- - ["debian11", "debian:11-slim"]
- builder:
- - 5.0-26
- otp:
- - 24.3.4.2-1
- elixir:
- - 1.13.4
- arch:
- - amd64
- # - emqx-enterprise # TODO test enterprise
- steps:
- - uses: emqx/setup-beam@v1.16.1-emqx
- with:
- otp-version: 24.3.4.6
- - uses: actions/download-artifact@v3
- with:
- name: source
- path: .
- - name: unzip source code
- run: unzip -q source.zip
- - name: make docker image
- working-directory: source
- env:
- EMQX_BUILDER: ghcr.io/emqx/emqx-builder/${{ matrix.builder }}:${{ matrix.elixir }}-${{ matrix.otp }}-${{ matrix.os[0] }}
- EMQX_RUNNER: ${{ matrix.os[1] }}
- run: |
- make ${{ matrix.profile }}-docker
- echo "TARGET=emqx/${{ matrix.profile }}" >> $GITHUB_ENV
- echo "EMQX_TAG=$(./pkg-vsn.sh ${{ matrix.profile }})" >> $GITHUB_ENV
- - run: minikube start
- - run: minikube image load $TARGET:$EMQX_TAG
- - name: run emqx on chart
- working-directory: source
- if: matrix.discovery == 'k8s'
- run: |
- helm install ${{ matrix.profile }} \
- --set emqxConfig.EMQX_CLUSTER__DISCOVERY_STRATEGY="k8s" \
- --set emqxConfig.EMQX_CLUSTER__K8S__APISERVER="https://kubernetes.default.svc:443" \
- --set emqxConfig.EMQX_CLUSTER__K8S__SERVICE_NAME="${{ matrix.profile }}-headless" \
- --set emqxConfig.EMQX_CLUSTER__K8S__NAMESPACE="default" \
- --set image.repository=$TARGET \
- --set image.pullPolicy=Never \
- --set image.tag=$EMQX_TAG \
- --set emqxAclConfig="" \
- --set emqxConfig.EMQX_ZONES__DEFAULT__MQTT__RETRY_INTERVAL=2s \
- --set emqxConfig.EMQX_ZONES__DEFAULT__MQTT__MAX_TOPIC_ALIAS=10 \
- --set emqxConfig.EMQX_AUTHORIZATION__SOURCES=[] \
- --set emqxConfig.EMQX_AUTHORIZATION__NO_MATCH=allow \
- deploy/charts/${{ matrix.profile }} \
- --debug
- - name: run emqx on chart
- working-directory: source
- if: matrix.discovery == 'dns'
- run: |
- helm install ${{ matrix.profile }} \
- --set emqxConfig.EMQX_CLUSTER__DISCOVERY_STRATEGY="dns" \
- --set emqxConfig.EMQX_CLUSTER__DNS__RECORD_TYPE="srv" \
- --set emqxConfig.EMQX_CLUSTER__DNS__NAME="${{ matrix.profile }}-headless.default.svc.cluster.local" \
- --set image.repository=$TARGET \
- --set image.pullPolicy=Never \
- --set image.tag=$EMQX_TAG \
- --set emqxAclConfig="" \
- --set emqxConfig.EMQX_ZONES__DEFAULT__MQTT__RETRY_INTERVAL=2s \
- --set emqxConfig.EMQX_ZONES__DEFAULT__MQTT__MAX_TOPIC_ALIAS=10 \
- --set emqxConfig.EMQX_AUTHORIZATION__SOURCES=[] \
- --set emqxConfig.EMQX_AUTHORIZATION__NO_MATCH=allow \
- deploy/charts/${{ matrix.profile }} \
- --debug
- - name: waiting emqx started
- timeout-minutes: 10
- run: |
- while [ "$(kubectl get StatefulSet -l app.kubernetes.io/instance=${{ matrix.profile }} -o jsonpath='{.items[0].status.replicas}')" \
- != "$(kubectl get StatefulSet -l app.kubernetes.io/instance=${{ matrix.profile }} -o jsonpath='{.items[0].status.readyReplicas}')" ]; do
- echo "==============================";
- kubectl get pods;
- echo "==============================";
- echo "waiting emqx started";
- sleep 10;
- done
- - name: Check cluster
- timeout-minutes: 10
- run: |
- kubectl port-forward service/${{ matrix.profile }} 18083:18083 > /dev/null &
- while
- [ "$(curl --silent --basic -u admin:public -X GET http://127.0.0.1:18083/api/v5/cluster| jq '.nodes|length')" != "3" ];
- do
- echo "waiting ${{ matrix.profile }} cluster scale"
- sleep 1
- done
- - uses: actions/checkout@v3
- with:
- repository: emqx/paho.mqtt.testing
- ref: develop-4.0
- path: paho.mqtt.testing
- - name: install pytest
- run: |
- pip install pytest
- echo "$HOME/.local/bin" >> $GITHUB_PATH
- - name: run paho test
- timeout-minutes: 10
- run: |
- port_connected () {
- local server="$1"
- local port="$2"
- echo > /dev/tcp/${server}/${port} 2>/dev/null
- }
- kubectl port-forward service/${{ matrix.profile }} 1883:1883 > /dev/null &
- while ! port_connected localhost 1883; do
- echo server not listening yet...
- sleep 10
- done
- pytest -v paho.mqtt.testing/interoperability/test_client/V5/test_connect.py -k test_basic --host "127.0.0.1"
- - if: failure()
- run: kubectl logs -l "app.kubernetes.io/instance=${{ matrix.profile }}" -c emqx --tail=1000
|