pkg-tests.sh 8.1 KB

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