pkg-tests.sh 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. set -x
  4. if [ -z "${1:-}" ]; then
  5. echo "Usage $0 <PACKAGE_NAME> tgz|pkg"
  6. exit 1
  7. fi
  8. case "${2:-}" in
  9. tgz|pkg)
  10. true
  11. ;;
  12. *)
  13. echo "Usage $0 <PACKAGE_NAME> tgz|pkg"
  14. exit 1
  15. ;;
  16. esac
  17. PACKAGE_NAME="${1}"
  18. PACKAGE_TYPE="${2}"
  19. ARCH="${3}"
  20. # Needed by deploy/package/**/Makefile
  21. export ARCH
  22. export DEBUG=1
  23. export CODE_PATH=${CODE_PATH:-"/emqx"}
  24. export SCRIPTS="${CODE_PATH}/scripts"
  25. export EMQX_NAME=${EMQX_NAME:-"emqx"}
  26. export PACKAGE_PATH="${CODE_PATH}/_packages/${EMQX_NAME}"
  27. export RELUP_PACKAGE_PATH="${CODE_PATH}/_upgrade_base"
  28. if [ "$PACKAGE_TYPE" = 'tgz' ]; then
  29. PKG_SUFFIX="tar.gz"
  30. else
  31. SYSTEM="$("$SCRIPTS"/get-distro.sh)"
  32. case "${SYSTEM:-}" in
  33. ubuntu*|debian*|raspbian*)
  34. PKG_SUFFIX='deb'
  35. ;;
  36. *)
  37. PKG_SUFFIX='rpm'
  38. ;;
  39. esac
  40. fi
  41. PACKAGE_FILE_NAME="${PACKAGE_NAME}.${PKG_SUFFIX}"
  42. PACKAGE_FILE="${PACKAGE_PATH}/${PACKAGE_FILE_NAME}"
  43. if ! [ -f "$PACKAGE_FILE" ]; then
  44. echo "$PACKAGE_FILE is not a file"
  45. exit 1
  46. fi
  47. emqx_prepare(){
  48. mkdir -p "${PACKAGE_PATH}"
  49. if [ ! -d "/paho-mqtt-testing" ]; then
  50. git clone -b develop-4.0 https://github.com/emqx/paho.mqtt.testing.git /paho-mqtt-testing
  51. fi
  52. pip3 install pytest
  53. }
  54. emqx_test(){
  55. cd "${PACKAGE_PATH}"
  56. local packagename="${PACKAGE_FILE_NAME}"
  57. case "$PKG_SUFFIX" in
  58. "tar.gz")
  59. tar -zxf "${PACKAGE_PATH}/${packagename}"
  60. export EMQX_ZONES__DEFAULT__MQTT__SERVER_KEEPALIVE=60
  61. export EMQX_MQTT__MAX_TOPIC_ALIAS=10
  62. export EMQX_LOG__CONSOLE_HANDLER__LEVEL=debug
  63. export EMQX_LOG__FILE_HANDLERS__DEFAULT__LEVEL=debug
  64. if [[ $(arch) == *arm* || $(arch) == aarch64 ]]; then
  65. export EMQX_LISTENERS__QUIC__DEFAULT__ENABLED=false
  66. fi
  67. # sed -i '/emqx_telemetry/d' "${PACKAGE_PATH}"/emqx/data/loaded_plugins
  68. echo "running ${packagename} start"
  69. if ! "${PACKAGE_PATH}"/emqx/bin/emqx start; then
  70. cat "${PACKAGE_PATH}"/emqx/log/erlang.log.1 || true
  71. cat "${PACKAGE_PATH}"/emqx/log/emqx.log.1 || true
  72. exit 1
  73. fi
  74. IDLE_TIME=0
  75. while ! curl http://127.0.0.1:18083/api/v5/status >/dev/null 2>&1; do
  76. if [ $IDLE_TIME -gt 10 ]
  77. then
  78. echo "emqx running error"
  79. exit 1
  80. fi
  81. sleep 10
  82. IDLE_TIME=$((IDLE_TIME+1))
  83. done
  84. pytest -v /paho-mqtt-testing/interoperability/test_client/V5/test_connect.py::test_basic
  85. if ! "${PACKAGE_PATH}"/emqx/bin/emqx stop; then
  86. cat "${PACKAGE_PATH}"/emqx/log/erlang.log.1 || true
  87. cat "${PACKAGE_PATH}"/emqx/log/emqx.log.1 || true
  88. exit 1
  89. fi
  90. echo "running ${packagename} stop"
  91. rm -rf "${PACKAGE_PATH}"/emqx
  92. ;;
  93. "deb")
  94. dpkg -i "${PACKAGE_PATH}/${packagename}"
  95. if [ "$(dpkg -l |grep emqx |awk '{print $1}')" != "ii" ]
  96. then
  97. echo "package install error"
  98. exit 1
  99. fi
  100. echo "running ${packagename} start"
  101. run_test
  102. echo "running ${packagename} stop"
  103. dpkg -r "${EMQX_NAME}"
  104. if [ "$(dpkg -l |grep emqx |awk '{print $1}')" != "rc" ]
  105. then
  106. echo "package remove error"
  107. exit 1
  108. fi
  109. dpkg -P "${EMQX_NAME}"
  110. if dpkg -l |grep -q emqx
  111. then
  112. echo "package uninstall error"
  113. exit 1
  114. fi
  115. ;;
  116. "rpm")
  117. yum install -y "${PACKAGE_PATH}/${packagename}"
  118. if ! rpm -q "${EMQX_NAME}" | grep -q "${EMQX_NAME}"; then
  119. echo "package install error"
  120. exit 1
  121. fi
  122. echo "running ${packagename} start"
  123. run_test
  124. echo "running ${packagename} stop"
  125. rpm -e "${EMQX_NAME}"
  126. if [ "$(rpm -q emqx)" != "package emqx is not installed" ];then
  127. echo "package uninstall error"
  128. exit 1
  129. fi
  130. ;;
  131. esac
  132. }
  133. run_test(){
  134. # sed -i '/emqx_telemetry/d' /var/lib/emqx/loaded_plugins
  135. emqx_env_vars=$(dirname "$(readlink "$(command -v emqx)")")/../releases/emqx_vars
  136. if [ -f "$emqx_env_vars" ];
  137. then
  138. tee -a "$emqx_env_vars" <<EOF
  139. export EMQX_ZONES__DEFAULT__MQTT__SERVER_KEEPALIVE=60
  140. export EMQX_MQTT__MAX_TOPIC_ALIAS=10
  141. export EMQX_LOG__CONSOLE_HANDLER__LEVEL=debug
  142. export EMQX_LOG__FILE_HANDLERS__DEFAULT__LEVEL=debug
  143. EOF
  144. ## for ARM, due to CI env issue, skip start of quic listener for the moment
  145. [[ $(arch) == *arm* || $(arch) == aarch64 ]] && tee -a "$emqx_env_vars" <<EOF
  146. export EMQX_LISTENERS__QUIC__DEFAULT__ENABLED=false
  147. EOF
  148. else
  149. echo "Error: cannot locate emqx_vars"
  150. exit 1
  151. fi
  152. if ! emqx 'start'; then
  153. cat /var/log/emqx/erlang.log.1 || true
  154. cat /var/log/emqx/emqx.log.1 || true
  155. exit 1
  156. fi
  157. IDLE_TIME=0
  158. while ! curl http://127.0.0.1:18083/api/v5/status >/dev/null 2>&1; do
  159. if [ $IDLE_TIME -gt 10 ]
  160. then
  161. echo "emqx running error"
  162. exit 1
  163. fi
  164. sleep 10
  165. IDLE_TIME=$((IDLE_TIME+1))
  166. done
  167. pytest -v /paho-mqtt-testing/interoperability/test_client/V5/test_connect.py::test_basic
  168. # shellcheck disable=SC2009 # pgrep does not support Extended Regular Expressions
  169. ps -ef | grep -E '\-progname\s.+emqx\s'
  170. if ! emqx 'stop'; then
  171. # shellcheck disable=SC2009 # pgrep does not support Extended Regular Expressions
  172. ps -ef | grep -E '\-progname\s.+emqx\s'
  173. echo "ERROR: failed_to_stop_emqx_with_the_stop_command"
  174. cat /var/log/emqx/erlang.log.1 || true
  175. cat /var/log/emqx/emqx.log.1 || true
  176. exit 1
  177. fi
  178. }
  179. relup_test(){
  180. TARGET_VERSION="$("$CODE_PATH"/pkg-vsn.sh "${EMQX_NAME}")"
  181. if [ ! -d "${RELUP_PACKAGE_PATH}" ]; then
  182. echo "WARNING: ${RELUP_PACKAGE_PATH} is not a dir, skipped relup test!"
  183. return 0
  184. fi
  185. cd "${RELUP_PACKAGE_PATH}"
  186. local pattern
  187. pattern="$("$SCRIPTS"/pkg-full-vsn.sh "${EMQX_NAME}" 'vsn_matcher')"
  188. while read -r pkg; do
  189. packagename=$(basename "${pkg}")
  190. tar -zxf "$packagename"
  191. if ! ./emqx/bin/emqx start; then
  192. cat emqx/log/erlang.log.1 || true
  193. cat emqx/log/emqx.log.1 || true
  194. exit 1
  195. fi
  196. ./emqx/bin/emqx_ctl status
  197. ./emqx/bin/emqx versions
  198. cp "$PACKAGE_FILE" ./emqx/releases/
  199. ./emqx/bin/emqx install "${TARGET_VERSION}"
  200. [ "$(./emqx/bin/emqx versions |grep permanent | awk '{print $2}')" = "${TARGET_VERSION}" ] || exit 1
  201. ./emqx/bin/emqx_ctl status
  202. ./emqx/bin/emqx stop
  203. rm -rf emqx
  204. done < <(find . -maxdepth 1 -name "${pattern}.tar.gz")
  205. }
  206. emqx_prepare
  207. emqx_test
  208. relup_test