run_helm_tests.yaml 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. name: Helm tests
  2. concurrency:
  3. group: helm-${{ github.event_name }}-${{ github.ref }}
  4. cancel-in-progress: true
  5. on:
  6. workflow_call:
  7. permissions:
  8. contents: read
  9. jobs:
  10. helm_test:
  11. runs-on: ${{ github.repository_owner == 'emqx' && fromJSON('["self-hosted","ephemeral","linux","x64"]') || 'ubuntu-22.04' }}
  12. defaults:
  13. run:
  14. shell: bash
  15. env:
  16. EMQX_NAME: ${{ matrix.profile }}
  17. REPOSITORY: "emqx/${{ matrix.profile }}"
  18. strategy:
  19. fail-fast: false
  20. matrix:
  21. discovery:
  22. - k8s
  23. - dns
  24. profile:
  25. - emqx
  26. - emqx-enterprise
  27. rpc:
  28. - tcp
  29. - ssl1.3
  30. - ssl1.2
  31. steps:
  32. - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
  33. with:
  34. path: source
  35. - name: Set up environment
  36. id: env
  37. run: |
  38. cd source
  39. source env.sh
  40. PKG_VSN=$(docker run --rm -v $(pwd):$(pwd) -w $(pwd) -u $(id -u) "$EMQX_BUILDER" ./pkg-vsn.sh "$EMQX_NAME")
  41. echo "EMQX_TAG=$PKG_VSN" >> "$GITHUB_ENV"
  42. - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
  43. with:
  44. name: "${{ env.EMQX_NAME }}-docker"
  45. path: /tmp
  46. - run: minikube start
  47. - run: |
  48. img="/tmp/${EMQX_NAME}-docker-${EMQX_TAG}.tar.gz"
  49. if stderr=$(minikube image load "${img}" 2>&1 >/dev/null) && test -n "$stderr"; then
  50. echo "${stderr}";
  51. exit 1;
  52. fi
  53. - name: Prepare emqxConfig.EMQX_RPC using TCP
  54. working-directory: source
  55. if: matrix.rpc == 'tcp'
  56. run: |
  57. cat > rpc-overrides.yaml <<EOL
  58. emqxConfig:
  59. EMQX_RPC__PROTOCOL: tcp
  60. EOL
  61. - name: Prepare emqxConfig.EMQX_RPC using ssl1.3
  62. working-directory: source
  63. if: matrix.rpc == 'ssl1.3'
  64. run: |
  65. cat > rpc-overrides.yaml <<EOL
  66. emqxConfig:
  67. EMQX_RPC__PROTOCOL: ssl
  68. EMQX_RPC__CERTFILE: /opt/emqx/etc/certs/cert.pem
  69. EMQX_RPC__KEYFILE: /opt/emqx/etc/certs/key.pem
  70. EMQX_RPC__CACERTFILE: /opt/emqx/etc/certs/cacert.pem
  71. EMQX_RPC__CIPHERS: TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256
  72. EMQX_RPC__TLS_VERSIONS: "[tlsv1.3]"
  73. EOL
  74. - name: Prepare emqxConfig.EMQX_RPC using ssl1.2
  75. working-directory: source
  76. if: matrix.rpc == 'ssl1.2'
  77. run: |
  78. cat > rpc-overrides.yaml <<EOL
  79. emqxConfig:
  80. EMQX_RPC__PROTOCOL: ssl
  81. EMQX_RPC__CERTFILE: /opt/emqx/etc/certs/cert.pem
  82. EMQX_RPC__KEYFILE: /opt/emqx/etc/certs/key.pem
  83. EMQX_RPC__CACERTFILE: /opt/emqx/etc/certs/cacert.pem
  84. EMQX_RPC__CIPHERS: TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256
  85. EMQX_RPC__TLS_VERSIONS: "[tlsv1.2]"
  86. EOL
  87. - name: run emqx on chart (k8s)
  88. if: matrix.discovery == 'k8s'
  89. working-directory: source
  90. run: |
  91. helm install ${EMQX_NAME} \
  92. --set emqxConfig.EMQX_CLUSTER__DISCOVERY_STRATEGY="k8s" \
  93. --set emqxConfig.EMQX_CLUSTER__K8S__APISERVER="https://kubernetes.default.svc:443" \
  94. --set emqxConfig.EMQX_CLUSTER__K8S__SERVICE_NAME="${EMQX_NAME}-headless" \
  95. --set emqxConfig.EMQX_CLUSTER__K8S__NAMESPACE="default" \
  96. --set image.repository=$REPOSITORY \
  97. --set image.pullPolicy=Never \
  98. --set image.tag=$EMQX_TAG \
  99. --set emqxAclConfig="" \
  100. --set emqxConfig.EMQX_MQTT__RETRY_INTERVAL=2s \
  101. --set emqxConfig.EMQX_MQTT__MAX_TOPIC_ALIAS=10 \
  102. --set emqxConfig.EMQX_AUTHORIZATION__SOURCES=[] \
  103. --set emqxConfig.EMQX_LOG__CONSOLE__LEVEL=debug \
  104. --set emqxConfig.EMQX_AUTHORIZATION__NO_MATCH=allow \
  105. --values rpc-overrides.yaml \
  106. deploy/charts/${EMQX_NAME} \
  107. --debug
  108. - name: run emqx on chart (dns)
  109. if: matrix.discovery == 'dns'
  110. working-directory: source
  111. run: |
  112. helm install ${EMQX_NAME} \
  113. --set emqxConfig.EMQX_CLUSTER__DISCOVERY_STRATEGY="dns" \
  114. --set emqxConfig.EMQX_CLUSTER__DNS__RECORD_TYPE="srv" \
  115. --set emqxConfig.EMQX_CLUSTER__DNS__NAME="${EMQX_NAME}-headless.default.svc.cluster.local" \
  116. --set image.repository=$REPOSITORY \
  117. --set image.pullPolicy=Never \
  118. --set image.tag=$EMQX_TAG \
  119. --set emqxAclConfig="" \
  120. --set emqxConfig.EMQX_MQTT__RETRY_INTERVAL=2s \
  121. --set emqxConfig.EMQX_MQTT__MAX_TOPIC_ALIAS=10 \
  122. --set emqxConfig.EMQX_AUTHORIZATION__SOURCES=[] \
  123. --set emqxConfig.EMQX_LOG__CONSOLE__LEVEL=debug \
  124. --set emqxConfig.EMQX_AUTHORIZATION__NO_MATCH=allow \
  125. --values rpc-overrides.yaml \
  126. deploy/charts/${EMQX_NAME} \
  127. --wait \
  128. --debug
  129. - name: waiting emqx started
  130. timeout-minutes: 5
  131. run: |
  132. while [ "$(kubectl get StatefulSet -l app.kubernetes.io/instance=${EMQX_NAME} -o jsonpath='{.items[0].status.replicas}')" \
  133. != "$(kubectl get StatefulSet -l app.kubernetes.io/instance=${EMQX_NAME} -o jsonpath='{.items[0].status.readyReplicas}')" ]; do
  134. echo "==============================";
  135. kubectl get pods;
  136. echo "==============================";
  137. echo "waiting emqx started";
  138. sleep 10;
  139. done
  140. - name: Setup 18083 port forwarding
  141. run: |
  142. nohup kubectl port-forward service/${EMQX_NAME} 18083:18083 > /dev/null &
  143. - name: Get auth token
  144. run: |
  145. curl --head -X GET --retry 10 --retry-connrefused --retry-delay 6 http://localhost:18083/status
  146. echo "TOKEN=$(curl --silent -X 'POST' 'http://127.0.0.1:18083/api/v5/login' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{"username": "admin","password": "public"}' | jq -r ".token")" >> $GITHUB_ENV
  147. - name: Check cluster
  148. timeout-minutes: 1
  149. run: |
  150. while
  151. nodes_length="$(curl --silent -H "Authorization: Bearer $TOKEN" -X GET http://127.0.0.1:18083/api/v5/cluster| jq '.nodes|length')"
  152. [ $nodes_length != "3" ]
  153. do
  154. if [ $nodes_length -eq 0 ]; then
  155. echo "node len must >= 1, refresh Token... "
  156. TOKEN=$(curl --silent -X 'POST' 'http://127.0.0.1:18083/api/v5/login' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{"username": "admin","password": "public"}' | jq -r ".token")
  157. else
  158. echo "waiting ${EMQX_NAME} cluster scale. Current live nodes: $nodes_length."
  159. fi
  160. sleep 1;
  161. done
  162. - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
  163. with:
  164. repository: emqx/paho.mqtt.testing
  165. ref: develop-5.0
  166. path: paho.mqtt.testing
  167. - name: install pytest
  168. run: |
  169. pip install --require-hashes -r source/.ci/docker-compose-file/python/requirements.txt
  170. echo "$HOME/.local/bin" >> $GITHUB_PATH
  171. - name: run paho test
  172. timeout-minutes: 10
  173. run: |
  174. port_connected () {
  175. local server="$1"
  176. local port="$2"
  177. echo > /dev/tcp/${server}/${port} 2>/dev/null
  178. }
  179. kubectl port-forward service/${EMQX_NAME} 1883:1883 > /dev/null &
  180. while ! port_connected localhost 1883; do
  181. echo server not listening yet...
  182. sleep 10
  183. done
  184. pytest --retries 3 -v paho.mqtt.testing/interoperability/test_client/V5/test_connect.py -k test_basic --host "127.0.0.1"
  185. - if: failure()
  186. run: kubectl logs -l "app.kubernetes.io/instance=${EMQX_NAME}" -c emqx --tail=1000