You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

release.sh 23 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. #!/usr/bin/env bash
  2. # Copyright © 2023 OpenIM. All rights reserved.
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. ###############################################################################
  16. # Most of the ::release:: namespace functions have been moved to
  17. # github.com/openim/release. Have a look in that repo and specifically in
  18. # lib/releaselib.sh for ::release::-related functionality.
  19. ###############################################################################
  20. # example: ./coscli cp/sync -r /home/off-line/docker-off-line/ cos://openim-1306374445/openim/image/amd/off-line/off-line/ -e cos.ap-guangzhou.myqcloud.com
  21. # https://cloud.tencent.com/document/product/436/71763
  22. # Tencent cos configuration
  23. readonly BUCKET="openim-1306374445"
  24. readonly REGION="ap-guangzhou"
  25. readonly COS_RELEASE_DIR="openim-release"
  26. # default cos command tool coscli or coscmd
  27. readonly COSTOOL="coscli"
  28. # This is where the final release artifacts are created locally
  29. readonly RELEASE_STAGE="${LOCAL_OUTPUT_ROOT}/release-stage"
  30. readonly RELEASE_TARS="${LOCAL_OUTPUT_ROOT}/release-tars"
  31. readonly RELEASE_IMAGES="${LOCAL_OUTPUT_ROOT}/release-images"
  32. # OpenIM github account info
  33. readonly OPENIM_GITHUB_ORG=OpenIMSDK
  34. readonly OPENIM_GITHUB_REPO=Open-IM-Server
  35. readonly ARTIFACT=openim.tar.gz
  36. readonly CHECKSUM=${ARTIFACT}.sha1sum
  37. OPENIM_BUILD_CONFORMANCE=${OPENIM_BUILD_CONFORMANCE:-y}
  38. OPENIM_BUILD_PULL_LATEST_IMAGES=${OPENIM_BUILD_PULL_LATEST_IMAGES:-y}
  39. # Validate a ci version
  40. #
  41. # Globals:
  42. # None
  43. # Arguments:
  44. # version
  45. # Returns:
  46. # If version is a valid ci version
  47. # Sets: (e.g. for '1.2.3-alpha.4.56+abcdef12345678')
  48. # VERSION_MAJOR (e.g. '1')
  49. # VERSION_MINOR (e.g. '2')
  50. # VERSION_PATCH (e.g. '3')
  51. # VERSION_PRERELEASE (e.g. 'alpha')
  52. # VERSION_PRERELEASE_REV (e.g. '4')
  53. # VERSION_BUILD_INFO (e.g. '.56+abcdef12345678')
  54. # VERSION_COMMITS (e.g. '56')
  55. function openim::release::parse_and_validate_ci_version() {
  56. # Accept things like "v1.2.3-alpha.4.56+abcdef12345678" or "v1.2.3-beta.4"
  57. local -r version_regex="^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)-([a-zA-Z0-9]+)\\.(0|[1-9][0-9]*)(\\.(0|[1-9][0-9]*)\\+[0-9a-f]{7,40})?$"
  58. local -r version="${1-}"
  59. [[ "${version}" =~ ${version_regex} ]] || {
  60. openim::log::error "Invalid ci version: '${version}', must match regex ${version_regex}"
  61. return 1
  62. }
  63. # The VERSION variables are used when this file is sourced, hence
  64. # the shellcheck SC2034 'appears unused' warning is to be ignored.
  65. # shellcheck disable=SC2034
  66. VERSION_MAJOR="${BASH_REMATCH[1]}"
  67. # shellcheck disable=SC2034
  68. VERSION_MINOR="${BASH_REMATCH[2]}"
  69. # shellcheck disable=SC2034
  70. VERSION_PATCH="${BASH_REMATCH[3]}"
  71. # shellcheck disable=SC2034
  72. VERSION_PRERELEASE="${BASH_REMATCH[4]}"
  73. # shellcheck disable=SC2034
  74. VERSION_PRERELEASE_REV="${BASH_REMATCH[5]}"
  75. # shellcheck disable=SC2034
  76. VERSION_BUILD_INFO="${BASH_REMATCH[6]}"
  77. # shellcheck disable=SC2034
  78. VERSION_COMMITS="${BASH_REMATCH[7]}"
  79. }
  80. # ---------------------------------------------------------------------------
  81. # Build final release artifacts
  82. function openim::release::clean_cruft() {
  83. # Clean out cruft
  84. find "${RELEASE_STAGE}" -name '*~' -exec rm {} \;
  85. find "${RELEASE_STAGE}" -name '#*#' -exec rm {} \;
  86. find "${RELEASE_STAGE}" -name '.DS*' -exec rm {} \;
  87. }
  88. function openim::release::package_tarballs() {
  89. # Clean out any old releases
  90. rm -rf "${RELEASE_STAGE}" "${RELEASE_TARS}" "${RELEASE_IMAGES}"
  91. mkdir -p "${RELEASE_TARS}"
  92. openim::release::package_src_tarball &
  93. openim::release::package_client_tarballs &
  94. openim::release::package_iam_manifests_tarball &
  95. openim::release::package_server_tarballs &
  96. openim::util::wait-for-jobs || { openim::log::error "previous tarball phase failed"; return 1; }
  97. openim::release::package_final_tarball & # _final depends on some of the previous phases
  98. openim::util::wait-for-jobs || { openim::log::error "previous tarball phase failed"; return 1; }
  99. }
  100. function openim::release::updload_tarballs() {
  101. openim::log::info "upload ${RELEASE_TARS}/* to cos bucket ${BUCKET}."
  102. for file in $(ls ${RELEASE_TARS}/*)
  103. do
  104. if [ "${COSTOOL}" == "coscli" ];then
  105. coscli cp "${file}" "cos://${BUCKET}/${COS_RELEASE_DIR}/${OPENIM_GIT_VERSION}/${file##*/}"
  106. coscli cp "${file}" "cos://${BUCKET}/${COS_RELEASE_DIR}/latest/${file##*/}"
  107. else
  108. coscmd upload "${file}" "${COS_RELEASE_DIR}/${OPENIM_GIT_VERSION}/"
  109. coscmd upload "${file}" "${COS_RELEASE_DIR}/latest/"
  110. fi
  111. done
  112. }
  113. # Package the source code we built, for compliance/licensing/audit/yadda.
  114. function openim::release::package_src_tarball() {
  115. local -r src_tarball="${RELEASE_TARS}/openim-src.tar.gz"
  116. openim::log::status "Building tarball: src"
  117. if [[ "${OPENIM_GIT_TREE_STATE-}" = 'clean' ]]; then
  118. git archive -o "${src_tarball}" HEAD
  119. else
  120. find "${OPENIM_ROOT}" -mindepth 1 -maxdepth 1 \
  121. ! \( \
  122. \( -path "${OPENIM_ROOT}"/_\* -o \
  123. -path "${OPENIM_ROOT}"/.git\* -o \
  124. -path "${OPENIM_ROOT}"/.github\* -o \
  125. -path "${OPENIM_ROOT}"/.gitignore\* -o \
  126. -path "${OPENIM_ROOT}"/.gsemver.yml\* -o \
  127. -path "${OPENIM_ROOT}"/.config\* -o \
  128. -path "${OPENIM_ROOT}"/.chglog\* -o \
  129. -path "${OPENIM_ROOT}"/.gitlint -o \
  130. -path "${OPENIM_ROOT}"/.golangci.yml -o \
  131. -path "${OPENIM_ROOT}"/.goreleaser.yml -o \
  132. -path "${OPENIM_ROOT}"/.note.md -o \
  133. -path "${OPENIM_ROOT}"/.todo.md \
  134. \) -prune \
  135. \) -print0 \
  136. | "${TAR}" czf "${src_tarball}" --transform "s|${OPENIM_ROOT#/*}|openim|" --null -T -
  137. fi
  138. }
  139. # Package up all of the server binaries
  140. function openim::release::package_server_tarballs() {
  141. # Find all of the built client binaries
  142. local long_platforms=("${LOCAL_OUTPUT_BINPATH}"/*/*)
  143. if [[ -n ${OPENIM_BUILD_PLATFORMS-} ]]; then
  144. read -ra long_platforms <<< "${OPENIM_BUILD_PLATFORMS}"
  145. fi
  146. for platform_long in "${long_platforms[@]}"; do
  147. local platform
  148. local platform_tag
  149. platform=${platform_long##${LOCAL_OUTPUT_BINPATH}/} # Strip LOCAL_OUTPUT_BINPATH
  150. platform_tag=${platform/\//-} # Replace a "/" for a "-"
  151. openim::log::status "Starting tarball: server $platform_tag"
  152. (
  153. local release_stage="${RELEASE_STAGE}/server/${platform_tag}/openim"
  154. rm -rf "${release_stage}"
  155. mkdir -p "${release_stage}/server/bin"
  156. local server_bins=("${OPENIM_SERVER_BINARIES[@]}")
  157. # This fancy expression will expand to prepend a path
  158. # (${LOCAL_OUTPUT_BINPATH}/${platform}/) to every item in the
  159. # server_bins array.
  160. cp "${server_bins[@]/#/${LOCAL_OUTPUT_BINPATH}/${platform}/}" \
  161. "${release_stage}/server/bin/"
  162. openim::release::clean_cruft
  163. local package_name="${RELEASE_TARS}/openim-server-${platform_tag}.tar.gz"
  164. openim::release::create_tarball "${package_name}" "${release_stage}/.."
  165. ) &
  166. done
  167. openim::log::status "Waiting on tarballs"
  168. openim::util::wait-for-jobs || { openim::log::error "server tarball creation failed"; exit 1; }
  169. }
  170. # Package up all of the cross compiled clients. Over time this should grow into
  171. # a full SDK
  172. function openim::release::package_client_tarballs() {
  173. # Find all of the built client binaries
  174. local long_platforms=("${LOCAL_OUTPUT_BINPATH}"/*/*)
  175. if [[ -n ${OPENIM_BUILD_PLATFORMS-} ]]; then
  176. read -ra long_platforms <<< "${OPENIM_BUILD_PLATFORMS}"
  177. fi
  178. for platform_long in "${long_platforms[@]}"; do
  179. local platform
  180. local platform_tag
  181. platform=${platform_long##${LOCAL_OUTPUT_BINPATH}/} # Strip LOCAL_OUTPUT_BINPATH
  182. platform_tag=${platform/\//-} # Replace a "/" for a "-"
  183. openim::log::status "Starting tarball: client $platform_tag"
  184. (
  185. local release_stage="${RELEASE_STAGE}/client/${platform_tag}/openim"
  186. rm -rf "${release_stage}"
  187. mkdir -p "${release_stage}/client/bin"
  188. local client_bins=("${OPENIM_CLIENT_BINARIES[@]}")
  189. # This fancy expression will expand to prepend a path
  190. # (${LOCAL_OUTPUT_BINPATH}/${platform}/) to every item in the
  191. # client_bins array.
  192. cp "${client_bins[@]/#/${LOCAL_OUTPUT_BINPATH}/${platform}/}" \
  193. "${release_stage}/client/bin/"
  194. openim::release::clean_cruft
  195. local package_name="${RELEASE_TARS}/openim-client-${platform_tag}.tar.gz"
  196. openim::release::create_tarball "${package_name}" "${release_stage}/.."
  197. ) &
  198. done
  199. openim::log::status "Waiting on tarballs"
  200. openim::util::wait-for-jobs || { openim::log::error "client tarball creation failed"; exit 1; }
  201. }
  202. # Package up all of the server binaries in docker images
  203. function openim::release::build_server_images() {
  204. # Clean out any old images
  205. rm -rf "${RELEASE_IMAGES}"
  206. local platform
  207. for platform in "${OPENIM_SERVER_PLATFORMS[@]}"; do
  208. local platform_tag
  209. local arch
  210. platform_tag=${platform/\//-} # Replace a "/" for a "-"
  211. arch=$(basename "${platform}")
  212. openim::log::status "Building images: $platform_tag"
  213. local release_stage
  214. release_stage="${RELEASE_STAGE}/server/${platform_tag}/openim"
  215. rm -rf "${release_stage}"
  216. mkdir -p "${release_stage}/server/bin"
  217. # This fancy expression will expand to prepend a path
  218. # (${LOCAL_OUTPUT_BINPATH}/${platform}/) to every item in the
  219. # OPENIM_SERVER_IMAGE_BINARIES array.
  220. cp "${OPENIM_SERVER_IMAGE_BINARIES[@]/#/${LOCAL_OUTPUT_BINPATH}/${platform}/}" \
  221. "${release_stage}/server/bin/"
  222. openim::release::create_docker_images_for_server "${release_stage}/server/bin" "${arch}"
  223. done
  224. }
  225. function openim::release::md5() {
  226. if which md5 >/dev/null 2>&1; then
  227. md5 -q "$1"
  228. else
  229. md5sum "$1" | awk '{ print $1 }'
  230. fi
  231. }
  232. function openim::release::sha1() {
  233. if which sha1sum >/dev/null 2>&1; then
  234. sha1sum "$1" | awk '{ print $1 }'
  235. else
  236. shasum -a1 "$1" | awk '{ print $1 }'
  237. fi
  238. }
  239. function openim::release::sha256() {
  240. if which sha256sum >/dev/null 2>&1; then
  241. sha256sum "$1" | awk '{ print $1 }'
  242. else
  243. shasum -a256 "$1" | awk '{ print $1 }'
  244. fi
  245. }
  246. function openim::release::build_conformance_image() {
  247. local -r arch="$1"
  248. local -r registry="$2"
  249. local -r version="$3"
  250. local -r save_dir="${4-}"
  251. openim::log::status "Building conformance image for arch: ${arch}"
  252. ARCH="${arch}" REGISTRY="${registry}" VERSION="${version}" \
  253. make -C cluster/images/conformance/ build >/dev/null
  254. local conformance_tag
  255. conformance_tag="${registry}/conformance-${arch}:${version}"
  256. if [[ -n "${save_dir}" ]]; then
  257. "${DOCKER[@]}" save "${conformance_tag}" > "${save_dir}/conformance-${arch}.tar"
  258. fi
  259. openim::log::status "Deleting conformance image ${conformance_tag}"
  260. "${DOCKER[@]}" rmi "${conformance_tag}" &>/dev/null || true
  261. }
  262. # This builds all the release docker images (One docker image per binary)
  263. # Args:
  264. # $1 - binary_dir, the directory to save the tared images to.
  265. # $2 - arch, architecture for which we are building docker images.
  266. function openim::release::create_docker_images_for_server() {
  267. # Create a sub-shell so that we don't pollute the outer environment
  268. (
  269. local binary_dir
  270. local arch
  271. local binaries
  272. local images_dir
  273. binary_dir="$1"
  274. arch="$2"
  275. binaries=$(openim::build::get_docker_wrapped_binaries "${arch}")
  276. images_dir="${RELEASE_IMAGES}/${arch}"
  277. mkdir -p "${images_dir}"
  278. # k8s.gcr.io is the constant tag in the docker archives, this is also the default for config scripts in GKE.
  279. # We can use OPENIM_DOCKER_REGISTRY to include and extra registry in the docker archive.
  280. # If we use OPENIM_DOCKER_REGISTRY="k8s.gcr.io", then the extra tag (same) is ignored, see release_docker_image_tag below.
  281. local -r docker_registry="k8s.gcr.io"
  282. # Docker tags cannot contain '+'
  283. local docker_tag="${OPENIM_GIT_VERSION/+/_}"
  284. if [[ -z "${docker_tag}" ]]; then
  285. openim::log::error "git version information missing; cannot create Docker tag"
  286. return 1
  287. fi
  288. # provide `--pull` argument to `docker build` if `OPENIM_BUILD_PULL_LATEST_IMAGES`
  289. # is set to y or Y; otherwise try to build the image without forcefully
  290. # pulling the latest base image.
  291. local docker_build_opts
  292. docker_build_opts=
  293. if [[ "${OPENIM_BUILD_PULL_LATEST_IMAGES}" =~ [yY] ]]; then
  294. docker_build_opts='--pull'
  295. fi
  296. for wrappable in $binaries; do
  297. local binary_name=${wrappable%%,*}
  298. local base_image=${wrappable##*,}
  299. local binary_file_path="${binary_dir}/${binary_name}"
  300. local docker_build_path="${binary_file_path}.dockerbuild"
  301. local docker_file_path="${docker_build_path}/Dockerfile"
  302. local docker_image_tag="${docker_registry}/${binary_name}-${arch}:${docker_tag}"
  303. openim::log::status "Starting docker build for image: ${binary_name}-${arch}"
  304. (
  305. rm -rf "${docker_build_path}"
  306. mkdir -p "${docker_build_path}"
  307. ln "${binary_file_path}" "${docker_build_path}/${binary_name}"
  308. ln "${OPENIM_ROOT}/build/nsswitch.conf" "${docker_build_path}/nsswitch.conf"
  309. chmod 0644 "${docker_build_path}/nsswitch.conf"
  310. cat <<EOF > "${docker_file_path}"
  311. FROM ${base_image}
  312. COPY ${binary_name} /usr/local/bin/${binary_name}
  313. EOF
  314. # ensure /etc/nsswitch.conf exists so go's resolver respects /etc/hosts
  315. if [[ "${base_image}" =~ busybox ]]; then
  316. echo "COPY nsswitch.conf /etc/" >> "${docker_file_path}"
  317. fi
  318. "${DOCKER[@]}" build ${docker_build_opts:+"${docker_build_opts}"} -q -t "${docker_image_tag}" "${docker_build_path}" >/dev/null
  319. # If we are building an official/alpha/beta release we want to keep
  320. # docker images and tag them appropriately.
  321. local -r release_docker_image_tag="${OPENIM_DOCKER_REGISTRY-$docker_registry}/${binary_name}-${arch}:${OPENIM_DOCKER_IMAGE_TAG-$docker_tag}"
  322. if [[ "${release_docker_image_tag}" != "${docker_image_tag}" ]]; then
  323. openim::log::status "Tagging docker image ${docker_image_tag} as ${release_docker_image_tag}"
  324. "${DOCKER[@]}" rmi "${release_docker_image_tag}" 2>/dev/null || true
  325. "${DOCKER[@]}" tag "${docker_image_tag}" "${release_docker_image_tag}" 2>/dev/null
  326. fi
  327. "${DOCKER[@]}" save -o "${binary_file_path}.tar" "${docker_image_tag}" "${release_docker_image_tag}"
  328. echo "${docker_tag}" > "${binary_file_path}.docker_tag"
  329. rm -rf "${docker_build_path}"
  330. ln "${binary_file_path}.tar" "${images_dir}/"
  331. openim::log::status "Deleting docker image ${docker_image_tag}"
  332. "${DOCKER[@]}" rmi "${docker_image_tag}" &>/dev/null || true
  333. ) &
  334. done
  335. if [[ "${OPENIM_BUILD_CONFORMANCE}" =~ [yY] ]]; then
  336. openim::release::build_conformance_image "${arch}" "${docker_registry}" \
  337. "${docker_tag}" "${images_dir}" &
  338. fi
  339. openim::util::wait-for-jobs || { openim::log::error "previous Docker build failed"; return 1; }
  340. openim::log::status "Docker builds done"
  341. )
  342. }
  343. # This will pack openim-system manifests files for distros such as COS.
  344. function openim::release::package_iam_manifests_tarball() {
  345. openim::log::status "Building tarball: manifests"
  346. local src_dir="${OPENIM_ROOT}/deployments"
  347. local release_stage="${RELEASE_STAGE}/manifests/openim"
  348. rm -rf "${release_stage}"
  349. local dst_dir="${release_stage}"
  350. mkdir -p "${dst_dir}"
  351. cp -r ${src_dir}/* "${dst_dir}"
  352. #cp "${src_dir}/openim-apiserver.yaml" "${dst_dir}"
  353. #cp "${src_dir}/openim-authz-server.yaml" "${dst_dir}"
  354. #cp "${src_dir}/openim-pump.yaml" "${dst_dir}"
  355. #cp "${src_dir}/openim-watcher.yaml" "${dst_dir}"
  356. #cp "${OPENIM_ROOT}/cluster/gce/gci/health-monitor.sh" "${dst_dir}/health-monitor.sh"
  357. openim::release::clean_cruft
  358. local package_name="${RELEASE_TARS}/openim-manifests.tar.gz"
  359. openim::release::create_tarball "${package_name}" "${release_stage}/.."
  360. }
  361. # This is all the platform-independent stuff you need to run/install openim.
  362. # Arch-specific binaries will need to be downloaded separately (possibly by
  363. # using the bundled cluster/get-openim-binaries.sh script).
  364. # Included in this tarball:
  365. # - Cluster spin up/down scripts and configs for various cloud providers
  366. # - Tarballs for manifest configs that are ready to be uploaded
  367. # - Examples (which may or may not still work)
  368. # - The remnants of the docs/ directory
  369. function openim::release::package_final_tarball() {
  370. openim::log::status "Building tarball: final"
  371. # This isn't a "full" tarball anymore, but the release lib still expects
  372. # artifacts under "full/openim/"
  373. local release_stage="${RELEASE_STAGE}/full/openim"
  374. rm -rf "${release_stage}"
  375. mkdir -p "${release_stage}"
  376. mkdir -p "${release_stage}/client"
  377. cat <<EOF > "${release_stage}/client/README"
  378. Client binaries are no longer included in the OpenIM final tarball.
  379. Run release/get-openim-binaries.sh to download client and server binaries.
  380. EOF
  381. # We want everything in /scripts.
  382. mkdir -p "${release_stage}/release"
  383. cp -R "${OPENIM_ROOT}/scripts/release" "${release_stage}/"
  384. cat <<EOF > "${release_stage}/release/get-openim-binaries.sh"
  385. #!/usr/bin/env bash
  386. # Copyright 2020 Lingfei Kong <colin404@foxmail.com>. All rights reserved.
  387. # Use of this source code is governed by a MIT style
  388. # license that can be found in the LICENSE file.
  389. # This file download openim client and server binaries from tencent cos bucket.
  390. os=linux arch=amd64 version=${OPENIM_GIT_VERSION} && wget https://${BUCKET}.cos.${REGION}.myqcloud.com/${COS_RELEASE_DIR}/\$version/{openim-client-\$os-\$arch.tar.gz,openim-server-\$os-\$arch.tar.gz}
  391. EOF
  392. chmod +x ${release_stage}/release/get-openim-binaries.sh
  393. mkdir -p "${release_stage}/server"
  394. cp "${RELEASE_TARS}/openim-manifests.tar.gz" "${release_stage}/server/"
  395. cat <<EOF > "${release_stage}/server/README"
  396. Server binary tarballs are no longer included in the OpenIM final tarball.
  397. Run release/get-openim-binaries.sh to download client and server binaries.
  398. EOF
  399. # Include hack/lib as a dependency for the cluster/ scripts
  400. #mkdir -p "${release_stage}/hack"
  401. #cp -R "${OPENIM_ROOT}/hack/lib" "${release_stage}/hack/"
  402. cp -R ${OPENIM_ROOT}/{docs,configs,scripts,deployments,init,README.md,LICENSE} "${release_stage}/"
  403. echo "${OPENIM_GIT_VERSION}" > "${release_stage}/version"
  404. openim::release::clean_cruft
  405. local package_name="${RELEASE_TARS}/${ARTIFACT}"
  406. openim::release::create_tarball "${package_name}" "${release_stage}/.."
  407. }
  408. # Build a release tarball. $1 is the output tar name. $2 is the base directory
  409. # of the files to be packaged. This assumes that ${2}/iamis what is
  410. # being packaged.
  411. function openim::release::create_tarball() {
  412. openim::build::ensure_tar
  413. local tarfile=$1
  414. local stagingdir=$2
  415. "${TAR}" czf "${tarfile}" -C "${stagingdir}" openim --owner=0 --group=0
  416. }
  417. function openim::release::install_github_release(){
  418. GO111MODULE=on go install github.com/github-release/github-release@latest
  419. }
  420. # Require the following tools:
  421. # - github-release
  422. # - gsemver
  423. # - git-chglog
  424. # - coscmd or coscli
  425. function openim::release::verify_prereqs(){
  426. if [ -z "$(which github-release 2>/dev/null)" ]; then
  427. openim::log::info "'github-release' tool not installed, try to install it."
  428. if ! openim::release::install_github_release; then
  429. openim::log::error "failed to install 'github-release'"
  430. return 1
  431. fi
  432. fi
  433. if [ -z "$(which git-chglog 2>/dev/null)" ]; then
  434. openim::log::info "'git-chglog' tool not installed, try to install it."
  435. if ! go install github.com/git-chglog/git-chglog/cmd/git-chglog@latest &>/dev/null; then
  436. openim::log::error "failed to install 'git-chglog'"
  437. return 1
  438. fi
  439. fi
  440. if [ -z "$(which gsemver 2>/dev/null)" ]; then
  441. openim::log::info "'gsemver' tool not installed, try to install it."
  442. if ! go install github.com/arnaud-deprez/gsemver@latest &>/dev/null; then
  443. openim::log::error "failed to install 'gsemver'"
  444. return 1
  445. fi
  446. fi
  447. if [ -z "$(which ${COSTOOL} 2>/dev/null)" ]; then
  448. openim::log::info "${COSTOOL} tool not installed, try to install it."
  449. if ! make -C "${OPENIM_ROOT}" tools.install.${COSTOOL}; then
  450. openim::log::error "failed to install ${COSTOOL}"
  451. return 1
  452. fi
  453. fi
  454. if [ -z "${TENCENT_SECRET_ID}" -o -z "${TENCENT_SECRET_KEY}" ];then
  455. openim::log::error "can not find env: TENCENT_SECRET_ID and TENCENT_SECRET_KEY"
  456. return 1
  457. fi
  458. if [ "${COSTOOL}" == "coscli" ];then
  459. if [ ! -f "${HOME}/.cos.yaml" ];then
  460. cat << EOF > "${HOME}/.cos.yaml"
  461. cos:
  462. base:
  463. secretid: ${TENCENT_SECRET_ID}
  464. secretkey: ${TENCENT_SECRET_KEY}
  465. sessiontoken: ""
  466. buckets:
  467. - name: ${BUCKET}
  468. alias: ${BUCKET}
  469. region: ${REGION}
  470. EOF
  471. fi
  472. else
  473. if [ ! -f "${HOME}/.cos.conf" ];then
  474. cat << EOF > "${HOME}/.cos.conf"
  475. [common]
  476. secret_id = ${TENCENT_SECRET_ID}
  477. secret_key = ${TENCENT_SECRET_KEY}
  478. bucket = ${BUCKET}
  479. region =${REGION}
  480. max_thread = 5
  481. part_size = 1
  482. schema = https
  483. EOF
  484. fi
  485. fi
  486. }
  487. # Create a github release with specified tarballs.
  488. # NOTICE: Must export 'GITHUB_TOKEN' env in the shell, details:
  489. # https://github.com/github-release/github-release
  490. function openim::release::github_release() {
  491. # create a github release
  492. openim::log::info "create a new github release with tag ${OPENIM_GIT_VERSION}"
  493. github-release release \
  494. --user ${OPENIM_GITHUB_ORG} \
  495. --repo ${OPENIM_GITHUB_REPO} \
  496. --tag ${OPENIM_GIT_VERSION} \
  497. --description "" \
  498. --pre-release
  499. # update openim tarballs
  500. openim::log::info "upload ${ARTIFACT} to release ${OPENIM_GIT_VERSION}"
  501. github-release upload \
  502. --user ${OPENIM_GITHUB_ORG} \
  503. --repo ${OPENIM_GITHUB_REPO} \
  504. --tag ${OPENIM_GIT_VERSION} \
  505. --name ${ARTIFACT} \
  506. --file ${RELEASE_TARS}/${ARTIFACT}
  507. openim::log::info "upload openim-src.tar.gz to release ${OPENIM_GIT_VERSION}"
  508. github-release upload \
  509. --user ${OPENIM_GITHUB_ORG} \
  510. --repo ${OPENIM_GITHUB_REPO} \
  511. --tag ${OPENIM_GIT_VERSION} \
  512. --name "openim-src.tar.gz" \
  513. --file ${RELEASE_TARS}/openim-src.tar.gz
  514. }
  515. function openim::release::generate_changelog() {
  516. openim::log::info "generate CHANGELOG-${OPENIM_GIT_VERSION#v}.md and commit it"
  517. git-chglog ${OPENIM_GIT_VERSION} > ${OPENIM_ROOT}/CHANGELOG/CHANGELOG-${OPENIM_GIT_VERSION#v}.md
  518. set +o errexit
  519. git add ${OPENIM_ROOT}/CHANGELOG/CHANGELOG-${OPENIM_GIT_VERSION#v}.md
  520. git commit -a -m "docs(changelog): add CHANGELOG-${OPENIM_GIT_VERSION#v}.md"
  521. git push -f origin master # 最后将 CHANGELOG 也 push 上去
  522. }