pkg-tests.sh 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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. export PAHO_MQTT_TESTING_PATH="${PAHO_MQTT_TESTING_PATH:-/paho-mqtt-testing}"
  44. SYSTEM="$("$SCRIPTS"/get-distro.sh)"
  45. if [ "$PACKAGE_TYPE" = 'tgz' ]; then
  46. PKG_SUFFIX="tar.gz"
  47. else
  48. case "${SYSTEM:-}" in
  49. ubuntu*|debian*|raspbian*)
  50. PKG_SUFFIX='deb'
  51. ;;
  52. *)
  53. PKG_SUFFIX='rpm'
  54. ;;
  55. esac
  56. fi
  57. PACKAGE_VERSION="$("$CODE_PATH"/pkg-vsn.sh "${EMQX_NAME}")"
  58. PACKAGE_VERSION_LONG="$("$CODE_PATH"/pkg-vsn.sh "${EMQX_NAME}" --long --elixir "${IS_ELIXIR}")"
  59. PACKAGE_NAME="${EMQX_NAME}-${PACKAGE_VERSION_LONG}"
  60. PACKAGE_FILE_NAME="${PACKAGE_FILE_NAME:-${PACKAGE_NAME}.${PKG_SUFFIX}}"
  61. PACKAGE_FILE="${PACKAGE_PATH}/${PACKAGE_FILE_NAME}"
  62. if ! [ -f "$PACKAGE_FILE" ]; then
  63. echo "$PACKAGE_FILE is not a file"
  64. exit 1
  65. fi
  66. emqx_prepare(){
  67. mkdir -p "${PACKAGE_PATH}"
  68. if [ ! -d "${PAHO_MQTT_TESTING_PATH}" ]; then
  69. git clone -b develop-4.0 https://github.com/emqx/paho.mqtt.testing.git "${PAHO_MQTT_TESTING_PATH}"
  70. fi
  71. # Debian 12 and Ubuntu 24.04 complain if we don't use venv
  72. case "${SYSTEM:-}" in
  73. debian12|ubuntu24.04)
  74. apt-get update -y && apt-get install -y virtualenv
  75. virtualenv venv
  76. # https://www.shellcheck.net/wiki/SC1091
  77. # shellcheck source=/dev/null
  78. source ./venv/bin/activate
  79. ;;
  80. *)
  81. ;;
  82. esac
  83. pip3 install -r "$CODE_PATH/scripts/pytest.requirements.txt"
  84. }
  85. emqx_test(){
  86. cd "${PACKAGE_PATH}"
  87. local packagename="${PACKAGE_FILE_NAME}"
  88. case "$PKG_SUFFIX" in
  89. "tar.gz")
  90. mkdir -p "${PACKAGE_PATH}/emqx"
  91. tar -C "${PACKAGE_PATH}/emqx" -zxf "${PACKAGE_PATH}/${packagename}"
  92. export EMQX_ZONES__DEFAULT__MQTT__SERVER_KEEPALIVE=60
  93. export EMQX_MQTT__MAX_TOPIC_ALIAS=10
  94. export EMQX_LOG__CONSOLE_HANDLER__LEVEL=debug
  95. export EMQX_LOG__FILE_HANDLERS__DEFAULT__LEVEL=debug
  96. # if [[ $(arch) == *arm* || $(arch) == aarch64 ]]; then
  97. # export EMQX_LISTENERS__QUIC__DEFAULT__ENABLED=false
  98. # fi
  99. # sed -i '/emqx_telemetry/d' "${PACKAGE_PATH}"/emqx/data/loaded_plugins
  100. run_test "${PACKAGE_PATH}/emqx/bin" "${PACKAGE_PATH}/emqx/log" "${PACKAGE_PATH}/emqx/releases/emqx_vars"
  101. rm -rf "${PACKAGE_PATH}"/emqx
  102. ;;
  103. "deb")
  104. dpkg -i "${PACKAGE_PATH}/${packagename}"
  105. if [ "$(dpkg -l | grep ${EMQX_NAME} | awk '{print $1}')" != "ii" ]
  106. then
  107. echo "package install error"
  108. exit 1
  109. fi
  110. run_test "/usr/bin" "/var/log/emqx" "$(dpkg -L ${EMQX_NAME} | grep emqx_vars)"
  111. dpkg -r "${EMQX_NAME}"
  112. if [ "$(dpkg -l | grep ${EMQX_NAME} | awk '{print $1}')" != "rc" ]
  113. then
  114. echo "package remove error"
  115. exit 1
  116. fi
  117. echo "try to install again and purge while the service is running"
  118. dpkg -i "${PACKAGE_PATH}/${packagename}"
  119. if [ "$(dpkg -l | grep ${EMQX_NAME} | awk '{print $1}')" != "ii" ]
  120. then
  121. echo "package install error"
  122. exit 1
  123. fi
  124. if ! /usr/bin/emqx start
  125. then
  126. echo "ERROR: failed_to_start_emqx"
  127. cat /var/log/emqx/erlang.log.1 || true
  128. cat /var/log/emqx/emqx.log.1 || true
  129. exit 1
  130. fi
  131. /usr/bin/emqx ping
  132. dpkg -P "${EMQX_NAME}"
  133. if dpkg -l |grep -q emqx
  134. then
  135. echo "package uninstall error"
  136. exit 1
  137. fi
  138. ;;
  139. "rpm")
  140. # yum wants python2
  141. case "${SYSTEM:-}" in
  142. "el8")
  143. # el8 is fine with python3
  144. true
  145. ;;
  146. "el9")
  147. # el9 is fine with python3
  148. true
  149. ;;
  150. *)
  151. alternatives --list | grep python && alternatives --set python /usr/bin/python2
  152. ;;
  153. esac
  154. YUM_RES=$(yum install -y "${PACKAGE_PATH}/${packagename}"| tee /dev/null)
  155. if [[ $YUM_RES =~ "Failed" ]]; then
  156. echo "yum install failed"
  157. exit 1
  158. fi
  159. alternatives --list | grep python && alternatives --set python /usr/bin/python3
  160. if ! rpm -q "${EMQX_NAME}" | grep -q "${EMQX_NAME}"; then
  161. echo "package install error"
  162. exit 1
  163. fi
  164. run_test "/usr/bin" "/var/log/emqx" "$(rpm -ql ${EMQX_NAME} | grep emqx_vars)"
  165. rpm -e "${EMQX_NAME}"
  166. if [ "$(rpm -q ${EMQX_NAME})" != "package ${EMQX_NAME} is not installed" ];then
  167. echo "package uninstall error"
  168. exit 1
  169. fi
  170. ;;
  171. esac
  172. }
  173. run_test(){
  174. local bin_dir="$1"
  175. local log_dir="$2"
  176. local emqx_env_vars="$3"
  177. # sed -i '/emqx_telemetry/d' /var/lib/emqx/loaded_plugins
  178. if [ -f "$emqx_env_vars" ];
  179. then
  180. tee -a "$emqx_env_vars" <<EOF
  181. export EMQX_ZONES__DEFAULT__MQTT__SERVER_KEEPALIVE=60
  182. export EMQX_MQTT__MAX_TOPIC_ALIAS=10
  183. export EMQX_LOG__CONSOLE_HANDLER__LEVEL=debug
  184. export EMQX_LOG__FILE_HANDLERS__DEFAULT__LEVEL=debug
  185. EOF
  186. ## for ARM, due to CI env issue, skip start of quic listener for the moment
  187. # [[ $(arch) == *arm* || $(arch) == aarch64 ]] && tee -a "$emqx_env_vars" <<EOF
  188. # export EMQX_LISTENERS__QUIC__DEFAULT__ENABLED=false
  189. # EOF
  190. else
  191. echo "Error: cannot locate emqx_vars"
  192. exit 1
  193. fi
  194. if ! "${bin_dir}/emqx" 'start' 'help'; then
  195. echo "ERROR: failed_to_call_help_command"
  196. exit 1
  197. fi
  198. if ! "${bin_dir}/emqx" 'help'; then
  199. echo "ERROR: failed_to_call_help_command"
  200. exit 1
  201. fi
  202. echo "running ${packagename} start"
  203. if ! "${bin_dir}/emqx" 'start'; then
  204. echo "ERROR: failed_to_start_emqx"
  205. cat "${log_dir}/erlang.log.1" || true
  206. cat "${log_dir}/emqx.log.1" || true
  207. exit 1
  208. fi
  209. "$SCRIPTS/test/emqx-smoke-test.sh" 127.0.0.1 18083
  210. pytest -v "${PAHO_MQTT_TESTING_PATH}"/interoperability/test_client/V5/test_connect.py::test_basic
  211. "${bin_dir}/emqx" ping
  212. echo "running ${packagename} stop"
  213. if ! "${bin_dir}/emqx" 'stop'; then
  214. echo "ERROR: failed_to_stop_emqx_with_the_stop_command"
  215. cat "${log_dir}/erlang.log.1" || true
  216. cat "${log_dir}/emqx.log.1" || true
  217. exit 1
  218. fi
  219. }
  220. relup_test(){
  221. if [ ! -d "${RELUP_PACKAGE_PATH}" ]; then
  222. echo "WARNING: ${RELUP_PACKAGE_PATH} is not a dir, skipped relup test!"
  223. return 0
  224. fi
  225. cd "${RELUP_PACKAGE_PATH}"
  226. local pattern
  227. pattern="$EMQX_NAME-$("$CODE_PATH"/pkg-vsn.sh "${EMQX_NAME}" --long --vsn_matcher)"
  228. while read -r pkg; do
  229. packagename=$(basename "${pkg}")
  230. mkdir -p emqx
  231. tar -C emqx -zxf "$packagename"
  232. if ! ./emqx/bin/emqx start; then
  233. cat emqx/log/erlang.log.1 || true
  234. cat emqx/log/emqx.log.1 || true
  235. exit 1
  236. fi
  237. ./emqx/bin/emqx_ctl status
  238. ./emqx/bin/emqx versions
  239. cp "${PACKAGE_PATH}/${PACKAGE_NAME}.tar.gz" ./emqx/releases/
  240. ./emqx/bin/emqx install "${PACKAGE_VERSION}"
  241. [ "$(./emqx/bin/emqx versions | grep permanent | awk '{print $2}')" = "${PACKAGE_VERSION}" ] || exit 1
  242. ./emqx/bin/emqx_ctl status
  243. ./emqx/bin/emqx stop
  244. rm -rf emqx
  245. done < <(find . -maxdepth 1 -name "${pattern}.tar.gz")
  246. }
  247. emqx_prepare
  248. emqx_test
  249. if [ "$IS_ELIXIR" = 'yes' ]; then
  250. echo "WARNING: skipped relup test for elixir"
  251. else
  252. relup_test
  253. fi