run_helm_tests.yaml 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. permissions:
  18. contents: read
  19. jobs:
  20. helm_test:
  21. runs-on: ${{ fromJSON(inputs.runner_labels) }}
  22. defaults:
  23. run:
  24. shell: bash
  25. env:
  26. EMQX_NAME: ${{ matrix.profile }}
  27. EMQX_TAG: ${{ matrix.profile == 'emqx-enterprise' && inputs.version-emqx-enterprise || inputs.version-emqx }}
  28. REPOSITORY: "emqx/${{ matrix.profile }}"
  29. strategy:
  30. fail-fast: false
  31. matrix:
  32. discovery:
  33. - k8s
  34. - dns
  35. profile:
  36. - emqx
  37. - emqx-enterprise
  38. steps:
  39. - uses: actions/checkout@v3
  40. with:
  41. path: source
  42. - uses: actions/download-artifact@v3
  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: run emqx on chart (k8s)
  54. if: matrix.discovery == 'k8s'
  55. working-directory: source
  56. run: |
  57. helm install ${EMQX_NAME} \
  58. --set emqxConfig.EMQX_CLUSTER__DISCOVERY_STRATEGY="k8s" \
  59. --set emqxConfig.EMQX_CLUSTER__K8S__APISERVER="https://kubernetes.default.svc:443" \
  60. --set emqxConfig.EMQX_CLUSTER__K8S__SERVICE_NAME="${EMQX_NAME}-headless" \
  61. --set emqxConfig.EMQX_CLUSTER__K8S__NAMESPACE="default" \
  62. --set image.repository=$REPOSITORY \
  63. --set image.pullPolicy=Never \
  64. --set image.tag=$EMQX_TAG \
  65. --set emqxAclConfig="" \
  66. --set emqxConfig.EMQX_MQTT__RETRY_INTERVAL=2s \
  67. --set emqxConfig.EMQX_MQTT__MAX_TOPIC_ALIAS=10 \
  68. --set emqxConfig.EMQX_AUTHORIZATION__SOURCES=[] \
  69. --set emqxConfig.EMQX_AUTHORIZATION__NO_MATCH=allow \
  70. deploy/charts/${EMQX_NAME} \
  71. --debug
  72. - name: run emqx on chart (dns)
  73. if: matrix.discovery == 'dns'
  74. working-directory: source
  75. run: |
  76. helm install ${EMQX_NAME} \
  77. --set emqxConfig.EMQX_CLUSTER__DISCOVERY_STRATEGY="dns" \
  78. --set emqxConfig.EMQX_CLUSTER__DNS__RECORD_TYPE="srv" \
  79. --set emqxConfig.EMQX_CLUSTER__DNS__NAME="${EMQX_NAME}-headless.default.svc.cluster.local" \
  80. --set image.repository=$REPOSITORY \
  81. --set image.pullPolicy=Never \
  82. --set image.tag=$EMQX_TAG \
  83. --set emqxAclConfig="" \
  84. --set emqxConfig.EMQX_MQTT__RETRY_INTERVAL=2s \
  85. --set emqxConfig.EMQX_MQTT__MAX_TOPIC_ALIAS=10 \
  86. --set emqxConfig.EMQX_AUTHORIZATION__SOURCES=[] \
  87. --set emqxConfig.EMQX_AUTHORIZATION__NO_MATCH=allow \
  88. deploy/charts/${EMQX_NAME} \
  89. --debug
  90. - name: waiting emqx started
  91. timeout-minutes: 5
  92. run: |
  93. while [ "$(kubectl get StatefulSet -l app.kubernetes.io/instance=${EMQX_NAME} -o jsonpath='{.items[0].status.replicas}')" \
  94. != "$(kubectl get StatefulSet -l app.kubernetes.io/instance=${EMQX_NAME} -o jsonpath='{.items[0].status.readyReplicas}')" ]; do
  95. echo "==============================";
  96. kubectl get pods;
  97. echo "==============================";
  98. echo "waiting emqx started";
  99. sleep 10;
  100. done
  101. - name: Get Token
  102. run: |
  103. kubectl port-forward service/${EMQX_NAME} 18083:18083 > /dev/null &
  104. curl --head -X GET --retry 10 --retry-connrefused --retry-delay 6 http://localhost:18083/status
  105. 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
  106. - name: Check cluster
  107. timeout-minutes: 1
  108. run: |
  109. while
  110. nodes_length="$(curl --silent -H "Authorization: Bearer $TOKEN" -X GET http://127.0.0.1:18083/api/v5/cluster| jq '.nodes|length')"
  111. [ $nodes_length != "3" ]
  112. do
  113. echo "waiting ${EMQX_NAME} cluster scale. Current live nodes: $nodes_length."
  114. sleep 1
  115. done
  116. - uses: actions/checkout@v3
  117. with:
  118. repository: emqx/paho.mqtt.testing
  119. ref: develop-5.0
  120. path: paho.mqtt.testing
  121. - name: install pytest
  122. run: |
  123. pip install pytest==7.1.2 pytest-retry==1.3.0
  124. echo "$HOME/.local/bin" >> $GITHUB_PATH
  125. - name: run paho test
  126. timeout-minutes: 10
  127. run: |
  128. port_connected () {
  129. local server="$1"
  130. local port="$2"
  131. echo > /dev/tcp/${server}/${port} 2>/dev/null
  132. }
  133. kubectl port-forward service/${EMQX_NAME} 1883:1883 > /dev/null &
  134. while ! port_connected localhost 1883; do
  135. echo server not listening yet...
  136. sleep 10
  137. done
  138. pytest --retries 3 -v paho.mqtt.testing/interoperability/test_client/V5/test_connect.py -k test_basic --host "127.0.0.1"
  139. - if: failure()
  140. run: kubectl logs -l "app.kubernetes.io/instance=${EMQX_NAME}" -c emqx --tail=1000