build 3.9 KB

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