run_helm_tests.yaml 6.9 KB

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