build 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #!/bin/bash
  2. # This script helps to build release artifacts.
  3. # arg1: profile, e.g. emqx | emqx-edge | emqx-pkg | emqx-edge-pkg
  4. # arg2: artifact, e.g. tar | relup | zip | pkg
  5. set -euo pipefail
  6. PROFILE="$1"
  7. ARTIFACT="$2"
  8. # ensure dir
  9. cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")"
  10. case "$PROFILE" in
  11. emqx-edge*)
  12. export EMQX_DESC="EMQ X Edge"
  13. ;;
  14. emqx*)
  15. export EMQX_DESC="EMQ X Broker"
  16. ;;
  17. *)
  18. echo "Unknown profile $PROFILE"
  19. exit 1
  20. ;;
  21. esac
  22. PKG_VSN="${PKG_VSN:-$(./pkg-vsn.sh)}"
  23. export PKG_VSN
  24. if [ "$(uname -s)" = 'Darwin' ]; then
  25. SYSTEM=macos
  26. elif [ "$(uname -s)" = 'Linux' ]; then
  27. if grep -q -i 'centos' /etc/*-release; then
  28. DIST='centos'
  29. VERSION_ID="$(rpm --eval '%{centos_ver}')"
  30. else
  31. DIST="$(sed -n '/^ID=/p' /etc/os-release | sed -r 's/ID=(.*)/\1/g' | sed 's/"//g')"
  32. VERSION_ID="$(sed -n '/^VERSION_ID=/p' /etc/os-release | sed -r 's/VERSION_ID=(.*)/\1/g' | sed 's/"//g')"
  33. fi
  34. SYSTEM="$(echo "${DIST}${VERSION_ID}" | sed -r 's/([a-zA-Z]*)-.*/\1/g')"
  35. fi
  36. ##
  37. ## Support RPM and Debian based linux systems
  38. ##
  39. if [ "$(uname -s)" = 'Linux' ]; then
  40. case "${DIST:-}" in
  41. ubuntu|debian|raspbian)
  42. PKGERDIR='deb'
  43. ;;
  44. *)
  45. PKGERDIR='rpm'
  46. ;;
  47. esac
  48. fi
  49. log() {
  50. local msg="$1"
  51. # rebar3 prints ===>, so we print ===<
  52. echo "===< $msg"
  53. }
  54. make_tar() {
  55. ./rebar3 as "$PROFILE" tar
  56. }
  57. ## unzip previous version .zip files to _build/$PROFILE/rel/emqx/releases before making relup
  58. make_relup() {
  59. local releases_dir="_build/$PROFILE/rel/emqx/releases"
  60. local releases=()
  61. if [ -d "$releases_dir" ]; then
  62. while read -r dir; do
  63. local version="$(basename "$dir")"
  64. # skip current version
  65. if [ "$version" != "$PKG_VSN" ]; then
  66. releases+=( "$version" )
  67. fi
  68. done < <(find "_build/$PROFILE/rel/emqx/releases" -maxdepth 1 -name '*.*.*' -type d)
  69. fi
  70. if [ ${#releases[@]} -eq 0 ]; then
  71. log "No previous release found, relup ignored"
  72. return 0
  73. fi
  74. if [ ${#releases[@]} -gt 1 ]; then
  75. log "Found more than one previous versions in $releases_dir:"
  76. log "${releases[@]}"
  77. log "ERROR: So far we can not support multi base-version relup creation"
  78. return 1
  79. fi
  80. local base_version="${releases[0]}"
  81. # TODO: comma separate base-versions when supported
  82. ./rebar3 as "$PROFILE" relup --relname emqx --relvsn "${PKG_VSN}" --upfrom "$base_version"
  83. }
  84. ## make_zip turns .tar.gz into a .zip with a slightly different name.
  85. ## It assumes the .tar.gz has been built -- relies on Makefile dependency
  86. make_zip() {
  87. tard="/tmp/emqx_untar_${PKG_VSN}"
  88. rm -rf "${tard}"
  89. mkdir -p "${tard}/emqx"
  90. local relpath="_build/${PROFILE}/rel/emqx"
  91. local pkgpath="_packages/${PROFILE}"
  92. mkdir -p "${pkgpath}"
  93. local tarball="${relpath}/emqx-${PKG_VSN}.tar.gz"
  94. if [ ! -f "$tarball" ]; then
  95. log "ERROR: $tarball is not found"
  96. fi
  97. local zipball
  98. zipball="${pkgpath}/${PROFILE}-${SYSTEM}-${PKG_VSN}-$(uname -m).zip"
  99. tar zxf "${tarball}" -C "${tard}/emqx"
  100. (cd "${tard}" && zip -qr - emqx) > "${zipball}"
  101. }
  102. log "building artifact=$ARTIFACT for profile=$PROFILE"
  103. case "$ARTIFACT" in
  104. tar)
  105. make_tar
  106. ;;
  107. relup)
  108. make_relup
  109. ;;
  110. zip)
  111. make_zip
  112. ;;
  113. pkg)
  114. if [ -z "${PKGERDIR:-}" ]; then
  115. # zip should have been built as a Makefile dependency
  116. log "Skipped making deb/rpm package for $SYSTEM"
  117. exit 0
  118. fi
  119. # build the tar which is going to be used as the base of deb and rpm packages
  120. make_tar
  121. make -C "deploy/packages/${PKGERDIR}" clean
  122. EMQX_REL="$(pwd)" EMQX_BUILD="${PROFILE}" SYSTEM="${SYSTEM}" make -C "deploy/packages/${PKGERDIR}"
  123. ;;
  124. *)
  125. log "Unknown artifact $ARTIFACT"
  126. exit 1
  127. ;;
  128. esac