build 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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
  64. version="$(basename "$dir")"
  65. # skip current version
  66. if [ "$version" != "$PKG_VSN" ]; then
  67. releases+=( "$version" )
  68. fi
  69. done < <(find "_build/$PROFILE/rel/emqx/releases" -maxdepth 1 -name '*.*.*' -type d)
  70. fi
  71. if [ ${#releases[@]} -eq 0 ]; then
  72. log "No previous release found, relup ignored"
  73. return 0
  74. fi
  75. if [ ${#releases[@]} -gt 1 ]; then
  76. log "Found more than one previous versions in $releases_dir:"
  77. log "${releases[@]}"
  78. log "ERROR: So far we can not support multi base-version relup creation"
  79. return 1
  80. fi
  81. local base_version="${releases[0]}"
  82. # TODO: comma separate base-versions when supported
  83. ./rebar3 as "$PROFILE" relup --relname emqx --relvsn "${PKG_VSN}" --upfrom "$base_version"
  84. }
  85. ## make_zip turns .tar.gz into a .zip with a slightly different name.
  86. ## It assumes the .tar.gz has been built -- relies on Makefile dependency
  87. make_zip() {
  88. tard="/tmp/emqx_untar_${PKG_VSN}"
  89. rm -rf "${tard}"
  90. mkdir -p "${tard}/emqx"
  91. local relpath="_build/${PROFILE}/rel/emqx"
  92. local pkgpath="_packages/${PROFILE}"
  93. mkdir -p "${pkgpath}"
  94. local tarball="${relpath}/emqx-${PKG_VSN}.tar.gz"
  95. if [ ! -f "$tarball" ]; then
  96. log "ERROR: $tarball is not found"
  97. fi
  98. local zipball
  99. zipball="${pkgpath}/${PROFILE}-${SYSTEM}-${PKG_VSN}-$(uname -m).zip"
  100. tar zxf "${tarball}" -C "${tard}/emqx"
  101. (cd "${tard}" && zip -qr - emqx) > "${zipball}"
  102. }
  103. log "building artifact=$ARTIFACT for profile=$PROFILE"
  104. case "$ARTIFACT" in
  105. tar)
  106. make_tar
  107. ;;
  108. relup)
  109. make_relup
  110. ;;
  111. zip)
  112. make_zip
  113. ;;
  114. pkg)
  115. if [ -z "${PKGERDIR:-}" ]; then
  116. # zip should have been built as a Makefile dependency
  117. log "Skipped making deb/rpm package for $SYSTEM"
  118. exit 0
  119. fi
  120. # build the tar which is going to be used as the base of deb and rpm packages
  121. make_tar
  122. make -C "deploy/packages/${PKGERDIR}" clean
  123. EMQX_REL="$(pwd)" EMQX_BUILD="${PROFILE}" SYSTEM="${SYSTEM}" make -C "deploy/packages/${PKGERDIR}"
  124. ;;
  125. *)
  126. log "Unknown artifact $ARTIFACT"
  127. exit 1
  128. ;;
  129. esac