build 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. #!/usr/bin/env bash
  2. # This script helps to build release artifacts.
  3. # arg1: profile, e.g. emqx | emqx-enterprise
  4. # arg2: artifact, e.g. rel | relup | tgz | pkg
  5. set -euo pipefail
  6. if [ "${DEBUG:-0}" -eq 1 ]; then
  7. set -x
  8. # set this for rebar3
  9. export DIAGNOSTIC=1
  10. fi
  11. log_red() {
  12. local RED='\033[0;31m' # Red
  13. local NC='\033[0m' # No Color
  14. echo -e "${RED}${1}${NC}"
  15. }
  16. PROFILE_ARG="$1"
  17. ARTIFACT="$2"
  18. is_enterprise() {
  19. case "$1" in
  20. *enterprise*)
  21. echo 'yes'
  22. ;;
  23. *)
  24. echo 'no'
  25. ;;
  26. esac
  27. }
  28. PROFILE_ENV="${PROFILE:-${PROFILE_ARG}}"
  29. case "$(is_enterprise "$PROFILE_ARG"),$(is_enterprise "$PROFILE_ENV")" in
  30. 'yes,yes')
  31. true
  32. ;;
  33. 'no,no')
  34. true
  35. ;;
  36. *)
  37. log_red "PROFILE env var is set to '$PROFILE_ENV', but '$0' arg1 is '$PROFILE_ARG'"
  38. exit 1
  39. ;;
  40. esac
  41. # make sure PROFILE is exported, it is needed by rebar.config.erl
  42. PROFILE=$PROFILE_ARG
  43. export PROFILE
  44. # ensure dir
  45. cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")"
  46. PKG_VSN="${PKG_VSN:-$(./pkg-vsn.sh "$PROFILE")}"
  47. export PKG_VSN
  48. SYSTEM="$(./scripts/get-distro.sh)"
  49. if [[ $SYSTEM == "el7" ]];
  50. then
  51. echo "WARNING: NO SECURITY UPDATES for CentOS 7 QUIC transport"
  52. export QUICER_TLS_VER=openssl
  53. fi
  54. ARCH="$(uname -m)"
  55. case "$ARCH" in
  56. x86_64)
  57. ARCH='amd64'
  58. ;;
  59. aarch64)
  60. ARCH='arm64'
  61. ;;
  62. arm*)
  63. ARCH='arm64'
  64. ;;
  65. esac
  66. export ARCH
  67. ##
  68. ## Support RPM and Debian based linux systems
  69. ##
  70. if [ "$(uname -s)" = 'Linux' ]; then
  71. case "${SYSTEM:-}" in
  72. ubuntu*|debian*|raspbian*)
  73. PKGERDIR='deb'
  74. ;;
  75. *)
  76. PKGERDIR='rpm'
  77. ;;
  78. esac
  79. fi
  80. if [ "${SYSTEM}" = 'windows' ]; then
  81. # windows does not like the find
  82. FIND="/usr/bin/find"
  83. TAR="/usr/bin/tar"
  84. export BUILD_WITHOUT_ROCKSDB="on"
  85. else
  86. FIND='find'
  87. TAR='tar'
  88. fi
  89. log() {
  90. local msg="$1"
  91. # rebar3 prints ===>, so we print ===<
  92. echo "===< $msg"
  93. }
  94. prepare_erl_libs() {
  95. local libs_dir="$1"
  96. local erl_libs="${ERL_LIBS:-}"
  97. local sep
  98. if [ "${SYSTEM}" = 'windows' ]; then
  99. sep=';'
  100. else
  101. sep=':'
  102. fi
  103. for app in "${libs_dir}"/*; do
  104. if [ -d "${app}/ebin" ]; then
  105. if [ -n "$erl_libs" ]; then
  106. erl_libs="${erl_libs}${sep}${app}"
  107. else
  108. erl_libs="${app}"
  109. fi
  110. fi
  111. done
  112. export ERL_LIBS="$erl_libs"
  113. }
  114. make_docs() {
  115. case "$(is_enterprise "$PROFILE")" in
  116. 'yes')
  117. SCHEMA_MODULE='emqx_enterprise_schema'
  118. ;;
  119. 'no')
  120. SCHEMA_MODULE='emqx_conf_schema'
  121. ;;
  122. esac
  123. prepare_erl_libs "_build/$PROFILE/checkouts"
  124. prepare_erl_libs "_build/$PROFILE/lib"
  125. local docdir="_build/docgen/$PROFILE"
  126. mkdir -p "$docdir"
  127. # shellcheck disable=SC2086
  128. erl -enable-feature maybe_expr -noshell -eval \
  129. "ok = emqx_conf:dump_schema('$docdir', $SCHEMA_MODULE), \
  130. halt(0)."
  131. local desc="$docdir/desc.en.hocon"
  132. if command -v jq &> /dev/null; then
  133. log "Generating $desc"
  134. scripts/merge-i18n.escript | jq --sort-keys . > "$desc"
  135. else
  136. # it is not a big deal if we cannot generate the desc
  137. log_red "NOT Generated: $desc due to jq command missing."
  138. fi
  139. }
  140. ## arg1 is the profile for which the following args (as app names) should be excluded
  141. assert_no_excluded_deps() {
  142. local profile="$1"
  143. shift 1
  144. if [ "$PROFILE" != "$profile" ]; then
  145. # not currently building the profile which has apps to be excluded
  146. return 0
  147. fi
  148. local rel_dir="_build/$PROFILE/rel/emqx/lib"
  149. local excluded_apps=( "$@" )
  150. local found
  151. for app in "${excluded_apps[@]}"; do
  152. found="$($FIND "$rel_dir" -maxdepth 1 -type d -name "$app-*")"
  153. if [ -n "${found}" ]; then
  154. log_red "ERROR: ${app} should not be included in ${PROFILE}"
  155. log_red "ERROR: found ${app} in ${rel_dir}"
  156. exit 1
  157. fi
  158. done
  159. }
  160. just_compile() {
  161. ./scripts/pre-compile.sh "$PROFILE"
  162. # make_elixir_rel always create rebar.lock
  163. # delete it to make git clone + checkout work because we use shallow close for rebar deps
  164. rm -f rebar.lock
  165. # compile all beams
  166. ./rebar3 as "$PROFILE" compile
  167. make_docs
  168. }
  169. just_compile_elixir() {
  170. ./scripts/pre-compile.sh "$PROFILE"
  171. rm -f rebar.lock
  172. env MIX_ENV="$PROFILE" mix local.rebar --if-missing --force
  173. env MIX_ENV="$PROFILE" mix local.rebar rebar3 "${PWD}/rebar3" --if-missing --force
  174. # env MIX_ENV="$PROFILE" mix local.hex --if-missing --force
  175. env MIX_ENV="$PROFILE" mix local.hex 2.0.6 --if-missing --force
  176. env MIX_ENV="$PROFILE" mix deps.get
  177. env MIX_ENV="$PROFILE" mix compile
  178. }
  179. make_rel() {
  180. local release_or_tar="${1}"
  181. just_compile
  182. # now assemble the release tar
  183. ./rebar3 as "$PROFILE" "$release_or_tar"
  184. assert_no_excluded_deps emqx-enterprise emqx_telemetry
  185. }
  186. make_elixir_rel() {
  187. ./scripts/pre-compile.sh "$PROFILE"
  188. export_elixir_release_vars "$PROFILE"
  189. env MIX_ENV="$PROFILE" mix local.rebar --if-missing --force
  190. env MIX_ENV="$PROFILE" mix local.rebar rebar3 "${PWD}/rebar3" --if-missing --force
  191. # env MIX_ENV="$PROFILE" mix local.hex --if-missing --force
  192. env MIX_ENV="$PROFILE" mix local.hex 2.0.6 --if-missing --force
  193. env MIX_ENV="$PROFILE" mix deps.get
  194. env MIX_ENV="$PROFILE" mix release --overwrite
  195. assert_no_excluded_deps emqx-enterprise emqx_telemetry
  196. }
  197. make_relup() {
  198. RELUP_TARGET_VSN="$(./pkg-vsn.sh "$PROFILE" --long)"
  199. export RELUP_TARGET_VSN
  200. ./rebar3 emqx relup_gen --relup-dir=./rel/relup
  201. make rel -C _build/default/plugins/emqx_relup
  202. }
  203. cp_dyn_libs() {
  204. local rel_dir="$1"
  205. local target_dir="${rel_dir}/dynlibs"
  206. if ! [ "$(uname -s)" = 'Linux' ]; then
  207. return 0;
  208. fi
  209. mkdir -p "$target_dir"
  210. while read -r so_file; do
  211. cp -L "$so_file" "$target_dir/"
  212. done < <("$FIND" "$rel_dir" -type f \( -name "*.so*" -o -name "beam.smp" \) -print0 \
  213. | xargs -0 ldd \
  214. | grep -E '(libcrypto)|(libtinfo)|(libatomic)' \
  215. | awk '{print $3}' \
  216. | sort -u)
  217. }
  218. ## Re-pack the relx assembled .tar.gz to EMQX's package naming scheme
  219. ## It assumes the .tar.gz has been built -- relies on Makefile dependency
  220. make_tgz() {
  221. local pkgpath="_packages/${PROFILE}"
  222. local src_tarball
  223. local target_name
  224. local target
  225. if [ "${IS_ELIXIR:-no}" = "yes" ]
  226. then
  227. # ensure src_tarball exists
  228. ELIXIR_MAKE_TAR=yes make_elixir_rel
  229. local relpath="_build/${PROFILE}"
  230. full_vsn="$(./pkg-vsn.sh "$PROFILE" --long --elixir)"
  231. else
  232. # build the src_tarball again to ensure relup is included
  233. # elixir does not have relup yet.
  234. make_rel tar
  235. local relpath="_build/${PROFILE}/rel/emqx"
  236. full_vsn="$(./pkg-vsn.sh "$PROFILE" --long)"
  237. fi
  238. case "$SYSTEM" in
  239. macos*)
  240. target_name="${PROFILE}-${full_vsn}.zip"
  241. ;;
  242. windows*)
  243. target_name="${PROFILE}-${full_vsn}.zip"
  244. ;;
  245. *)
  246. target_name="${PROFILE}-${full_vsn}.tar.gz"
  247. ;;
  248. esac
  249. target="${pkgpath}/${target_name}"
  250. src_tarball="${relpath}/emqx-${PKG_VSN}.tar.gz"
  251. tard="$(mktemp -d -t emqx.XXXXXXX)"
  252. mkdir -p "${tard}/emqx"
  253. mkdir -p "${pkgpath}"
  254. if [ ! -f "$src_tarball" ]; then
  255. log_red "ERROR: $src_tarball is not found"
  256. fi
  257. $TAR zxf "${src_tarball}" -C "${tard}/emqx"
  258. if [ -f "${tard}/emqx/releases/${PKG_VSN}/relup" ]; then
  259. ./scripts/relup-build/inject-relup.escript "${tard}/emqx/releases/${PKG_VSN}/relup"
  260. fi
  261. ## try to be portable for tar.gz packages.
  262. ## for DEB and RPM packages the dependencies are resoved by yum and apt
  263. cp_dyn_libs "${tard}/emqx"
  264. case "$SYSTEM" in
  265. macos*)
  266. ## create zip after change dir
  267. ## to avoid creating an extra level of 'emqx' dir in the .zip file
  268. pushd "${tard}/emqx" >/dev/null
  269. zip -r "../${target_name}" -- * >/dev/null
  270. popd >/dev/null
  271. mv "${tard}/${target_name}" "${target}"
  272. # sha256sum may not be available on macos
  273. openssl dgst -sha256 "${target}" | cut -d ' ' -f 2 > "${target}.sha256"
  274. ;;
  275. windows*)
  276. pushd "${tard}" >/dev/null
  277. 7z a "${target_name}" ./emqx/* >/dev/null
  278. popd >/dev/null
  279. mv "${tard}/${target_name}" "${target}"
  280. sha256sum "${target}" | head -c 64 > "${target}.sha256"
  281. ;;
  282. *)
  283. ## create tar after change dir
  284. ## to avoid creating an extra level of 'emqx' dir in the .tar.gz file
  285. pushd "${tard}/emqx" >/dev/null
  286. $TAR -zcf "../${target_name}" -- *
  287. popd >/dev/null
  288. mv "${tard}/${target_name}" "${target}"
  289. sha256sum "${target}" | head -c 64 > "${target}.sha256"
  290. ;;
  291. esac
  292. log "Archive successfully repacked: ${target}"
  293. log "Archive sha256sum: $(cat "${target}.sha256")"
  294. }
  295. docker_cleanup() {
  296. rm -f ./.dockerignore >/dev/null
  297. # shellcheck disable=SC2015
  298. [ -f ./.dockerignore.bak ] && mv ./.dockerignore.bak ./.dockerignore >/dev/null || true
  299. }
  300. function is_ecr_and_enterprise() {
  301. local registry="$1"
  302. local profile="$2"
  303. if [[ "$registry" == public.ecr.aws* ]] && [[ "$profile" == *enterprise* ]]; then
  304. return 0
  305. else
  306. return 1
  307. fi
  308. }
  309. ## Build the default docker image based on debian 12.
  310. make_docker() {
  311. # shellcheck disable=SC1091
  312. source ./env.sh
  313. local BUILD_FROM="${BUILD_FROM:-${EMQX_DOCKER_BUILD_FROM}}"
  314. # shellcheck disable=SC2155
  315. local OTP_VSN="$(docker run --rm "${BUILD_FROM}" erl -eval '{ok, Version} = file:read_file(filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"])), io:fwrite(Version), halt().' -noshell)"
  316. # shellcheck disable=SC2155
  317. local ELIXIR_VSN="$(docker run --rm "${BUILD_FROM}" elixir --short-version)"
  318. local RUN_FROM="${RUN_FROM:-${EMQX_DOCKER_RUN_FROM}}"
  319. local EMQX_DOCKERFILE="${EMQX_DOCKERFILE:-deploy/docker/Dockerfile}"
  320. local EMQX_SOURCE_TYPE="${EMQX_SOURCE_TYPE:-src}"
  321. # shellcheck disable=SC2155
  322. local VSN_MAJOR="$(scripts/semver.sh "$PKG_VSN" --major)"
  323. # shellcheck disable=SC2155
  324. local VSN_MINOR="$(scripts/semver.sh "$PKG_VSN" --minor)"
  325. # shellcheck disable=SC2155
  326. local VSN_PATCH="$(scripts/semver.sh "$PKG_VSN" --patch)"
  327. local SUFFIX=''
  328. if [[ "$PROFILE" = *-elixir ]]; then
  329. SUFFIX="-elixir"
  330. fi
  331. local DOCKER_REGISTRY="${DOCKER_REGISTRY:-docker.io}"
  332. local DOCKER_REGISTRIES=( )
  333. IFS=',' read -ra DOCKER_REGISTRY_ARR <<< "$DOCKER_REGISTRY"
  334. for r in "${DOCKER_REGISTRY_ARR[@]}"; do
  335. # append to DOCKER_REGISTRIES
  336. DOCKER_REGISTRIES+=("$r")
  337. done
  338. local DOCKER_ORG="${DOCKER_ORG:-emqx}"
  339. local EMQX_BASE_DOCKER_TAG="${DOCKER_ORG}/${PROFILE%%-elixir}"
  340. local default_tag="${EMQX_BASE_DOCKER_TAG}:${PKG_VSN}${SUFFIX}"
  341. local EMQX_IMAGE_TAG="${EMQX_IMAGE_TAG:-$default_tag}"
  342. local EDITION=Opensource
  343. local LICENSE='Apache-2.0'
  344. local PRODUCT_URL='https://www.emqx.io'
  345. local PRODUCT_DESCRIPTION='Official docker image for EMQX, the most scalable open-source MQTT broker for IoT, IIoT, and connected vehicles.'
  346. local DOCUMENTATION_URL='https://www.emqx.io/docs/en/latest/'
  347. ## extra_deps is a comma separated list of debian 12 package names
  348. local EXTRA_DEPS=''
  349. if [[ "$PROFILE" = *enterprise* ]]; then
  350. EXTRA_DEPS='libsasl2-2,libsasl2-modules-gssapi-mit'
  351. EDITION=Enterprise
  352. LICENSE='(Apache-2.0 AND BSL-1.1)'
  353. PRODUCT_URL='https://www.emqx.com/en/products/emqx'
  354. PRODUCT_DESCRIPTION='Official docker image for EMQX Enterprise, an enterprise MQTT platform at scale. '
  355. DOCUMENTATION_URL='https://docs.emqx.com/en/enterprise/latest/'
  356. fi
  357. local ISO_8601_DATE GIT_REVISION
  358. ISO_8601_DATE="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
  359. GIT_REVISION="$(git rev-parse HEAD)"
  360. export BUILDX_NO_DEFAULT_ATTESTATIONS=1
  361. local DOCKER_BUILDX_ARGS=(
  362. --build-arg BUILD_FROM="${BUILD_FROM}" \
  363. --build-arg RUN_FROM="${RUN_FROM}" \
  364. --build-arg SOURCE_TYPE="${EMQX_SOURCE_TYPE}" \
  365. --build-arg PROFILE="${PROFILE%%-elixir}" \
  366. --build-arg IS_ELIXIR="$([[ "$PROFILE" = *-elixir ]] && echo yes || echo no)" \
  367. --build-arg SUFFIX="${SUFFIX}" \
  368. --build-arg EXTRA_DEPS="${EXTRA_DEPS}" \
  369. --build-arg PKG_VSN="${PKG_VSN}" \
  370. --file "${EMQX_DOCKERFILE}" \
  371. --label org.opencontainers.image.title="${PROFILE%%-elixir}" \
  372. --label org.opencontainers.image.edition="${EDITION}" \
  373. --label org.opencontainers.image.version="${PKG_VSN}" \
  374. --label org.opencontainers.image.revision="${GIT_REVISION}" \
  375. --label org.opencontainers.image.created="${ISO_8601_DATE}" \
  376. --label org.opencontainers.image.source='https://github.com/emqx/emqx' \
  377. --label org.opencontainers.image.url="${PRODUCT_URL}" \
  378. --label org.opencontainers.image.description="${PRODUCT_DESCRIPTION}" \
  379. --label org.opencontainers.image.documentation="${DOCUMENTATION_URL}" \
  380. --label org.opencontainers.image.licenses="${LICENSE}" \
  381. --label org.opencontainers.image.otp.version="${OTP_VSN}" \
  382. --pull
  383. )
  384. :> ./.emqx_docker_image_tags
  385. for r in "${DOCKER_REGISTRIES[@]}"; do
  386. DOCKER_BUILDX_ARGS+=(--tag "$r/${EMQX_IMAGE_TAG}")
  387. echo "$r/${EMQX_IMAGE_TAG}" >> ./.emqx_docker_image_tags
  388. done
  389. if [ "${DOCKER_BUILD_NOCACHE:-false}" = true ]; then
  390. DOCKER_BUILDX_ARGS+=(--no-cache)
  391. fi
  392. if [ "${SUFFIX}" = '-elixir' ]; then
  393. DOCKER_BUILDX_ARGS+=(--label org.opencontainers.image.elixir.version="${ELIXIR_VSN}")
  394. fi
  395. if [ "${DOCKER_LATEST:-false}" = true ]; then
  396. for r in "${DOCKER_REGISTRIES[@]}"; do
  397. DOCKER_BUILDX_ARGS+=(--tag "$r/${EMQX_BASE_DOCKER_TAG}:latest${SUFFIX}")
  398. echo "$r/${EMQX_BASE_DOCKER_TAG}:latest${SUFFIX}" >> ./.emqx_docker_image_tags
  399. DOCKER_BUILDX_ARGS+=(--tag "$r/${EMQX_BASE_DOCKER_TAG}:${VSN_MAJOR}.${VSN_MINOR}${SUFFIX}")
  400. echo "$r/${EMQX_BASE_DOCKER_TAG}:${VSN_MAJOR}.${VSN_MINOR}${SUFFIX}" >> ./.emqx_docker_image_tags
  401. DOCKER_BUILDX_ARGS+=(--tag "$r/${EMQX_BASE_DOCKER_TAG}:${VSN_MAJOR}.${VSN_MINOR}.${VSN_PATCH}${SUFFIX}")
  402. echo "$r/${EMQX_BASE_DOCKER_TAG}:${VSN_MAJOR}.${VSN_MINOR}.${VSN_PATCH}${SUFFIX}" >> ./.emqx_docker_image_tags
  403. done
  404. fi
  405. if [ "${DOCKER_PLATFORMS:-default}" != 'default' ]; then
  406. DOCKER_BUILDX_ARGS+=(--platform "${DOCKER_PLATFORMS}")
  407. fi
  408. if [ "${DOCKER_PUSH:-false}" = true ]; then
  409. DOCKER_BUILDX_ARGS+=(--push)
  410. fi
  411. if [ "${DOCKER_LOAD:-true}" = true ]; then
  412. DOCKER_BUILDX_ARGS+=(--load)
  413. fi
  414. if [ -d "${REBAR_GIT_CACHE_DIR:-}" ]; then
  415. cache_tar="$(pwd)/rebar-git-cache.tar"
  416. if [ ! -f "${cache_tar}" ]; then
  417. pushd "${REBAR_GIT_CACHE_DIR}" >/dev/null
  418. tar -cf "${cache_tar}" .
  419. popd >/dev/null
  420. fi
  421. fi
  422. if [ -n "${DEBUG:-}" ]; then
  423. DOCKER_BUILDX_ARGS+=(--build-arg DEBUG="${DEBUG}" --progress=plain)
  424. fi
  425. # shellcheck disable=SC2015
  426. [ -f ./.dockerignore ] && mv ./.dockerignore ./.dockerignore.bak || true
  427. trap docker_cleanup EXIT
  428. {
  429. echo '_build/'
  430. echo 'deps/'
  431. echo '*.lock'
  432. echo '_packages/'
  433. echo '.vs/'
  434. echo '.vscode/'
  435. echo 'lux_logs/'
  436. echo '_upgrade_base/'
  437. } >> ./.dockerignore
  438. echo "Docker buildx args: ${DOCKER_BUILDX_ARGS[*]}"
  439. docker buildx build "${DOCKER_BUILDX_ARGS[@]}" .
  440. }
  441. function join {
  442. local IFS="$1"
  443. shift
  444. echo "$*"
  445. }
  446. # used to control the Elixir Mix Release output
  447. # see docstring in `mix.exs`
  448. export_elixir_release_vars() {
  449. local profile="$1"
  450. case "$profile" in
  451. emqx|emqx-enterprise)
  452. export ELIXIR_MAKE_TAR=${ELIXIR_MAKE_TAR:-no}
  453. ;;
  454. emqx-pkg|emqx-enterprise-pkg)
  455. export ELIXIR_MAKE_TAR=${ELIXIR_MAKE_TAR:-yes}
  456. ;;
  457. *)
  458. echo Invalid profile "$profile"
  459. exit 1
  460. esac
  461. export MIX_ENV="$profile"
  462. }
  463. log "building artifact=$ARTIFACT for profile=$PROFILE"
  464. case "$ARTIFACT" in
  465. apps)
  466. if [ "${IS_ELIXIR:-}" = "yes" ]; then
  467. just_compile_elixir
  468. else
  469. just_compile
  470. fi
  471. ;;
  472. doc|docs)
  473. make_docs
  474. ;;
  475. rel)
  476. make_rel release
  477. ;;
  478. relup)
  479. make_relup
  480. ;;
  481. tgz)
  482. make_tgz
  483. ;;
  484. pkg)
  485. # this only affect build artifacts, such as schema doc
  486. export EMQX_ETC_DIR='/etc/emqx/'
  487. if [ -z "${PKGERDIR:-}" ]; then
  488. log "Skipped making deb/rpm package for $SYSTEM"
  489. exit 0
  490. fi
  491. export EMQX_REL_FORM="$PKGERDIR"
  492. if [ "${IS_ELIXIR:-}" = 'yes' ]; then
  493. make_elixir_rel
  494. else
  495. make_rel tar
  496. fi
  497. env EMQX_REL="$(pwd)" \
  498. EMQX_BUILD="${PROFILE}" \
  499. make -C "deploy/packages/${PKGERDIR}" clean
  500. env EMQX_REL="$(pwd)" \
  501. EMQX_BUILD="${PROFILE}" \
  502. make -C "deploy/packages/${PKGERDIR}"
  503. ;;
  504. docker)
  505. make_docker
  506. ;;
  507. elixir)
  508. make_elixir_rel
  509. ;;
  510. *)
  511. log "Unknown artifact $ARTIFACT"
  512. exit 1
  513. ;;
  514. esac