pkg-tests.sh 7.7 KB

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